在PyTorch中使用深度自编码器实现图像重建

人工神经网络有许多流行的变体,可用于有监督和无监督学习问题 。自编码器也是神经网络的一个变种,主要用于无监督学习问题 。
当它们在体系结构中有多个隐藏层时,它们被称为深度自编码器 。这些模型可以应用于包括图像重建在内的各种应用 。
在图像重建中,他们学习输入图像模式的表示,并重建与原始输入图像模式匹配的新图像 。图像重建有许多重要的应用,特别是在医学领域,需要从现有的不完整或有噪声的图像中提取解码后的无噪声图像 。
在本文中,我们将演示在PyTorch中实现用于重建图像的深度自编码器 。该深度学习模型将以MNIST手写数字为训练对象,在学习输入图像的表示后重建数字图像 。

在PyTorch中使用深度自编码器实现图像重建

文章插图
 
自编码器自编码器是人工神经网络的变体,通常用于以无监督的方式学习有效的数据编码 。
他们通常在一个表示学习方案中学习,在那里他们学习一组数据的编码 。网络通过学习输入数据的表示,以非常相似的方式重建输入数据 。自编码器的基本结构如下所示 。
在PyTorch中使用深度自编码器实现图像重建

文章插图
 
该体系结构通常包括输入层、输出层和连接输入和输出层的一个或多个隐藏层 。输出层与输入层具有相同数量的节点,因为它要重新构造输入 。
在它的一般形式中,只有一个隐藏层,但在深度自动编码器的情况下,有多个隐藏层 。这种深度的增加减少了表示某些函数的计算成本,也减少了学习某些函数所需的训练数据量 。其应用领域包括异常检测、图像处理、信息检索、药物发现等 。
在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)
在PyTorch中使用深度自编码器实现图像重建

文章插图
 
print(train_set.classes)
在PyTorch中使用深度自编码器实现图像重建

文章插图
 
在下一步中,我们将定义用于定义模型的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)
在PyTorch中使用深度自编码器实现图像重建

文章插图
 
现在,我们将定义损失函数和优化方法 。
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


推荐阅读