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

news2024/11/17 22:20:42

前言:

         本篇重点介绍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 torch


def conv2d():
    '''
    
·· 输入:
       batch_size,一个batch中样本的个数 3
       channels,通道数,RGB 图为3,灰度图为1
       height, 图片的高 5
       width_1, 图片的宽 5
    卷积核:
        channels,通道数,和上面保持一致,也就是当前层的深度 1
        output ,输出的深度 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 res

def  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*padding
      output_padding(int or tuple, optional):对输出图像进行padding,输出图像尺寸增加padding
      groups:分组卷积(必须能够整除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 nn

class 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.shape
      
        x = x.view(-1, 28*28)
        #low dimensional vector
        a = 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 visdom





def main():
   
   batchNum = 64
   lr = 1e-3
   epochs = 20
   device = 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 =0

   
   

   
  
   model =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)
           
           #backprop
           optimizer.zero_grad()
           loss.backward()
           optimizer.step()
           viz.line(Y=[loss.item()],X=[global_step],win='train_loss',update='append')
           global_step +=1



    
       end = time.perf_counter()    
       interval = end - start
       print("\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.coloradmin.cn/o/1462534.html

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

相关文章

【C++】字符类型和字符数组-string

STL-容器 - string 字符串必须具备结尾字符\0 #include<iostream> #include<string> using namespace std; //STL-容器 - string char ch[101];//字符串必须具备结尾字符\0 int main() {int n; cin >> n;for (int i 0; i < n; i) {cin >> ch[i];}…

js如何抛异常,抛自定义的异常

js如何抛异常,抛自定义的异常 最简单的自定义异常 throw "hello" 来自chrome123的控制台的测试 throw "hello" VM209:1 Uncaught hello &#xff08;匿名&#xff09; VM209:1 try{ throw "hello";}catch(e){console.log(e);} VM338:1 hello…

每日coding 337打家劫舍III

337. 打家劫舍 III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。…

08 按键消抖

在按键控制 LED中采用直接读取按键电平状态&#xff0c;然后根据电平状态控制LED。虽然直接读取按键电平状态然后执行相应处理程序的方法非常简单&#xff0c;但是这种方式可能存在误判问题&#xff0c;进而有可能导致程序功能异常&#xff0c;这是因为按键按下和松开时存在抖动…

WordPress后台自定义登录和管理页面插件Admin Customizer

WordPress默认的后台登录页面和管理员&#xff0c;很多站长都想去掉或修改一些自己不喜欢的功能&#xff0c;比如登录页和管理页的主题样式、后台左侧菜单栏的某些菜单、仪表盘的一些功能、后台页眉页脚某些小细节等等。这里boke112百科推荐这款可以让我们轻松自定义后台登录页…

定制学习风格、满足多元需求:Mr. Ranedeer 帮你打造 AI 家教 | 开源日报 No.178

JushBJJ/Mr.-Ranedeer-AI-Tutor Stars: 20.4k License: NOASSERTION Mr. Ranedeer 是一个个性化的 AI 辅导项目&#xff0c;主要功能包括使用 GPT-4 生成定制化提示&#xff0c;为用户提供个性化学习体验。其核心优势和特点包括&#xff1a; 调整知识深度以满足学习需求定制学…

Nginx 和 Apache 的比较

Nginx和Apache的对比 Nginx和Apache的优缺点比较 (1)nginx相对于apache的优点 ①轻量级&#xff0c;同样起web服务&#xff0c;比apache占用更少的内存及资源 ②抗并发&#xff0c;nginx处理请求是异步非阻塞的&#xff0c;而apache是阻塞型的在高并发下&#xff0c;nginx能保持…

9.vue学习笔记(组件传递Props校验+组件事件-组件传递数据+组件事件-配合“v-model”使用)

文章目录 1.组件传递Props校验1.1.默认值1.2.必选项1.3.注意事项&#xff1a;props 是只读的 2.组件事件-组件传递数据2.1.温馨提示&#xff1a;组件之间传递数据的方案 3.组件事件-配合“v-model”使用 1.组件传递Props校验 Vue组件可以更细致地声明对传入的 props 的校验要求…

基于JAVA+SpringBoot+Vue的前后端分离的电子商城

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在当今数字化时代&…

人工智能与机器学习行业新闻:颠覆企业运营方式的 AI 趋势

AI 推动业务转型 人工智能 (AI) 和机器学习已经在重塑各行各业的业务模式。AI 通过处理和整合数据支持战略决策的制定&#xff0c;其规模和速度远远超过了人脑。无疑&#xff0c;未来我们还将在 AI 领域取得许多重大突破&#xff0c;而拥有大量数据的行业可能会从人工智能革命…

C++ Primer 笔记(总结,摘要,概括)——第3章 字符串、向量和数组

目录 3.1 命名空间的using声明 3.2 标准库类型string 3.2.1 定义和初始化string对象 3.2.2 string对象上的操作 3.2.3 处理string对象中的字符 3.3 标准库类型vector 3.3.1 定义和初始化vector对象 3.3.2 向vector对象中添加元素 3.3.3 其他vector操作 3.4 迭代器介绍 3.4.…

”戏说“ 交换机 与 路由器

一般意义上说 老哥 这文章发表 的 东一榔头 西一锤 呵呵&#xff0c; 想到哪里就啰嗦到哪里 。 交换机&#xff1a; 其实就是在通道交换 路由器&#xff1a; 不光是在通道交换还要在协议上交换 下图你看懂了吗&#xff1f; &#xff08;仅仅数据交换-交换机 协议…

安卓开发:挑战每天发布一个封装类02--Wav录音封装类AudioChannel 1.0

简介 库名称&#xff1a;AudioChannel 版本:1.0 由于项目需求录音并base64编码存到服务器中&#xff0c;就顺手改装了一个别人的封装类 原封装类地址:Android AudioRecord音频录制wav文件输出 - 简书 (jianshu.com) 描述&#xff1a;此封装类基于AudioRecord实现wav的音频…

10.CSS3的calc函数

CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗&#xff1f; CSS3 中的 calc 函数 calc 是英文单词 calculate&#xff08;计算&#xff09;的缩写&#xff0c;是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处&#xff0c;语法如…

详细描述一下CrossOver2024版本的用途和作用?

当然可以。CrossOver 是一款由 CODE WEAVERS 公司开发的软件&#xff0c;其主要目标是在 macOS 和 Linux 系统上实现与 Windows 应用程序的兼容性。它不同于传统的虚拟机&#xff0c;如 Parallels 或 VMware&#xff0c;因为它并不在 macOS 上创建一个完整的 Windows 环境。相反…

【进程概念】

目录 什么是在计算机运行的程序这么多运行的程序计算机是如何管理的先描述再组织 什么是在计算机运行的程序 对于一个在磁盘可执行的二进制文件&#xff0c;也可叫做可执行程序。对于一个可执行的程序&#xff0c;程序有自己的代码和数据。一旦运行起来&#xff0c;就会在计算…

旅游分享系列之:福建旅游攻略

旅游分享系列之&#xff1a;福建旅游攻略 一、漳州1.福建土楼2.云水谣3.四菜一汤景点 二、厦门1.园林博览苑2.海上自行车道3.山海步道4.海滩5.闽南菜6.落日 三、泉州1.衙口沙滩2.海上日出3.珞珈寺4.海滩烟花 一、漳州 游玩2个景点&#xff1a;云水谣&#xff0c;四菜一汤可以住…

永恒之黑和永恒之蓝 漏洞解析及复现

充当攻击机的机器是kali&#xff0c;另外需要关闭防火墙策略。 永恒之黑&#xff08;CVE-2020-0796&#xff09; 靶机&#xff1a;windows 10的IP地址&#xff1a;192.168.200.30 原理&#xff1a;实现远程代码执行 注意&#xff1a; 这个脚本运行有时候会导致靶机蓝屏&am…

OpenAI Sora引领AI跳舞视频新浪潮:字节跳动发布创新舞蹈视频生成框架

OpenAI的Sora已经引起广泛关注&#xff0c;预计今年AI跳舞视频将在抖音平台上大放异彩。下面将为您详细介绍一款字节跳动发布的AI视频动画框架。 技术定位&#xff1a;这款框架采用先进的diffusion技术&#xff0c;专注于生成人类舞蹈视频。它不仅能够实现人体动作和表情的迁移…

(done) 什么是正定矩阵?Positive Definite Matrices

正定矩阵的定义&#xff1a;https://baike.baidu.com/item/%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/11030459 正定矩阵的作用、验证视频&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c…