简介:自动编码器是一种可以进行无监督学习的神经网络模型。一般而言,一个完整的自动编码器主要由两部分组成,分别是用于核心特征提取的编码部分和可以实现数据重构的解码部分。
1.自动编码器入门
在自动编码器中负责编码的部分也叫做编码器(Encoder),而负责解码的部分也叫作解码器(Decoder)。编码器主要负责对原始的输入数据进行压缩并提取数据中的核心特征,而解码器主要是对在编码器中提取的核心特征进行展开并重新构造出之前的输入数据。
如图就是一个简化的自动编码器模型,它的主要结构是神经网络,该模型的最左边是用于数据输入的输入层,在输入数据通过神经网络的层层传递之后得到了中间输入数据的核心特征,这就完成了在自编码器中输入数据的编码过程。
然后,将输入数据的核心特征再传递到一个逆向的神经网络中,核心特征会被解压并重构,最后得到了一个和输入数据相近的输出数据,这就是自动编码器中的解码过程。
输入数据通过自动编码器模型的处理后又被重新还原了。
自动编码器模型的最大用途就是实现输入数据的清洗,比如去除输入数据中的噪声数据、对输入数据的某些关键特征进行增强和放大,等等。
2.PyTorch之自动编码实战
本节的自动编码器模型解决的是一个去除图片马赛克的问题。要训练出这个模型,首先需要生成一部分有马赛克的图片。我们知道图片是由像素点构成的,而像素点其实就是一个个的数字,我们使用的MNIST数据集中的手写图片的像素点数字的范围是0-1,所以处理马赛克的一种简单方式就是对原始图片中的像素点进行扰乱,我们在这里通过对输入的原始图片加上一个维度相同的随机数字来达到了处理马赛克的目的。
下面就可以搭建自动编码模型了,搭建自动编码模型最常用的两种方式分别是使用线性变换来构建模型中的神经网络和使用卷积变换来构建模型中的神经网络。
(1)通过线性变换实现自动编码器模型
线性变换方式仅使用线性映射和激活函数作为神经网络结构的主要组成部分。
代码中的self.encoder对应的是自动编码器中的编码部分,在这个过程中实现了输入数据的数据量从224个到128个再到64个最后到32个的压缩过程,这32个数据就是我们提取到的核心特征。
self.decoder对应的是自动编码器中的解码部分,这个过程实现了从32个到64个再到224个的逆向解压过程。
然后对定义好的模型进行训练;
因为这里我们需要衡量图片在去码之后和原始图片之间的误差,所以选择均方误差这类损失函数作为度量。
总体的训练流程是我们首先获取一个批次的图片,然后对这个批次的图片进行打码处理并裁剪到指定的像素值范围内,因为之前说过,在MNIST数据集使用的图片中每个像素点的数字值在0-1之间。在得到了经过打码处理的图片后,将其输入搭建好的自动编码器模型中,经过模型处理后输出一个预测图片,用这个预测图片和原始图片进行损失值计算,通过这个损失值对模型进行后向传播,最后就能得到去除图片马赛克效果的模型了。
(2)通过卷积变换实现自动编码器模型
卷积变换的方式仅使用卷积层、最大池化层、上采样层和激活函数作为神经网络结构的主要组成部分。
上采样层:即torch.nn.Upsample类,这个类的作用就是对我们提取到的核心特征进行解压,实现图片的重写构建,传递给它的参数一共又两个,分别是scale_factor和mode:前者用于确定解压的倍数;后者用于定义图片重构的模式,可以选择的模式有:nearset(最邻近法)、linear(线性插值法)、bilinear(双线性插值法)和trilinear(三线性插值法)。
然后对定义好的模型进行训练;
最后,我们通过使用一部分测试数据集中的图片来验证我们的模型能否正常工作。
结果显示:首先,在结果的可视性上没有问题;其次,去码效果更好,还原出来的图片内容更清晰。
第十一章 自动编码器
最新推荐文章于 2023-09-25 10:29:02 发布