Pytorchでオートエンコーダー
Pytorchでオートエンコーダーを作ります。
多分オートエンコーダーだと思う。
オートエンコーダーについて調べ中。。。
下の図のようなはず。。。

結果
input

output

プログラム
import torch
from torch import nn, optim
from torch.utils.data import Dataset, DataLoader,TensorDataset
from torchvision import transforms
from torchvision.utils import save_image
from torchvision.datasets import MNIST
mnist_train = MNIST("MNIST", train=True, download=True, transform= transforms.ToTensor())
mnist_test = MNIST("MNIST", train=False, download=True, transform= transforms.ToTensor())
batch_size = 32
train_loader = DataLoader(mnist_train, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(mnist_test, batch_size=batch_size, shuffle=True)
class autoencoder(nn.Module):
def __init__(self):
super(autoencoder, self).__init__()
self.encode_net = nn.Sequential(
nn.Linear(28*28, 256),
nn.ReLU(),
nn.Linear(256, 64)
)
self.decode_net = nn.Sequential(
nn.Linear(64, 256),
nn.ReLU(),
nn.Linear(256, 28*28)
)
def forward(self, x):
out = self.encode_net(x)
out = self.decode_net(out)
return out
device = 'cuda' if torch.cuda.is_available() else 'cpu'
net = autoencoder().to(device)
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
num_epochs = 30
train_loss_list = []
val_loss_list = []
for epoch in range(num_epochs):
train_loss = 0
train_acc = 0
val_loss = 0
val_acc = 0
net.train()
for i, (images, labels) in enumerate(train_loader):
images = images.to(device)
optimizer.zero_grad()
images = images.view(images.size(0), -1)
outputs = net.forward(images)
loss = criterion(outputs, images)
train_loss += loss.item()
loss.backward()
optimizer.step()
avg_train_loss = train_loss / len(train_loader.dataset)
net.eval()
with torch.no_grad():
for i, (images, labels) in enumerate(test_loader):
images = images.to(device)
images = images.view(images.size(0), -1)
outputs = net.forward(images)
loss = criterion(outputs, images)
val_loss += loss.item()
if epoch == 0 or (epoch+1) % 10 == 0:
images = images.view(images.size(0), 1, 28, 28)
save_image(images, 'p3inputs_{}_{}.png'.format(epoch+1,num_epochs))
outputs = outputs.view(outputs.size(0), 1, 28, 28)
save_image(outputs, 'p3autoencode_{}_{}.png'.format(epoch+1,num_epochs))
avg_val_loss = val_loss / len(test_loader.dataset)
train_loss_list.append(avg_train_loss)
val_loss_list.append(avg_test_loss)
print('Epoch[{}], train_loss:{:.4f}, val_loss:{:.4f}'
.format(epoch+1, avg_train_loss, avg_val_loss))

