人工神经网络有许多流行的变体,可用于有监督和无监督学习问题 。自编码器也是神经网络的一个变种,主要用于无监督学习问题 。
当它们在体系结构中有多个隐藏层时,它们被称为深度自编码器 。这些模型可以应用于包括图像重建在内的各种应用 。
在图像重建中,他们学习输入图像模式的表示,并重建与原始输入图像模式匹配的新图像 。图像重建有许多重要的应用,特别是在医学领域,需要从现有的不完整或有噪声的图像中提取解码后的无噪声图像 。
在本文中,我们将演示在PyTorch中实现用于重建图像的深度自编码器 。该深度学习模型将以MNIST手写数字为训练对象,在学习输入图像的表示后重建数字图像 。
文章插图
自编码器自编码器是人工神经网络的变体,通常用于以无监督的方式学习有效的数据编码 。
他们通常在一个表示学习方案中学习,在那里他们学习一组数据的编码 。网络通过学习输入数据的表示,以非常相似的方式重建输入数据 。自编码器的基本结构如下所示 。
文章插图
该体系结构通常包括输入层、输出层和连接输入和输出层的一个或多个隐藏层 。输出层与输入层具有相同数量的节点,因为它要重新构造输入 。
在它的一般形式中,只有一个隐藏层,但在深度自动编码器的情况下,有多个隐藏层 。这种深度的增加减少了表示某些函数的计算成本,也减少了学习某些函数所需的训练数据量 。其应用领域包括异常检测、图像处理、信息检索、药物发现等 。
在PyTorch中实现深度自编码器首先,我们将导入所有必需的库 。
import osimport torch import torchvisionimport torch.nn as nnimport torchvision.transforms as transformsimport torch.optim as optimimport matplotlib.pyplot as pltimport torch.nn.functional as Ffrom torchvision import datasetsfrom torch.utils.data import DataLoaderfrom torchvision.utils import save_imagefrom PIL import Image
现在,我们将定义超参数的值 。Epochs = 100Lr_Rate = 1e-3Batch_Size = 128
以下函数将用于PyTorch模型所需的图像转换 。transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))])
使用下面的代码片段,我们将下载MNIST手写数字数据集,并为进一步处理做好准备 。train_set = datasets.MNIST(root='./data', train=True, download=True, transform=transform)test_set = datasets.MNIST(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(train_set, Batch_Size=Batch_Size, shuffle=True)test_loader = DataLoader(test_set, Batch_Size=Batch_Size, shuffle=True)
让我们看看关于训练数据及其类的一些信息 。print(train_set)
文章插图
print(train_set.classes)
文章插图
在下一步中,我们将定义用于定义模型的Autoencoder类 。
class Autoencoder(nn.Module):def __init__(self):super(Autoencoder, self).__init__()#编码器self.enc1 = nn.Linear(in_features=784, out_features=256) # Input image (28*28 = 784)self.enc2 = nn.Linear(in_features=256, out_features=128)self.enc3 = nn.Linear(in_features=128, out_features=64)self.enc4 = nn.Linear(in_features=64, out_features=32)self.enc5 = nn.Linear(in_features=32, out_features=16)#解码器self.dec1 = nn.Linear(in_features=16, out_features=32)self.dec2 = nn.Linear(in_features=32, out_features=64)self.dec3 = nn.Linear(in_features=64, out_features=128)self.dec4 = nn.Linear(in_features=128, out_features=256)self.dec5 = nn.Linear(in_features=256, out_features=784) # Output image (28*28 = 784)def forward(self, x):x = F.relu(self.enc1(x))x = F.relu(self.enc2(x))x = F.relu(self.enc3(x))x = F.relu(self.enc4(x))x = F.relu(self.enc5(x))x = F.relu(self.dec1(x))x = F.relu(self.dec2(x))x = F.relu(self.dec3(x))x = F.relu(self.dec4(x))x = F.relu(self.dec5(x))return x
现在,我们将创建Autoencoder模型作为上面定义的Autoencoder类的一个对象 。model = Autoencoder()print(model)
文章插图
现在,我们将定义损失函数和优化方法 。
criterion = nn.MSELoss()optimizer = optim.Adam(net.parameters(), lr=Lr_Rate)
以下函数将启用CUDA环境 。def get_device():if torch.cuda.is_available():device = 'cuda:0'else:device = 'cpu'return device
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 使用Pytorch和Matplotlib可视化卷积神经网络的特征
- 火山爆发啦 这座火山随时可能爆发
- 为什么说读书的人越来越少?
- 人脑中控制人平衡力的是什么?
- JavaScript的深拷贝实现
- 火星内部全是外星人 外星人不存在的证据
- 爱斯基摩人真的存在吗 爱摩斯基人还存在吗
- 月球发现外星生命 月球是人造卫星吗
- 无脊椎动物有哪几种 有哪些无脊椎动物
- 什么是几亿年前大量的低等生物经过长期复杂变化形成的 单细胞生物最早出现在地球上的时间