Pytorch基础-07-自动编码器

article/2025/10/7 1:52:33

自动编码器(AutoEncoder)是一种可以进行无监督学习的神经网络模型。一般而言,一个完整的自动编码器主要由两部分组成,分别是用于核心特征提取的编码部分和可以实现数据重构的解码部分。

1 自动编码器入门

在自动编码器中负责编码的部分也叫作编码器(Encoder),而负 责解码的部分也叫作解码器(Decoder)。编码器主要负责对原始的输 入数据进行压缩并提取数据中的核心特征,而解码器主要是对在编码器 中提取的核心特征进行展开并重新构造出之前的输入数据。
在这里插入图片描述
如上图就是一个简化的自动编码器模型,它的主要结构是神 经网络,该模型的最左边是用于数据输入的输入层,在输入数据通过神 经网络的层层传递之后得到了中间输入数据的核心特征,这就完成了在 自编码器中输入数据的编码过程。然后,将输入数据的核心特征再传递 到一个逆向的神经网络中,核心特征会被解压并重构,最后得到了一个 和输入数据相近的输出数据,这就是自动编码器中的解码过程。输入数 据通过自动编码器模型的处理后又被重新还原了。

我们会好奇自动编码器模型这种先编码后解码的神经网络模型到底 有什么作用,下面进行讲解。自动编码器模型的最大用途就是实现输入 数据的清洗,比如去除输入数据中的噪声数据、对输入数据的某些关键特征进行增强和放大,等等。举一个比较简单的例子,假设我们现在有 一些被打上了马赛克的图片需要进行除码处理,这时就可以通过自动编码器模型来解决这个问题。其实可以将这个除码的过程看作对数据进行除噪的过程,这也是我们接下来会实现的实践案例。下面看看具体如何实现基于PyTorch的自动编码器。

2 PyTorch之自动编码实战

2.1 通过线性变换实现自动编码器模型

完成代码:

import torch
import torchvision
from torchvision import datasets,transforms
from torch.autograd import Variable
import numpy as np
import matplotlib.pyplot as plttransform = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=[0.5],std=[0.5])])
dataset_train = datasets.MNIST(root='./data',transform = transform,train = True,download= False)
dataset_test = datasets.MNIST(root= './data',transform=transform,train=False)
train_load = torch.utils.data.DataLoader(dataset = dataset_train,batch_size=4,shuffle=True)
test_load = torch.utils.data.DataLoader(dataset = dataset_test,batch_size=4,shuffle=True)
images,label = next(iter(train_load))
print (images.shape)
images_example = torchvision.utils.make_grid(images)
images_example = images_example.numpy().transpose(1,2,0)
mean = [0.5]
std = [0.5]
images_example = images_example*std + mean
plt.imshow(images_example)
plt.show()
noisy_images = images_example + 0.5*np.random.randn(*images_example.shape)
noisy_images = np.clip(noisy_images,0.,1.)
plt.imshow(noisy_images)
plt.show()

在这里插入图片描述
在这里插入图片描述

class AutoEncoder(torch.nn.Module):def __init__(self):super(AutoEncoder, self).__init__()self.encoder = torch.nn.Sequential(torch.nn.Linear(28 * 28, 128),torch.nn.ReLU(),torch.nn.Linear(128, 64),torch.nn.ReLU(),torch.nn.Linear(64, 32),torch.nn.ReLU(),)self.decoder = torch.nn.Sequential(torch.nn.Linear(32, 64),torch.nn.ReLU(),torch.nn.Linear(64, 128),torch.nn.ReLU(),torch.nn.Linear(128, 28 * 28))def forward(self, input):output = self.encoder(input)output = self.decoder(output)return outputmodel = AutoEncoder()
print(model)optimizer = torch.optim.Adam(model.parameters())
loss_f = torch.nn.MSELoss()epoch_n = 10
for epoch in range(epoch_n):running_loss = 0print('Epoch {}/{}'.format(epoch, epoch_n))print('===' * 10)for data in train_load:X_train, _ = datanoisy_X_train = X_train + 0.5 * torch.rand(X_train.shape)noisy_X_train = torch.clamp(noisy_X_train, 0., 1.)X_train, noisy_X_train = Variable(X_train.view(-1, 28 * 28)), (noisy_X_train.view(-1, 28 * 28))train_pre = model(noisy_X_train)loss = loss_f(train_pre, X_train)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.dataprint('Loss is:{}'.format(running_loss / len(dataset_train)))

在以上代码中损失函数使用的是torch.nn.MSELoss,即计算的是均方误差,我们在之前处理的都是图片分类相关的问题,所以在这里使用交叉熵来计算损失值。而在这个问题中我们需要衡量的是图片在去码后和原始图片之间的误差,所以选择均方误差这类损失函数作为度量。总体的训练流程是我们首先获取一个批次的图片,然后对这个批次的图片进行打码处理并裁剪到指定的像素值范围内,因为之前说过,在MNIST数据集使用的图片中每个像素点的数字值在0到1之间。在得到了经过打码处理的图片后,将其输入搭建好的自动编码器模型中,经过模型处理后输出一个预测图片,用这个预测图片和原始图片进行损失值计算,通过这个损失值对模型进行后向传播,最后就能得到去除图片马赛克效果的模型了。

在每轮训练中,我们都对预测图片和原始图片计算得到的损失值进 行输出,在训练10轮之后,输出的结果如下:
在这里插入图片描述

从以上结果可以看出,我们得到的损失值在逐渐减小,而且损失值 已经在一个足够小的范围内了。最后,我们通过使用一部分测试数据集中的图片来验证我们的模型能否正常工作,代码如下:

data_loader_test = torch.utils.data.DataLoader(dataset=dataset_test,batch_size = 4,shuffle = True)
x_test,_ = next(iter(data_loader_test))img1 = torchvision.utils.make_grid(x_test)
img1 = img1.numpy().transpose(1,2,0)
std = [0.5]
mean = [0.5]
img1 =img1*std + meannoisy_x_test = img1 +0.5*np.random.randn(*img1.shape)
noisy_x_test = np.clip(noisy_x_test,0.,1.)plt.figure()
plt.imshow(noisy_x_test)img2 = x_test + 0.5*torch.randn(*x_test.shape)
img2 = torch.clamp(img2,0.,1.)img2 = Variable(img2.view(-1,28*28))test_pred = model(img2)img_test = test_pred.data.view(-1,1,28,28)
img2 = torchvision.utils.make_grid(img_test)
img2 = img2.numpy().transpose(1,2,0)
img2 = img2*std +mean
img2 = np.clip(img2,0.,1.)
plt.figure()
plt.imshow(img2)

在这里插入图片描述
在这里插入图片描述
下面是使用普通的滤波器的效果:

在这里插入图片描述
自动编码器的去噪效果,还是可圈可点的。

2.2 通过卷积变换实现自动编码器模型

以卷积变换的方式和以线性变换方式构建的自动编码器模型会有较大的区别,而且相对复杂一些,卷积变换的方式仅使用卷积层、最大池化层、上采样层和激活函数作为神经网络结构的主要组成部分,代码如下:

class AutoEncoder2(torch.nn.Module):def __init__(self):super(AutoEncoder2, self).__init__()self.encoder = torch.nn.Sequential(torch.nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size=2, stride=2),torch.nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size=2, stride=2))self.decoder = torch.nn.Sequential(torch.nn.Upsample(scale_factor=2, mode='nearest'),torch.nn.Conv2d(128, 64, kernel_size=3, stride=1, padding=1),torch.nn.ReLU(),torch.nn.Upsample(scale_factor=2, mode='nearest'),torch.nn.Conv2d(64, 1, kernel_size=3, stride=1, padding=1))def forward(self, input):output = self.encoder(input)output = self.decoder(output)return output

在以上代码中出现了一个我们之前从来没有接触过的上采样层,即 torch.nn.Upsample类。这个类的作用就是对我们提取到的核心特征进行 解压,实现图片的重写构建,传递给它的参数一共有两个,分别是 scale_factor和mode:前者用于确定解压的倍数;后者用于定义图片重构 的模式,可选择的模式有nearest、linear、bilinear和trilinear,其中nearest 是最邻近法,linear是线性插值法,bilinear是双线性插值法,trilinear是 三线性插值法。因为在我们的代码中使用的是最邻近法,所以这里通过 一张图片来看一下最邻近法的具体工作方式。
在这里插入图片描述

训练代码如下:

model = AutoEncoder2()
print(model)optimizer = torch.optim.Adam(model.parameters())
loss_f = torch.nn.MSELoss()epoch_n = 5
for epoch in range(epoch_n):running_loss = 0print('Epoch {}/{}'.format(epoch, epoch_n))print('===' * 10)for data in train_load:X_train, _ = datanoisy_X_train = X_train + 0.5 * torch.rand(X_train.shape)noisy_X_train = torch.clamp(noisy_X_train, 0., 1.)X_train, noisy_X_train = Variable(X_train), Variable(noisy_X_train)train_pre = model(noisy_X_train)loss = loss_f(train_pre, X_train)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.dataprint('Loss is:{}'.format(running_loss / len(dataset_train)))

我们在每轮训练中都对预测图片和原始图片计算得到的损失值进行 输出,在训练5轮之后,输出结果如下:
在这里插入图片描述
看一下测试效果:

data_loader_test = torch.utils.data.DataLoader(dataset=dataset_test,batch_size = 4,shuffle = True)
x_test,_ = next(iter(data_loader_test))img1 = torchvision.utils.make_grid(x_test)
img1 = img1.numpy().transpose(1,2,0)
std = [0.5]
mean = [0.5]
img1 =img1*std + meannoisy_x_test = img1 +0.5*np.random.randn(*img1.shape)
noisy_x_test = np.clip(noisy_x_test,0.,1.)plt.figure()
plt.imshow(noisy_x_test)img2 = x_test + 0.5*torch.randn(*x_test.shape)
img2 = torch.clamp(img2,0.,1.)img2 = Variable(img2)test_pred = model(img2)img_test = test_pred.data.view(-1,1,28,28)
img2 = torchvision.utils.make_grid(img_test)
img2 = img2.numpy().transpose(1,2,0)
img2 = img2*std +mean
img2 = np.clip(img2,0.,1.)
plt.figure()
plt.imshow(img2)

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/quBt49Gy.shtml

相关文章

python手工打码_python云打码

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 为什么需要了解打码平台的使用现在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取…

python你实现视频自动打码,了解妨碍你观看精彩的马赛克是怎么精准形成的

前言 嗨喽!大家好呀,这里是魔王呐~ 我们在观看视频的时候,总有一些精准得马赛克挡住我们想看得地方,严重影响我们的观影体验!! 那么这些马赛克是如何精确的加上去的呢? 本次我们就来用Python…

易语言php验证码识别,易语言自动打码验证码服务端带案例

易语言通用验证码识别服务端,用来做接口还是可以的! 将127.0.0.1改成自己的服务器IP,或者域名 php案例: $rel = file_get_contents(http://www.zhuangjiba.com/d/file/help/2018/08/cfdefaddb3f47d78f8c66a7de28720aa.png); $code = _upload($rel); echo 验证码:.$code; f…

自动打码神器是什么

自动打码神器是什么 提到自动打码神器,可能很多网友会想到答题吧自动打码平台、远程答题器等,除了这一些软件之外,还有不少我们都不知道的软件正在等待大家的发掘。今天,小编就给大家先介绍一款专门批量识别验证码的平台——答题吧…

如何用 ISO 镜像制作 U 盘安装盘(通用方法、无需 WinPE)

文章目录 ★扫盲若干【基本概念】★啥是【通用】制作方法?★为啥选择这几款工具?★rufus 的玩法(Windows 平台)★UNetbootin 的玩法(跨平台)★dd 的玩法(跨平台)★优缺点对比★读者…

利用UltraISO刻录光盘启动盘

1 介绍 虽说现在越来越倾向于使用U盘作为启动盘,但本文还是要讲一讲怎样使用UltraISO制作光盘启动盘—作为系统安装的一种方法。我不知道未来光盘会不会消失,但本文确实能起到保护历史文化遗产的作用。但我希望不要消失,就好像大家都在说纸质…

如何在Mac上。ISO映像文件刻录到DVD

ISO是普通的CD或DVD光盘映像格式基于ISO-9660标准。从原始光盘ISO映像文件包含一个精确复制的数据。它包括光盘上的文件系统的信息,如目录结构,文件属性和引导代码,以及保存的数据。如果你想知道如何创建。ISO映像,并在Mac上玩ISO…

如何使用UltraISO将光盘中的内容提取为ISO镜像

转载地址:https://newsupport.lenovo.com.cn/commonProblemsDetail.html?noteid148183 知识点分析:将光盘中的内容转换为ISO镜像以便保存到电脑中的方法。 操作步骤: 1、鼠标右击桌面上的UltraISO快捷方式图标,选择“以管理员身份运行”; …

如何刻录光盘

如何刻录光盘 1 、将光盘放入光驱,选择“用于CD/DVD播放机” ,该模式下,刻录在光盘的文件无法进行编辑和删除 2 、将需要刻录的文件拷贝至光盘内,则会在“准备好写入光盘中的文件”下显示拷贝进去的文件,此时文件还没…

如何刻录光盘文件

常识补充刻录机简介光盘刻录机是一种数据写入设备,利用激光将数据写到空光盘上从而实现数据的储存。其写入过程可以看做普通光驱读取光盘的逆过程。基本原理刻入数据时,利用高功率的激光束反射到盘片,使盘片上发生变化,模拟出二进…

balenaEtcher v1.18.1 开源跨平台镜像文件快速刻录工具

balenaEtcher 是一款开源免费的跨平台镜像文件快速刻录工具,使用体验感觉比软碟通UltraISO好用多了,推荐使用。它可以帮助用户快速将 ISO 文件、IMG 文件或者其他格式的镜像文件刻录到 USB 驱动器、SD 卡或者其他可烧录介质上。它支持 Windows、macOS 和…

使用Linux建立镜像文件与刻录光盘(mkisofs,cdrecord,wodim,isoinfo,rsync)

一、镜像文件(.iso)与光盘(CD/DVD)的关系 镜像文件用于存储文件与数据光盘是一种存储设备,需要将镜像文件进行刻录,将数据刻录到光盘光盘刻录的步骤: 第一步:使用mkisofs命令将数据创建成为一个镜像文件(iso)第二步:使…

使用最新版UltraISO将ISO镜像刻录到U盘

1. 使用最新版UltraISO将ISO镜像刻录到U盘 一定要是最新版,试用版都可以,按下图操作: 2. U盘启动电脑进入安装界面 正常情况下你应该会看到下面的这个界面: 选择第一项,然后按TAB键,然后会看到下面这个&a…

刻录U盘镜像

Windows下刻录 刻录windows镜像的话,可以用UltraISO软碟通https://cn.ultraiso.net/ 可以无限试用 (1) 打开一个镜像文件XXX.ios (2) menu->启动->写入硬盘映像 (3)会自动识别U盘&#x…

如何利用UltraISO将系统镜像刻录到U盘上

【阅读文章申明】 作者只是想把自己实践中的经验分享给大家,如果文章里面有在大神面前显的很低级的知识点。那么大神你可以不看,请不要发一些“浪费流量”“辣鸡”之类嘲讽的话,这也不是交流的一种方式。每一篇文章都是作者自己。截图&#x…

Rufus刻录大于4G系统镜像

系统安装刻录U盘时经常会遇到ISO大于4G,使用UltraISO等工具无法刻录的问题。今天给大家介绍一款小巧好用的U盘刻录工具Rufus,Rufus相对于软碟通可以刻录UEFI系统,可以刻录大于4G系统镜像。 1、下载地址 Index of /downloadshttp://rufus.ie…

【Linux】Linux环境下制作ISO镜像与刻录U盘

文章目录 前言一、工具包安装二、自定义镜像文件2.1 拷贝2.2 更新软件包2.3 ks文件与启动项修改2.4 制作ISO文件 三、制作USB启动盘(刻录U盘)3.1 插入U盘3.2 格式化U盘分区3.3 写入镜像 四、总结 前言 本文是记录下在Linux环境下制作系统镜像文件&#…

U盘镜像刻录(制作U盘启动盘)

一、下载镜像刻录软件 UItralSO刻录 链接:https://pan.baidu.com/s/1TVLdHxPGtPzlfRyxyHvsog 提取码:uuny 二、刻录系统ISO文件 1、点击菜单栏的文件,打开要安装的ISO文件 2、插入U盘,刻录前,先格式化 右键U盘&…

Vitis开发笔记:将镜像刻录到SD卡

一、方法1:windows系统下 1. 安装Win32DiskImager.exe工具 下载链接: http://sourceforge.net/projects/win32diskimager/ 2. 如下图所示 步骤1:浏览 镜像 文件的路径 步骤 2:选择 SD 卡分区作为设备(必须小心选择&am…

将镜像刻录到U盘的方法

将镜像刻录到U盘的方法 1.利用到的工具:UltraISO,根据ISO的大小,选择适当的U盘一个(之前要进行格式化); 2.将准备刻录的所有ISO文件放在一个文件夹下; 3.打开…