当前位置: 首页 > news >正文

【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 - 知乎

相关文章:

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

前言&#xff1a; 本篇重点介绍AE&#xff08;Auto-Encoder&#xff09; 自编码器。这是深度学习的一个核心模型. 自编码网络是一种基于无监督学习方法的生成类模型,自编码最大特征输出等于输入 Yann LeCun&Bengio, Hinton 对无监督学习的看法. 目录&#xff1a; AE 模型原…...

Modern C++ std::variant的实现原理

前言 std::variant是C17标准库引入的一种类型&#xff0c;用于安全地存储和访问多种类型中的一种。它类似于C语言中的联合体&#xff08;union&#xff09;&#xff0c;但功能更为强大。与联合体相比&#xff0c;std::variant具有类型安全性&#xff0c;可以判断当前存储的实际…...

⭐北邮复试刷题LCR 018. 验证回文串__双指针 (力扣119经典题变种挑战)

LCR 018. 验证回文串 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 本题中&#xff0c;将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, a canal: Panama” 输出: true 解释…...

C++面试:数据库的权限管理数据库的集群和高可用

目录 一、数据库的权限管理 1. 用户和角色管理 用户管理 实例举例&#xff08;以MySQL为例&#xff09;&#xff1a; 角色管理 实例举例&#xff08;以MySQL为例&#xff09;&#xff1a; 总结 2. 权限和授权 用户和角色管理 用户管理 角色管理 权限和授权 权限 授…...

个人搭建部署gpt站点

2024搭建部署gpt 参照博客 https://cloud.tencent.com/developer/article/2266669?areaSource102001.19&traceIdRmFvGjZ9BeaIaFEezqQBj博客核心点 准备好你的 OpenAI API Key; 点击右侧按钮开始部署&#xff1a; Deploy with Vercel&#xff0c;直接使用 Github 账号登…...

samber/lo 库的使用方法: condition

samber/lo 库的使用方法&#xff1a; condition samber/lo 是一个 Go 语言库&#xff0c;使用泛型实现了一些常用的操作函数&#xff0c;如 Filter、Map 和 FilterMap。汇总目录页面 这个库函数太多&#xff0c;因此我决定按照功能分别介绍&#xff0c;本文介绍的是 samber/l…...

Chrome插件精选 — 缓存清理

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. Chrome清理大师…...

Redis之缓存穿透问题解决方案实践SpringBoot3+Docker

文章目录 一、介绍二、方案介绍三、Redis Docker部署四、SpringBoot3 Base代码1. 依赖配置2. 基本代码 五、缓存优化代码1. 校验机制2. 布隆过滤器3. 逻辑优化 一、介绍 当一种请求&#xff0c;总是能越过缓存&#xff0c;调用数据库&#xff0c;就是缓存穿透。 比如当请求一…...

每日shell脚本之超级整合程序3.0

每日shell脚本之超级整合程序3.0 本期带来之前的升级版2.0整合脚本程序,学习工作小利器,同时模块化构建方便二次开发。 上图 上源码 #!/usr/bin/bash # *******************************************# # * CDDN : M乔木 # # * qq邮箱 …...

Docker介绍与使用

Docker介绍与使用 目录&#xff1a; 一、Docker介绍 1、Docker概述与安装 2、Docker三要素 二、Docker常用命令的使用 1、镜像相关命令 2、容器相关命令 三、Docker实战之下载mysql、redis、zimg 一、Docker介绍 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包…...

Gin框架: 使用go-ini配置参数与不同环境下的配置部署

关于 INI 配置文件与go-ini 1 &#xff09;概述 在INI配置文件中可以处理各种数据的配置INI文件是一种简单的文本格式&#xff0c;常用于配置软件的各种参数go-ini 是地表 最强大、最方便 和 最流行 的 Go 语言 INI 文件操作库 Github 地址&#xff1a;https://github.com/go-…...

探究网络工具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 进行文件传输…...

深入浅出JVM(四)之类文件结构

深入浅出JVM&#xff08;四&#xff09;之类文件结构 Java文件编译成字节码文件后&#xff0c;通过类加载机制到Java虚拟机中&#xff0c;Java虚拟机能够执行所有符合要求的字节码&#xff0c;因此无论什么语言&#xff0c;只要能够编译成符合要求的字节码文件就能够被Java虚拟…...

Anaconda下的pkgs占用空间13G,如何安全的清理(已解决)

方法一&#xff1a;让Anaconda自行决定清理 执行命令 conda clean -p 我的Anaconda安装在D盘&#xff0c;具体位置如下。你的应该也能找到对应的位置 D:\*****\**\Anaconda3\pkgs (base) C:\Users\Liu_J>conda clean -p WARNING: C:\Users\***\.conda\pkgs does not ex…...

压缩感知常用的重建算法

重建算法的基本概念 在压缩感知&#xff08;Compressed Sensing, CS&#xff09;框架中&#xff0c;重建算法是指将从原始信号中以低于奈奎斯特率采集得到的压缩测量值恢复成完整信号的数学和计算过程。由于信号在采集过程中被压缩&#xff0c;因此重建算法的目标是找到最符合…...

c语言经典测试题2

1.题1 我们来思考一下它的结果是什么&#xff1f; 我们来分析一下&#xff1a;\\是转义为字符\&#xff0c;\123表示的是一个八进制&#xff0c;算一个字符&#xff0c;\t算一个字符&#xff0c;加上\0&#xff0c;应该有13个&#xff0c;但是strlen只计算\0前的字符个数。所以…...

⭐北邮复试刷题105. 从前序与中序遍历序列构造二叉树__递归分治 (力扣每日一题)

105. 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,…...

机房预约系统(个人学习笔记黑马学习)

1、机房预约系统需求 1.1系统简介 学校现有几个规格不同的机房&#xff0c;由于使用时经常出现“撞车“现象,现开发一套机房预约系统&#xff0c;解决这一问题。 1.2身份简介 分别有三种身份使用该程序 学生代表:申请使用机房教师:审核学生的预约申请管理员:给学生、教师创建账…...

7、内网安全-横向移动PTH哈希PTT票据PTK密匙Kerberos密码喷射

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正 目录 一、域横向移动-PTH-Mimikatz&NTLM 1、Mimikatz 2、impacket-at&ps&wmi&smb 二、域横向移动-PTK-Mimikatz&AES256 三、域横向移动-PTT-漏洞&Kekeo&Ticket 1、漏…...

【前端】夯实基础 css/html/js 50个练手项目(持续更新)

文章目录 前言Day 1 expanding-cardsDay 2 progress-steps 前言 发现一个没有用前端框架的练手项目&#xff0c;很适合我这种纯后端开发夯实基础&#xff0c;内含50个mini project&#xff0c;学习一下&#xff0c;做做笔记。 项目地址&#xff1a;https://github.com/bradtr…...

ELK入门(四)-logstash

Logstash Logstash 是开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的存储库中。 Logstash 能够动态地采集、转换和传输数据&#xff0c;不受格式或复杂度的影响。利用 Grok 从非结构化数据中…...

laravel-admin的3个开发细节调整

在使用laravel-admin开发的过程中&#xff0c;根据官方开发文档Laravel admin | laravel-admin基本都能实现想要的效果&#xff0c;这里补充3个文档上没有描述的细节 Laravel8命令行创建控制器调整 在laravel-admin中可以使用php artisan admin:make UserController --modelAp…...

Redis--原理篇-数据结构(底层)

Redis数据结构 动态字符串SDS IntSet 统一大小并且内存地址连续 为了方便寻址 Dict 基本结构 扩容 收缩 Ziplist(P150 后半部分再看) Quicklist skiplist(满足中间查询 RedisObject...

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日&#xff0c;OpenAI第一次发布人工智能聊天机器人ChatGPT&#xff0c;随后在全世界掀起了人工智能狂潮&#xff0c;颠覆了一个又一个行业。在过去的一年多的时间里&#xff0c;chatGPT的强大功能改变了越来越多人的工作和生活方式&#xff0c;成为了世界上用…...

视频生成模型:构建虚拟世界的模拟器 [译]

原文&#xff1a;Video generation models as world simulators 我们致力于在视频数据上开展生成模型的大规模训练。具体来说&#xff0c;我们针对不同时长、分辨率和宽高比的视频及图像&#xff0c;联合训练了基于文本条件的扩散模型。我们采用了一种 Transformer 架构&#…...

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 二、子查询的使用 三、总结 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 在一个 select 语句中,嵌入了另外一个 select …...

2-21算法习题总结

由于蓝桥杯的题,我不知道从怎么复制,就只能粘贴图片了 翻硬币 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String start sc.next();char[] starts start.toCharArray();String end sc…...

常见的排序算法整理

1.冒泡排序 1.1 冒泡排序普通版 每次冒泡过程都是从数列的第一个元素开始&#xff0c;然后依次和剩余的元素进行比较&#xff0c;若小于相邻元素&#xff0c;则交换两者位置&#xff0c;同时将较大元素作为下一个比较的基准元素&#xff0c;继续将该元素与其相邻的元素进行比…...

stm32——hal库学习笔记(定时器)

这里写目录标题 一、定时器概述&#xff08;了解&#xff09;1.1&#xff0c;软件定时原理1.2&#xff0c;定时器定时原理1.3&#xff0c;STM32定时器分类1.4&#xff0c;STM32定时器特性表1.5&#xff0c;STM32基本、通用、高级定时器的功能整体区别 二、基本定时器&#xff0…...

方法鉴权:基于 Spring Aop 的注解鉴权

在Spring框架中&#xff0c;可以使用面向切面编程&#xff08;AOP&#xff09;来实现注解鉴权。这通常涉及到定义一个切面&#xff08;Aspect&#xff09;&#xff0c;该切面会在方法执行前进行拦截&#xff0c;并根据注解value值来决定是否允许执行该方法。 简单思路&#xf…...