【PyTorch][chapter 17][李宏毅深度学习]【无监督学习][ Auto-encoder]

前言:

         本篇重点介绍AE(Auto-Encoder) 自编码器。这是深度学习的一个核心模型.

    自编码网络是一种基于无监督学习方法的生成类模型,自编码最大特征输出等于输入

    Yann LeCun&Bengio, Hinton 对无监督学习的看法.


目录:

  1.      AE 模型原理
  2.      De-noising auto-encoder
  3.     文字检索应用例子(Text  Retrieval)
  4.     影像相似度比较例子 Similar Image Search
  5.     CNN-AE
  6.     Pytorch 例子
  7.     堆叠自编码网络(Stacked Autoencoders)


一  AE模型原理

     1.1  模型简介

 

     AE 编码集主要由两个部分组成:

    编码器(Encoder): 输入 向量 x,           输出向量 O

     解码器(Decoder):  输入向量 O,           输出向量 \hat{x}

     模型跟DNN 基本一致

    1.2  损失函数

            使用均方差作为损失函数

             loss = mse_loss(\hat{x}, x)

   1.3  手写数字识别效果图

    在手写数字识别中,相对t-SNE,PCA等模型,AE 有更好的效果.  


二  De-noising auto-encoder

         Vincent在2008年的论文中提出了AutoEncoder的改良版——DAE

 "Extracting and Composing Robust Features","提取,编码出具有鲁棒性的特征"

  人类具有认知被阻挡的破损图像能力,此源于我们高等的联想记忆感受机能。

我们能以多种形式去记忆(比如图像、声音,甚至如上图的词根记忆法),所以即便是数据破损丢失,我们也能回想起来,所以在输入中即使加入了噪声也不会影响模型的性能,只会使得鲁棒性更强.

2.1 流程:

     输入:

              向量x

      step1: 增加噪声:

          方案1:

          以一定概率分布(通常使用二项分布)去擦除原始x矩阵,即每个值都随机置0.

          x^{'}=\left\{\begin{matrix} 0, if\, \, rand<p \\ \, \, \, \, \, \, \, \, \, x, if\, \, rand>1-p \end{matrix}\right.

          方案2:

                以一定的概率(高斯分布)产生噪声n,针对输入向量x,得到x^{'}=x+n

     step2: 

             x^{'} 经过AE 编码器,重构出\hat{x}

     2.2 损失函数

                  loss = mse_loss(\hat{x}, x)


三 文字检索应用例子(Text  Retrieval)

    

   3.1 传统方案  

     最初的Bag-of-words ,也叫做“词袋”,在信息检索中,Bag-of-words model假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现。

     例子:

     应用于文本的BoW简单实例
    文章1    John likes to watch movies. Mary likes too.
    文章2    John also likes to watch football games.

  step1 建立词典

1

2

3

4

5

6

7

8

9

10

John

likes

to

watch

movies

also

football

games

mary

too

step2 文章词向量表示

文章1:向量a= [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
文章2:文章b = [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

step3  文章相似度

       cos c= \frac{<a,b>}{||a||\, *\, \, ||b||}

   3.2 Auto-Encoder 方案

     文章1:  先通过AE 编码器进行降维得到向量a

     文章2:  先通过AE 编码器进行降维得到向量b

      然后通过 a,b 计算向量之间的余弦相似度


四 影像相似度比较例子 Similar Image Search

    4.1 传统方案

     传统的图像算法: 一般用 感知哈希算法(Perceptual Hash,PHash) 深度学习里面人脸识别算法,提取特征后然后算相似度

   4.2  Auto-Encoder

 step1: 通过AE 编码器对输入向量x 进行降维,得到code1,code2

 step2:  计算code1,code2 之间的余弦相似度


五   CNN-AE

       AE 编码器除了使用DNN模型外,还可以使用CNN 模型.如下图所示。

相对CNN 主要区别是两个模块:

 Deconvolution 反卷积

 Unpooling 反池化

  5.1 Unpooling 反池化

    是MaxPooling 的反过程

  MaxPooling:

Unpooling

5.2 Deconvolution 反卷积

   卷积操作:

        图像A 经过卷积核,得到特征图B

        原图像尺寸为h ,卷积核 k, padding=p , stride =s ,

       输出特征图尺寸:  o=\frac{h+2p-k}{s}+1

      反卷积:

         已知特征图尺寸o,  使用相同的卷积核: k,p,s

         输出原图像尺寸: h= (o-1)*s+k-2p

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 20 14:18:59 2024@author: chengxf2
"""import torchdef conv2d():'''·· 输入:batch_size,一个batch中样本的个数 3channels,通道数,RGB 图为3,灰度图为1height, 图片的高 5width_1, 图片的宽 5卷积核:channels,通道数,和上面保持一致,也就是当前层的深度 1output ,输出的深度 4【需要4个filter】kernel_size: 卷积核大小stride: 步长padding:填充系数'''x = torch.randn(3,1,24,24)conv = torch.nn.Conv2d(in_channels=1, out_channels=4, kernel_size=2, stride=2,padding=1) res = conv(x)print("\n 卷积输出",res.shape)return resdef  deConv(x):'''in_channels(int):输入张量的通道数out_channels(int):输出张量的通道数kernel_size(int or tuple):卷积核大小stride(int or tuple,optional):卷积步长,决定上采样的倍数padding(int or tuple, optional):对输入图像进行padding,输入图像尺寸增加2*paddingoutput_padding(int or tuple, optional):对输出图像进行padding,输出图像尺寸增加paddinggroups:分组卷积(必须能够整除in_channels和out_channels)bias:是否加上偏置dilation:卷积核之间的采样距离(即空洞卷积)padding_mode(str):padding的类型另外,对于可以传入tuple的参数,tuple[0]是在height维度上,tuple[1]是在width维度上'''conv = torch.nn.ConvTranspose2d(in_channels=4, out_channels=1, kernel_size=2,stride=2,padding=1)out =conv(x)print("\n 反卷积 输出",out.shape)if __name__ == "__main__":res = conv2d()deConv(res)


六  AE  PyTorch 例子

  两个模块 

  main.py

  autoEncoder.py

5.1 autoEncoder.py

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 20 14:44:21 2024@author: chengxf2
"""import torch
import torch.nn  as nnclass AE(nn.Module):def __init__(self):super(AE,self).__init__()#编码器self.encoder = nn.Sequential(nn.Linear(in_features=784, out_features=256),nn.ReLU(),nn.Linear(in_features=256, out_features=128),nn.ReLU(),nn.Linear(in_features=128, out_features=64),nn.ReLU(),nn.Linear(in_features=64, out_features=16),nn.ReLU())#解码器self.decoder = nn.Sequential(nn.Linear(in_features=16, out_features=64),nn.ReLU(),nn.Linear(in_features=64, out_features=128),nn.ReLU(),nn.Linear(in_features=128, out_features=256),nn.ReLU(),nn.Linear(in_features=256, out_features=784),nn.Sigmoid())def forward(self, x):batch, channel,width,height = x.shapex = x.view(-1, 28*28)#low dimensional vectora = self.encoder(x)#print("\n a.shape ",a.shape)hatX = self.decoder(a)hatX = hatX.view(batch,channel,width,height)return hatX

5.2 main.py

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 20 15:01:54 2024@author: chengxf2
"""import torch
from torch.utils.data import DataLoader
from torchvision import transforms, datasets
import time
from torch import optim,nn
from autoEncoder  import AE
import visdomdef main():batchNum = 64lr = 1e-3epochs = 20device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")torch.manual_seed(1234)viz = visdom.Visdom()viz.line([0],[-1],win='train_loss',opts =dict(title='train acc'))tf= transforms.Compose([ transforms.ToTensor()])mnist_train = datasets.MNIST('mnist',True,transform= tf,download=True)train_data = DataLoader(mnist_train, batch_size=batchNum, shuffle=True)mnist_test = datasets.MNIST('mnist',False,transform= tf,download=True)test_data = DataLoader(mnist_test, batch_size=batchNum, shuffle=True)global_step =0model =AE().to(device)criteon = nn.MSELoss().to(device) #损失函数optimizer = optim.Adam(model.parameters(),lr=lr) #梯度更新规则print("\n ----main-----")for epoch in range(epochs):start = time.perf_counter()for step ,(x,y) in enumerate(train_data):#[b,1,28,28]x = x.to(device)#print("\n x shape",x.shape)x_hat = model(x)#print("\n xHat",x_hat.shape)loss = criteon(x_hat, x)#backpropoptimizer.zero_grad()loss.backward()optimizer.step()viz.line(Y=[loss.item()],X=[global_step],win='train_loss',update='append')global_step +=1end = time.perf_counter()    interval = end - startprint("\n 每轮训练时间 :",int(interval))print(epoch, 'loss:',loss.item())x,target = iter(test_data).next()x = x.to(device)with torch.no_grad():x_hat = model(x)tip = 'hat'+str(epoch)#print(x[0])print("\n ----")#print(x_hat[0])#viz.images(x,nrow=8, win='x',opts=dict(title='x'))viz.images(x_hat,nrow=8, win='x_hat',opts=dict(title=tip))if __name__ == '__main__':main()

六 Stacked Autoencoders

      Bengio等人在2007年的  Greedy Layer-Wise Training of Deep Networks 中,

仿照stacked RBM构成的DBN,提出Stacked AutoEncoder.

      堆叠式自编码器通过将多个自编码器连接在一起来构建一个深层的神经网络结构。每个自编码器的隐藏层都作为下一个自编码器的输入层,逐层堆叠在一起。这种堆叠的方式使得每个自编码器都可以学习到更高级别的数据特征表示。

    堆叠式自编码器的训练过程分为两个阶段。

   1,每个自编码器都被独立地训练以学习到数据的低维表示。

   2    使用已训练好的自编码器来初始化下一个自编码器的编码器部分,然后再次进行训练,以学习到更高级别的特征表示。

         这个过程可以重复多次,以构建更深层次的堆叠式自编码器.

 建议看一下这个代码:AutoEncoder: 堆栈自动编码器 Stacked_AutoEncoder - 知乎

简答的说先训练出一个AE, 把该AE 的隐藏层作为下个AE 的输入,

反复迭代训练

参考:

自编码器(AE、VAE)的原理与代码实现 - 知乎

16: Unsupervised Learning - Auto-encoder_哔哩哔哩_bilibili

神经网络-AE&VAE基础 - 知乎

自编码网络(附代码实现)-CSDN博客

浅析Bag-of-words及Bag-of-features原理_bag of words-CSDN博客

https://www.cnblogs.com/neopenx/p/4378635.html

AutoEncoder: 堆栈自动编码器 Stacked_AutoEncoder - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA OSERDESE2

Output Parallel-to-Serial Logic Resources (OSERDESE2) OSERDESE2 在Xilinx 7 系列器件是一款专用的并行至串行转换器,具有特定的时钟和逻辑资源,旨在促进高速源同步接口的实现。每个OSERDESE2模块都包括一个专用的数据串行器和 3 状态控制。数据和 3 态串行器都可以在 SD…

Edwards爱德华STP系列-A1603分子泵使用维修保养说明

Edwards爱德华STP系列-A1603分子泵使用维修保养说明

前端基础自学整理|DOM树

DOM&#xff0c;文档对象模型&#xff08;Document Object Model&#xff09;&#xff0c;简单的说&#xff0c;DOM是一种理念&#xff0c;一种思想&#xff0c;一个与系统平台和编程语言无关的接口&#xff0c;一种方法, 使 Web开发人员可以访问HTML元素&#xff01;不是具体方…

Flask数据库操作-Flask-SQLAlchemy

Flask中一般使用flask-sqlalchemy来操作数据库。flask-sqlalchemy的使用介绍如下&#xff1a; 一、SQLAlchemy SQLALchemy 实际上是对数据库的抽象&#xff0c;让开发者不用直接和 SQL 语句打交道&#xff0c;而是通过 Python 对象来操作数据库&#xff0c;在舍弃一些性能开销…

Nginx----高性能的WEB服务端

一、Nginx介绍 1、什么是Nginx Nginx Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 一款高性能…

(done) Positive Semidefinite Matrices 什么是半正定矩阵?如何证明一个矩阵是半正定矩阵? 可以使用特征值

参考视频&#xff1a;https://www.bilibili.com/video/BV1Vg41197ew/?vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料(半正定矩阵的定义)&#xff1a;https://baike.baidu.com/item/%E5%8D%8A%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/2152711?frge_ala 看看半正定矩阵的…

Milvus数据库介绍

参考&#xff1a;https://www.xjx100.cn/news/1726910.html?actiononClick Milvus 基于FAISS、Annoy、HNSW 等向量搜索库构建&#xff0c;核心是解决稠密向量相似度检索的问题。在向量检索库的基础上&#xff0c;Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量…

基于Java在线宠物店商城系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

Redis的常见面试题

目录 前言 Redis支持哪些数据类型 五种核心类型 Zset为什么用跳表不用红黑树 &#xff1f; Redis常见的应用场景&#xff1f; 如何检测Redis的连通性&#xff1f; 如何设置key的过期时间&#xff1f; Redis为什么是单线程模型&#xff1f; Redis里的IO多路复用是什…

惠尔顿安全审计系统任意文件读取漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

启动node服务报错Error: listen EACCES: permission denied 0.0.0.0:5000

启动node服务报错&#xff1a; 解决方案&#xff1a; 将监听端口改成3000或者其他 修改后结果&#xff1a; 参考原文&#xff1a; Error: listen EACCES: permission denied_error when starting dev server: error: listen eacc-CSDN博客

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda设置国内源&#xff08;以添加清华源为例&#xff0c;阿里云源同样&#xff09; 3.conda管理python库 4.其它 不太推荐 pyenv管理Python不同版本教程&#xff08;本人另一篇博客&#xff0c;姊妹篇&…

C语言菜鸟入门·数组简介

目录 1. 简介 2. 声明数组 3. 初始化数组 3. 访问数组元素 4. 获取数组长度 5. 数组名 1. 简介 在 C 语言中&#xff0c;数组是一种用来存储相同类型数据元素的集合。数组提供了一种便捷的方式来管理一系列相同类型的数据&#xff0c;可以按照索引来访问和操作数组…

探究网络工具nc(netcat)的使用方法及安装步骤

目录 &#x1f436;1. 什么是nc&#xff08;netcat&#xff09;&#xff1f; &#x1f436;2. nc&#xff08;netcat&#xff09;的基本使用方法 2.1 &#x1f959;使用 nc 进行端口监听 2.2 &#x1f959;使用 nc 进行端口扫描 2.3 &#x1f959;使用 Netcat 进行文件传输…

代码随想录算法训练营day20

题目&#xff1a;530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先 参考链接&#xff1a;代码随想录 530.二叉搜索树的最小绝对差 思路&#xff1a;我一开始想到的方法是先生成中序序列&#xff0c;然后对相邻两项的差进行计算&#xff0c;取…

【PCIE709-F】基于复旦微JFM7VX690T80 FPGA的全国产化8通道光纤双FMC接口数据处理平台

板卡概述 PCIE709-F是一款基于上海复旦微电子的28nm 7系列FPGA JFM7VX690T80的全国产化8通道光纤双FMC接口数据预处理平台&#xff0c;该板卡采用复旦微的高性能7系列FPGA作为实时处理器&#xff0c;实现4路10G SFP光纤以及1路QSFP通信接口、实现1路X8 PCIE数据传输的功能。板载…

【鸿蒙系统学习笔记】网络请求

一、介绍 资料来自官网&#xff1a;文档中心 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 日常…

SpringMVC回顾总结笔记

MVC是一种思想而SpringMVC是具体的实现&#xff08;Ioc和DI的关系&#xff09; 在创建项目的时候勾选的SpringWeb框架就是SpringMVC框架 与浏览器建立连接 默认返回的是一个 view 视图。需要添加ResponseBody说明返回的是json数据。RestController是ControllerResponseBody…

【数据结构】_队列

目录 1.概念 2.队列的使用 3.队列模拟实现 4.循环队列 5.双端队列 6.栈与队列的互相实现 6.1 用队列实现栈 6.2 用栈实现队列 1.概念 &#xff08;1&#xff09;队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff1b; &am…

小米标准模组+MCU 快速上手开发(一)——之固件下载

小米标准模组+MCU 开发笔记之固件下载 背景技术名词简介● 小米IoT开发者平台● 小米IoT 模组● ESP系列简介问题描述 + 解决方式问题1:固件下载是否有示例,如何下载到硬件板卡中?问题2:固件下载的官方程序是什么?在哪里?该如何使用?问题3:固件下载时,Flash和Ram 有什…