深度学习入门笔记(九)自编码器

news2024/11/15 16:46:20

自编码器是一个无监督的应用,它使用反向传播来更新参数,它最终的目标是让输出等于输入。数学上的表达为,f(x) = x,f 为自编码器,x 为输入数据。

自编码器会先将输入数据压缩到一个较低维度的特征,然后利用这个较低维度的特征重现输入的数据,重现后的数据就是自编码器的输出。所以,从本质上来说,自编码器就是一个压缩算法。

自编码器由 3 个部分组成:

  • 编码器(Encoder):用于数据压缩。
  • 压缩特征向量(Compressed Feature Vector):被编码器压缩后的特征。压缩特征向量也是人工神经网络中的一层,它的维度就是我们要将数据压缩到的维度,是一个超参,我们要提前设定。
  • 解码器(Decoder):用于数据解码。编码器与解码器就是之前讲的多层感知机,也可以用卷积实现。

如下图
在这里插入图片描述
有三点需要注意

  1. 自编码器只能压缩与训练数据相似的数据。比如我们用 MNIST手写数字训练集来训练自编码器,那它只能压缩手写数字相关的数据,如果用来压缩手写数字以外的数据,表现就会很差;
  2. 自编码器解压缩的结果只能接近输入,并不完全一样。所以它是一个有损的压缩算法;
  3. 自编码器是一个无监督学习的算法。我们不需要对数据做任何标注,只需要把原始数据扔给它就可以了,它会自动挖掘数据中的潜在结构模式。

9.1 自编码器的网络架构

在这里插入图片描述
可以看到,这种自编码器是一层层堆叠起来的,所以又称为堆叠式自编码器。

首先我们会有 3 个维度的输入 x 通过编码器,然后生成 1 个有两个维度的压缩特征向量。解码器会将这两个维度的特征向量恢复到 3 个维度的 x’,然后输出。其中编码器与解码器是对称的。

整个过程的宗旨只有一个:输出的 x’无限接近输入 x。

对于一个自编码器,会有 3 个超参需要设定:

  • 压缩特征向量的神经元的个数:也就是压缩后的维度。神经元的个数越少则代表有更重的压缩。
  • 层的个数:自编码器的结构可以按照我们的想法任意设定。
  • 每一层中神经元的个数。

9.2自编码器的实现

如何训练一个自编码器呢?只需要以下几个步骤:

  • 构造一个编码器和解码器;
  • 设定一个损失函数来衡量输出 x’与输入 x 的差距;
  • 选择一个优化方法,来更新参数,例如随机梯度下降算法(SGD)。

我们把上面 3 步再具体一些。

  • 我们有数据集 D:D={x1,x2,…,xi,…,xm},其中 xi=(xi,1,xi,2,…,xi,n)。
  • 编码器为 y=h(x),y 是上图中的压缩特征向量。
  • 解码器为 x’=f(y)=f(h(x))。

如果输入的数据是数值型,则利用均方误差(MSE)来衡量输出 x’与输入 x 之间的差距;如果输入的数据是离散型,则利用交叉熵损失来衡量输出 x’与输入 x 之间的差距。h(x)与 f(y)的参数会通过我们设定好的优化方法进行更新。

自编码器的网络结构非常容易控制,只要增加网络的层数、每一层的节点数以及压缩向量的长度就让网络变得更加强大。

增加这些超参会让自编码器学习到更加复杂的压缩编码模型,但同时也会带来一定的问题。太复杂的网络有可能让网络变得非常容易过拟合,并且网络也很难学习到输入数据的潜在特征,只会学到将输入数据拷贝到输出这样一种单纯的恒等变换。模型过拟合的时候,在训练集上会有非常优秀的表现,但是遇到训练集以外的数据就不会有很好的效果。

所以大部分自编码器都故意保留了一个比较小的压缩特征向量。那除了保留一个较小的压缩特征向量之外,接下来我们看看还有没有其他方法可以让自编码器更加专注地发现数据中的潜在结构

9.3 降噪自编码器

降噪自编码器是在训练时,在输入的数据中加入随机噪音,在最后输出的时候恢复到没有噪音的状态的一种编码器。
在这里插入图片描述
上图的第一行为原始图片,第二行为对应有噪声的图片。训练时,我们把第二行图片作为输入,第一行的原始图片作为输出。

因为输入的数据中加入了随机噪音,就避免了网络只学习到简单的将输入复制到输出的这种恒等变换,强制让自编码器学习如何剔除数据中的噪音,然后再恢复到没有噪音的状态。这样就能让它更加专注地挖掘数据中的潜在结构模式。

9.4 稀疏自编码器

在损失函数中加一个惩罚项,在训练时就可以让自编码器只有一小部分节点被激活,这样我们就得到一个稀疏自编码器了。

这样通过限制自编码器中神经元的输出,只让很小的一部分神经元有非 0 的输出,也可以说是只激活一小部分的神经元。迫使自编码器将输入与一部分节点联系起来,从而让它发现数据中更有价值的结构。即使压缩特征向量中有很多节点,有这种约束的自动编码器也可以很好地工作,因为它只让一部分节点被激活。

第一章讲的L1 范数即可实现这种稀疏的约束。
在这里插入图片描述
可以发现,我们的 L1 正则约束确实对压缩特征向量起到了效果,大部分时候的输出都是 0。而标准的自编码器的压缩特征向量的输出相对平缓一些。

9.5 使用场景

对于压缩应用来说,因为自编码器对训练数据有非常强的依赖,这也让它能难作为一个通用的压缩算法被使用。
所以自编码器主要有以下两个用途:数据降噪;降维处理。

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

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

相关文章

Java图形化界面编程—— LayoutManager布局管理器笔记

2.4 LayoutManager布局管理器 之前,我们介绍了Component中有一个方法 setBounds() 可以设置当前容器的位置和大小,但是我们需要明确一件事,如果我们手动的为组件设置位置和大小的话,就会造成程序的不通用性,例如&…

数字图像处理实验记录七(彩色图像处理实验)

一、基础知识 经过前面的实验可以得知,彩色图像中的RGB图像就是一个三维矩阵,有3个维度,它们分别存储着R元素,G元素,B元素的灰度信息,最后将它们合起来,便是彩色图像。 这一次实验涉及CMYK和HS…

Java 获取、创建 stream 流操作对象的几种方法

Java 获取、创建 stream 流操作对象的几种方法 package com.zhong.streamdemo.createstreamdemo;import java.util.*; import java.util.stream.Stream;/*** ClassName : CreateStream* Description : 创建 stream 操作对象* Author : zhx* Date: 2024-02-08 13:10*/ public c…

查看网络配置的ipconfig命令

ipconfig是调试计算机网络的常用命令,通常大家使用它显示计算机中网络适配器的IP地址、子网掩码及默认网关。其实这只是ipconfig的不带参数用法,而它的带参数用法,在网络中应用也是相当不错的。 1.语法 ipconfig [/all] [/renew[Adapter]] [/…

分布式springboot 3项目集成mybatis官方生成器开发记录

文章目录 说明实现思路实现步骤第一步:创建generator子模块第二步:引入相关maven插件和依赖第三步:编写生成器配置文件第四步:运行查看结果 说明 该文章为作者开发学习记录,方便以后复习和交流主要内容为:…

《游戏引擎架构》 -- 学习2

声明,定义,以及链接规范 翻译单元 声明与定义 链接规范 C/C 内存布局 可执行映像 程序堆栈 动态分配的堆 对象的内存布局 kilobyte 和 kibibyte 流水线缓存以及优化 未完待续。。。

AOP相关

AOP相关 什么是AOP? 常见的场景 记录操作日志 缓存处理 spring内置事务处理 AOP记录操作日志 定义切点表达式,确定要记录的方法 找到方法中有log注解的方法 获得方法 获得方法的参数 spring中的事务实现 spring中的事务分声明式事务和编程式事务…

[word] word表格表头怎么取消重复出现? #媒体#笔记#职场发展

word表格表头怎么取消重复出现? word表格表头怎么取消重复出现?在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是&…

使用GDI画图片生成合成图片并调用打印机进行图片打印

使用GDI画图片生成合成图片并调用打印机进行图片打印 新建窗体应用程序PrinterDemo,将默认的Form1重命名为FormPrinter,添加对 Newtonsoft.Json.dll用于读写Json字符串 zxing.dll,zxing.presentation.dll用于生成条形码,二维码…

STM32内存管理

一.什么是内存管理 内存管理是计算机系统中的一个重要组成部分,它负责管理计算机的内存资源。内存管理的主要目标是有效地分配、使用和释放内存,以满足程序的运行需求。 内存是计算机用于存储程序和数据的地方,它由一系列内存单元组成&#…

Java后端技术助力,党员学习平台更稳定

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

mysql按周统计数据简述

概述 业务中经常会遇到按年月日统计的场景; 但有时会有按周统计的情况; 我一般是用3种方法去解决: 利用mysql的weekday函数。计算出当前日期是一周中的第几天,然后当前日期 - 这个数值,就可以得到当前周的周一的日期…

停车场|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)

停车场管理系统目录 目录 基于Springboot的停车场管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 (1)车位管理 (2)车位预订管理 (3)公告管理 (4&#…

分布式系统架构介绍

1、为什么需要分布式架构? 增大系统容量:单台系统的性能瓶颈,多台机器才能应对大规模的应用场景,所以就需要我们的应用支撑平台具备分布式架构。 加强系统的可用:为了满足业务的SLA要求,需要通过分布式架构…

汇编笔记 01

小蒟蒻的汇编自学笔记,如有错误,望不吝赐教 文章目录 笔记编辑器,启动!debug功能CS & IPmovaddsub汇编语言寄存器的英文全称中英对照表muldivandor 笔记 编辑器,启动! 进入 debug 模式 debug功能 …

C语言:分支与循环

创造不易,友友们给个三连吧!! C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分…

SQL拆分字段内容(含分隔符)

问题描述: 在做数据迁移的过程中,我们希望对表中的某个字段根据分隔符进行拆分,得到多条数据,原代码有点意思,因此记录一下。 我们假设某条数据如下: IDSTRS1公司名称不能小于四个字,行业类别…

春运也要“信号升格”:中兴通讯助运营商打造高铁精品网

一年一度的春运,承载了游子的思乡情。据官方预计,今年春运跨区域人员流动量将达到90亿人次,创下历史新高,铁路、公路、水路、民航等营业性客运量全面回升,其中铁路预计发送旅客4.8亿人次,日均1200万人次&am…

网络设备如何巡检?这些命令必不可少

一、查看交换机的端口使用情况: dis interface brief查看交换机的哪个端口是万兆端口,以及端口状态,那个端口在使用。 如下图,使用这个命令。 其中端口0/0/1与端口0/0/2处于使用中。其它接口没有使用;如果在实际项目…

[Python进阶] 制作动态二维码

11.1 制作动态二维码 二维码(QR code)是一种二维条形码(bar code),它的起源可以追溯到20世纪90年代初。当时,日本的汽车工业开始使用一种被称为QR码的二维条码来追踪汽车零部件的信息。 QR码是Quick Respo…