欢迎光临散文网 会员登陆 & 注册

MNIST数据集上Pytorch中的卷积自编码器

2021-08-24 19:26 作者:深度之眼官方账号  | 我要投稿

从pytorch进行深度学习模型的学习系列教程已经完成前5期啦!希望大家能跟着学姐共同进步!学姐制作这部分教程就是为了大家能够在新入门的时候通过实例使 Pytorch 尽可能地更加直观和易于访问。觉得不错的就帮学姐宣传宣传吧!本篇主要内容是《MNIST数据集上Pytorch中的卷积自编码器》

自编码器提供了一种压缩图像并提取最重要信息的方法。该模型还有许多扩展以提高性能,其中一些是去噪自动编码器、变分自动编码器和生成对抗网络。请大家认真食用!


系列教程传送门

  1. Pytorch初学者教程

  2. 了解深度学习模型中的张量维度

  3. CNN和特征可视化

  4. 使用Optuna调整超参数

  5. K折交叉验证

    深入研究k折交叉验证(K fold Cross Validation)


认识自编码器


自编码器是一种无监督的深度学习算法,它学习输入数据的编码表示,然后将相同的输入重构为输出。它由编码器和解码器两个网络组成。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分更新

关注+星标+在看

不迷路看好文




MNIST数据集上Pytorch中的卷积自编码器的评论 (共 条)

分享到微博请遵守国家法律