pytorch-day10(AutoEncoder&VAE)
1、AutoEncoder
Why needed Unsupervised Learning?(如何利用好这些无监督数据,从重建自己的过程中,发现数据的模态)

AutoEncoder:

How to Train?

PCA VS Auto-Encoders:

2、AutoEncoder 变体
2.1、Denoising AutoEncoders

2.2、Dropout AutoEncoders

2.3、Adversarial AutoEncoders

method 1 :

method 2:

KL:


正态分布的情况:

q~N(0,1)时,实现如下:

问题:Sample() is not differentiable
解决:



Generative model:


3、AE的实现
ae.py:
1 import torch 2 from torch import nn 3 4 5 class AE(nn.Module): 6 def __init__(self): 7 super(AE, self).__init__() 8 9 # [b, 784] => [b, 20] 10 self.encoder = nn.Sequential( 11 nn.Linear(784, 256), 12 nn.ReLU(), 13 nn.Linear(256, 64), 14 nn.ReLU(), 15 nn.Linear(64, 20), 16 nn.ReLU() 17 ) 18 # [b, 20] => [b, 784] 19 self.decoder = nn.Sequential( 20 nn.Linear(20, 64), 21 nn.ReLU(), 22 nn.Linear(64, 256), 23 nn.ReLU(), 24 nn.Linear(256, 784), 25 nn.Sigmoid() # 把像素压缩到0-1 26 ) 27 28 def forward(self, x): 29 batchsz = x.size(0) 30 # flatten 31 x = x.view(batchsz, 784) 32 # encoder 33 x = self.encoder(x) 34 # decoder 35 x = self.decoder(x) 36 # reshape 37 x = x.view(batchsz, 1, 28, 28) 38 39 return x, None
main.py:
1 import torch 2 from torch.utils.data import DataLoader 3 from torch import nn, optim 4 from torchvision import transforms, datasets 5 import visdom 6 from ae import AE 7 8 9 def main(): 10 mnist_train = datasets.MNIST('mnist', True, transform=transforms.Compose([ 11 transforms.ToTensor() 12 ]), download=True) 13 mnist_train = DataLoader(mnist_train, batch_size=32, shuffle=True) 14 15 mnist_test = datasets.MNIST('mnist', False, transform=transforms.Compose([ 16 transforms.ToTensor() 17 ]), download=True) 18 mnist_test = DataLoader(mnist_test, batch_size=32, shuffle=True) 19 20 # x, _ = iter(mnist_train).next() # 这里不需要label 21 # print('x:', x.shape) # x: torch.Size([32, 1, 28, 28]) 22 23 viz = visdom.Visdom() 24 25 model = AE() 26 criteon = nn.MSELoss() 27 optimizer = optim.Adam(model.parameters(), lr=1e-3) 28 print(model) 29 30 for epoch in range(1000): 31 for batchidx, (x, _) in enumerate(mnist_train): # mnist_train 32 # [b, 1, 28, 28] 33 34 x_hat, kld = model(x) 35 loss = criteon(x_hat, x) 36 37 optimizer.zero_grad() 38 loss.backward() 39 optimizer.step() 40 41 print(epoch, 'loss:', loss.item()) 42 43 x, _ = iter(mnist_test).next() # mnist_test 44 with torch.no_grad(): 45 x_hat, kld = model(x) 46 viz.images(x, nrow=8, win='x', opts=dict(title='x')) 47 viz.images(x_hat, nrow=8, win='x_hat', opts=dict(title='x_hat')) 48 49 50 if __name__ == '__main__': 51 main()
4、VAE的实现
vae.py:
1 import torch 2 from torch import nn 3 4 5 class VAE(nn.Module): 6 7 def __init__(self): 8 super(VAE, self).__init__() 9 10 # [b, 784] => [b, 20] 11 # u: [b, 10] 12 # sigma: [b, 10] 13 self.encoder = nn.Sequential( 14 nn.Linear(784, 256), 15 nn.ReLU(), 16 nn.Linear(256, 64), 17 nn.ReLU(), 18 nn.Linear(64, 20), 19 nn.ReLU() 20 ) 21 # [b, 20] => [b, 784] 22 self.decoder = nn.Sequential( 23 nn.Linear(10, 64), # 与encoder的最后一层并不对应 24 nn.ReLU(), 25 nn.Linear(64, 256), 26 nn.ReLU(), 27 nn.Linear(256, 784), 28 nn.Sigmoid() 29 ) 30 31 self.criteon = nn.MSELoss() 32 33 def forward(self, x): 34 batchsz = x.size(0) 35 # flatten 36 x = x.view(batchsz, 784) 37 # encoder 38 # [b, 20], including mean and sigma 39 h_ = self.encoder(x) 40 # [b, 20] => [b, 10] and [b, 10] 41 mu, sigma = h_.chunk(2, dim=1) # 张量分块,返回一个张量列表,按列分成2块 42 print(mu.size(),sigma.size()) 43 # reparametrize trick, epison~N(0, 1) 解决sample不可导问题 44 h = mu + sigma * torch.randn_like(sigma) # torch.randn_like():生成一个shape相同的随机矩阵 *:均值为0、方差为1的正态分布 45 46 # decoder 47 x_hat = self.decoder(h) 48 # reshape 49 x_hat = x_hat.view(batchsz, 1, 28, 28) 50 51 kld = 0.5 * torch.sum( # 在网上找公式来实现就行(q~N(0,1)时) 52 torch.pow(mu, 2) + 53 torch.pow(sigma, 2) - 54 torch.log(1e-8 + torch.pow(sigma, 2)) - 1 55 ) / (batchsz * 28 * 28) 56 57 return x_hat, kld
main.py:
1 import torch 2 from torch.utils.data import DataLoader 3 from torch import nn, optim 4 from torchvision import transforms, datasets 5 import visdom 6 from vae import VAE 7 8 9 def main(): 10 mnist_train = datasets.MNIST('mnist', True, transform=transforms.Compose([ 11 transforms.ToTensor() 12 ]), download=True) 13 mnist_train = DataLoader(mnist_train, batch_size=32, shuffle=True) 14 15 mnist_test = datasets.MNIST('mnist', False, transform=transforms.Compose([ 16 transforms.ToTensor() 17 ]), download=True) 18 mnist_test = DataLoader(mnist_test, batch_size=32, shuffle=True) 19 20 # x, _ = iter(mnist_train).next() 21 # print('x:', x.shape) 22 23 viz = visdom.Visdom() 24 25 # device = torch.device('cuda') 26 model = VAE() 27 criteon = nn.MSELoss() 28 optimizer = optim.Adam(model.parameters(), lr=1e-3) 29 print(model) 30 31 for epoch in range(1000): 32 for batchidx, (x, _) in enumerate(mnist_train): 33 # [b, 1, 28, 28] 34 35 x_hat, kld = model(x) 36 loss = criteon(x_hat, x) 37 38 if kld is not None: 39 elbo = - loss - 1.0 * kld 40 loss = - elbo 41 42 # backprop 43 optimizer.zero_grad() 44 loss.backward() 45 optimizer.step() 46 47 print(epoch, 'loss:', loss.item(), 'kld:', kld.item()) 48 49 x, _ = iter(mnist_test).next() 50 with torch.no_grad(): 51 x_hat, kld = model(x) 52 viz.images(x, nrow=8, win='x', opts=dict(title='x')) 53 viz.images(x_hat, nrow=8, win='x_hat', opts=dict(title='x_hat')) 54 55 56 if __name__ == '__main__': 57 main()

浙公网安备 33010602011771号