
【pytorchで深層生成モデル#4】pytorchでAE
記事の目的
深層生成モデルのAE(AutoEncoder)をpytorchを使用して実装していきます。ここにある全てのコードは、コピペで再現することが可能です。
目次
1 今回のモデル

2 準備

# [1]
!nvidia-smi
# [2]
# データ作成に使用するライブラリ
from torchvision import datasets
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
# モデル作成に使用するライブラリ
import torch
import torch.nn as nn
import torch.optim as optim
# モデルの可視化に使用するライブラリ
import matplotlib.pyplot as plt
torch.manual_seed(10)
# [3]
# データセットの作成
transform = transforms.Compose([transforms.ToTensor(), lambda x: x.view(-1)])
root = './data'
mnist_dataset = datasets.MNIST(root=root,download=True,train=True,transform=transform)
dataloader = DataLoader(mnist_dataset, batch_size=100,shuffle=True)
# [4]
# gpuの指定
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
device
3 モデル

# [5]
class AE(nn.Module):
def __init__(self):
super().__init__()
self.l1 = nn.Linear(784, 256)
self.l2 = nn.Linear(256, 784)
def forward(self, x):
x = self.l1(x)
z = torch.relu(x)
z = self.l2(z)
y = torch.sigmoid(z)
return y
# [6]
model = AE().to(device)
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters())
4 モデルの学習

# [7]
n_epoch = 10
for epoch in range(n_epoch):
loss_mean = 0.
for (x, t) in dataloader:
# 学習準備
x = x.to(device)
model.train()
# モデルの学習
x_fake = model(x)
loss = criterion(x_fake, x)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 損失関数の計算
loss_mean += loss.item()
loss_mean /= len(dataloader)
print('Epoch: {}, Loss: {:.3f}'.format(epoch+1, loss_mean))
5 画像の生成

# [8]
# 元データの可視化
x, t = next(iter(dataloader))
real_image = x[0,].view(28,28).detach().numpy()
plt.imshow(real_image, cmap='binary_r')
plt.axis('off')
# [9]
# 生成データの可視化
model.eval()
x = x.to(device)
fake_image = model(x)[0,].view(28,28).detach().cpu().numpy()
plt.imshow(fake_image, cmap='binary_r')
plt.axis('off')