MNIST数据集上Pytorch中的卷积自编码器
从pytorch进行深度学习模型的学习系列教程已经完成前5期啦!希望大家能跟着学姐共同进步!学姐制作这部分教程就是为了大家能够在新入门的时候通过实例使 Pytorch 尽可能地更加直观和易于访问。觉得不错的就帮学姐宣传宣传吧!本篇主要内容是《MNIST数据集上Pytorch中的卷积自编码器》
自编码器提供了一种压缩图像并提取最重要信息的方法。该模型还有许多扩展以提高性能,其中一些是去噪自动编码器、变分自动编码器和生成对抗网络。请大家认真食用!
系列教程传送门
认识自编码器
自编码器是一种无监督的深度学习算法,它学习输入数据的编码表示,然后将相同的输入重构为输出。它由编码器和解码器两个网络组成。Encoder将高维输入压缩为低维潜在代码,也称为潜在代码或编码空间,以从中提取最相关的信息,而Decoder则对编码数据进行解压缩并重新创建原始输入。
这种架构的目标是在编码时最大化信息并最小化重构误差。
重构误差是什么?重构误差也可以叫重构损失,通常是输入为实值时,重构输入与原始输入之间的均方误差。如果输入数据是分类数据,则使用的损失函数是交叉熵损失。
导入库和MNIST数据集
使用torchvision库导入数据集,下载训练和测试数据集,并将图像数据集转换为Tensor。
不需要对图像进行标准化,因为数据集包含彩色图像,在将训练数据集划分为训练集和验证集之后,random_split这为这两个集提供了一个随机分区。DataLoader用于创建训练,验证和测试集数据加载器,数据加载器被分割成小批量。batchsize是该模型的训练过程中每次迭代中使用的样本的数目。
定义卷积自编码器
在这里用卷积层定义自动编码器。
卷积自编码器由两类组成:一类用于编码器,一类用于解码器。
编码器将包含三个卷积层和两个全连接层。
添加了一些批处理规范层作为正则化器,解码器将具有相同的架构,但顺序相反。
初始化损失函数和优化器
我们需要在训练自动编码器之前定义构建块:
torch.device 使用 GPU 等硬件加速器训练模型
在Encoder与Decoder网络中,将被移动到的设备
nn.MSEloss 和 torch.optim.Adam

训练模型和评估模型
我们定义了一个函数来训练 AE 模型。
首先,将输入图像传递给编码器。
然后,编码后的数据被传递给编码器,我们用loss_fn(x_hat,x)计算重构损失。在我们清除梯度以不累积其他值后,我们执行反向传播。
最后,我们通过调用opt.step()来计算梯度。

创建训练函数后,定义一个函数来评估模型的性能。同上我们将图像传递给编码器,编码后的图像被传递给解码器。
然后,将所有图像批次和重建存储到两个不同的列表中,用于计算测试损失。

还有一个想法是:训练的每个时期看到重建的图像,目的是了解自动编码器如何从输入图像中学习。

接下来将测试代码分解考虑规划:
test_dataset[i][0].unsqueeze(0)用于从测试数据集中提取第i个图像,然后在0轴上增加1维,此步骤需要将图像传递给自动编码器。
decoder(encoder(img))用于获得重建图像。
plt.imshow(img.cpu().squeeze().numpy())用于绘制原始图像。
squeeze()删除之前添加的维度,对于可视化图像至关重要。
numpy()将tensor转换为ndarray,这是函数plt.imshow接受的唯一对象类型。
numpy()将tensor对象的副本返回到CPU内存中。
现在正式开始在训练集上训练模型,并在验证集上对其进行评估了:


大家注意到自动编码器能够在30个epoch后很好地重建图像,即使存在一些缺陷。因为这个模型相对简单,所以看起来表现很好。
现在模型已经训练完毕,我们要对测试集进行最终评估:


利用下面的代码我们可以得出到重建损失在各个时期是如何减少的:


从潜在代码生成新样本
为了从潜在代码生成新图像,我们定义了一个从潜在空间均匀采样的函数。这些样本将被传递到解码器,解码器将创建重建的图像。


要绘制这些重建图,我们需要知道潜在空间的范围,可以在下面潜在空间可视化部分中看到。
从图上我们可以看到,在图的左下角,数字没有意义。实际上,点 (-1,-1) 处的潜在空间是空的。
用t-SNE可视化潜在空间
观察动态可视化来查看自编码器学习到的潜在空间。接下来首先,使用测试集创建编码样本。

现在使用plotly express库绘制潜在空间,代码如下:

从上面图里,可以看出相似的数字聚集在一起,例如“4”与“9”和“5”重叠。

为了易读,我们可以应用称为t-SNE的降维来可视化二维空间中的潜在代码。那么现在我们将固定组件的数量等于 2:


上图中清楚地区分了一个数字和另一个数字。除了其他类别的点有一些例外,但与之前的表示相比,t-SNE仍然是一个改进。

实现卷积自编码器基础教程到这里就结束了,本节教程你是否掌握了?如果没有就敲敲代码尝试尝试吧!
代码:
https://github.com/eugeniaring/Pytorch-tutorial/blob/main/convAE.ipynb
原文链接:
https://medium.com/dataseries/convolutional-autoencoder-in-pytorch-on-mnist-dataset-d65145c132ac#d75c
每天18:30分更新
关注+星标+在看
不迷路看好文


