神经网络的
import torch
import torch.nn as nn
import torch.utils.data as Data
from torchvision.datasets import MNIST
from torchvision import transforms as tfs
import matplotlib.pyplot as plt
import numpy as np
train_data = MNIST(root='./mnist/',train=True,transform=tfs.ToTensor())
print(train_data.train_data.size())
print(train_data.train_labels.size())
plt.imshow(train_data.train_data[0].numpy())
plt.show()
train_loader = Data.DataLoader(dataset=train_data, batch_size=64, shuffle=True)
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(784, 400),
nn.ReLU(True),
nn.Linear(400, 200),
nn.ReLU(True),
nn.Linear(200, 100),
nn.ReLU(True),
nn.Linear(100,3)
)
self.decoder = nn.Sequential(
nn.Linear(3, 100),
nn.ReLU(True),
nn.Linear(100, 200),
nn.ReLU(True),
nn.Linear(200, 400),
nn.ReLU(True),
nn.Linear(400, 784),
nn.Tanh()
)
def forward(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return encoded, decoded
autoencoder = Autoencoder()
optimizer = torch.optim.Adam(autoencoder.parameters(), lr=0.005)
loss_func = nn.MSELoss()
f, a = plt.subplots(2, 10, figsize=(10, 2))
plt.ion()
view_data = train_data.train_data[:10].view(-1, 28*28).type(torch.Tensor)/255
for i in range(10):
a[0][i].imshow(np.reshape(view_data.data.numpy()[i], (28, 28)))
a[0][i].set_xticks(())
a[0][i].set_yticks(())
for epoch in range(10):
for step, (x, b_label) in enumerate(train_loader):
b_x = x.view(-1, 28*28)
b_y = x.view(-1, 28*28)
encoded, decoded = autoencoder(b_x)
loss = loss_func(decoded, b_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if step % 100 == 0:
print('Epoch: ', epoch, '| train loss: %.4f' % loss.data.numpy())
encoded_data, decoded_data = autoencoder(view_data)
for i in range(10):
a[1][i].clear()
a[1][i].imshow(np.reshape(decoded_data.data.numpy()[i], (28, 28)))
a[1][i].set_xticks(()); a[1][i].set_yticks(())
plt.draw(); plt.pause(0.05)
plt.ioff()
plt.show()
卷积自动编码器
import torch
import torch.nn as nn
import torch.utils.data as Data
from torchvision.datasets import MNIST
from torchvision import transforms as tfs
import matplotlib.pyplot as plt
import numpy as np
train_data = MNIST(root='./mnist/',train=True,transform=tfs.ToTensor())
print(train_data.train_data.size())
print(train_data.train_labels.size())
plt.imshow(train_data.train_data[0].numpy())
plt.show()
train_loader = Data.DataLoader(dataset=train_data, batch_size=64, shuffle=True)
class conv_autoencoder(nn.Module):
def __init__(self):
super(conv_autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Conv2d(1, 16, kernel_size=3, stride=3, padding=1),
nn.ReLU(True),
nn.MaxPool2d(2, stride=2),
nn.Conv2d(16, 8, kernel_size=3, stride=2, padding=1),
nn.ReLU(True),
nn.MaxPool2d(2, stride=1)
)
self.decoder = nn.Sequential(
nn.ConvTranspose2d(8, 16, kernel_size=3, stride=2),
nn.ReLU(True),
nn.ConvTranspose2d(16, 8, kernel_size=5, stride=3, padding=1),
nn.ReLU(True),
nn.ConvTranspose2d(8, 1, kernel_size=2, stride=2, padding=1),
nn.Tanh()
)
def forward(self, x):
encode = self.encoder(x)
decode = self.decoder(encode)
return encode, decode
autoencoder = conv_autoencoder()
optimizer = torch.optim.Adam(autoencoder.parameters(), lr=0.005)
loss_func = nn.MSELoss()
for epoch in range(1):
for step, (x, b_label) in enumerate(train_loader):
b_x = x
b_y = x
encoded, decoded = autoencoder(b_x)
loss = loss_func(decoded, b_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if step % 100 == 0:
print('Epoch: ', epoch, '| train loss: %.4f' % loss.data.numpy())
f, a = plt.subplots(2, 10, figsize=(10, 2))
plt.ion()
view_data = train_data.train_data[:10].view(-1,1,28,28).type(torch.Tensor)/255.
for i in range(10):
a[0][i].imshow(np.reshape(view_data.data.numpy()[i], (28, 28)))
a[0][i].set_xticks(())
a[0][i].set_yticks(())
encoded_data, decoded_data = autoencoder(view_data)
for i in range(10):
a[1][i].clear()
a[1][i].imshow(np.reshape(decoded_data.data.numpy()[i], (28, 28)))
a[1][i].set_xticks(())
a[1][i].set_yticks(())
plt.draw()
plt.pause(0.05)
plt.ioff()
plt.show()