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()
main.py

 

posted @ 2020-08-03 21:06  小吴的日常  阅读(216)  评论(0)    收藏  举报