vae学习

vae学习

模型架构原理下图一图说明:
在这里插入图片描述

loss function包含了两个部分:

Minimize1:
1 2 ∑ k ( x k ^ − x k ) 2 \frac{1}{2} {\textstyle \sum_{k}^{}} (\hat{x_k} -x_k)^2 21k(xk^xk)2
即使得输出与输入最大程度接近

Minimize2:
c = ∑ i = 1 3 ( e σ i − ( 1 + σ i ) + ( m i ) 2 ) c=\sum_{i=1}^{3}\left(e^{\sigma_{i}}-\left(1+\sigma_{i}\right)+\left(m_{i}\right)^{2}\right) c=i=13(eσi(1+σi)+(mi)2)
限制项,防止分配给噪声的权重趋近于0

首先需要将input输入一个NN encoder来计算两组编码:均值编码 ( m 1 , m 2 , m 3 ) (m_{1},m_{2},m_{3}) (m1,m2,m3)和方差编码 ( σ 1 , σ 2 , σ 3 ) (\sigma_{1},\sigma_{2},\sigma_{3}) (σ1,σ2,σ3),方差编码为噪声编码 ( e 1 , e 2 , e 3 ) (e_{1},e_{2},e_{3}) (e1,e2,e3)分配权重,将编码 m m m与噪声编码叠加后的到新的 ( c 1 , c 2 , c 3 ) (c_{1},c_{2},c_{3}) (c1,c2,c3),再送入NN Decoder中,Decoder学习使重构误差达到最小。

import torch
import visdom
from torch.utils.data import DataLoader
from torch import nn, optim
from torchvision import transforms, datasets

class VAE(nn.Module):

    def __init__(self):
        super(VAE, self).__init__()
        # [b, 784] => [b, 20]
        # u: [b, 10]
        # sigma: [b, 10]
        self.encoder = nn.Sequential(
            nn.Linear(784, 256),
            nn.ReLU(),
            nn.Linear(256, 64),
            nn.ReLU(),
            nn.Linear(64, 20),
            nn.ReLU()
        )
        # [b, 20] => [b, 784]
        self.decoder = nn.Sequential(
            nn.Linear(10, 64),
            nn.ReLU(),
            nn.Linear(64, 256),
            nn.ReLU(),
            nn.Linear(256, 784),
            nn.Sigmoid()
        )

        self.criteon = nn.MSELoss()

    def forward(self, x):
        """
        :param x: [b, 1, 28, 28]
        :return:
        """
        batchsz = x.size(0)
        # flatten
        x = x.view(batchsz, 784)
        # encoder输出均值和方差,shape为[b, 20], 
        h_ = self.encoder(x)
        # [b, 20] => [b, 10] and [b, 10] 把均值和方差分出来
        mu, sigma = h_.chunk(2, dim=1)
        # 采样过程的重参数技巧
        h = mu + sigma * torch.randn_like(sigma)
        
        # decoder: predicting result
        x_hat = self.decoder(h)
        x_hat = x_hat.view(batchsz, 1, 28, 28)
        # KL散度,即minimize2
        kld = 0.5 * torch.sum(torch.pow(mu, 2) + torch.pow(sigma, 2) - torch.log(1e-8 + torch.pow(sigma, 2)) - 1) / (batchsz*28*28)

        return x_hat, kld
def main():
    mnist_train = datasets.MNIST('mnist',True,
                                 transform=transforms.Compose([transforms.ToTensor()]), )
                                 #download=True)
    mnist_train = DataLoader(mnist_train, batch_size=32, shuffle=True)
    mnist_test = datasets.MNIST('mnist', False,
                                transform=transforms.Compose([transforms.ToTensor()]), download=True)
    mnist_test = DataLoader(mnist_test, batch_size=32, shuffle=True)

    x, _ = iter(mnist_train).next()
    print('x:', x.shape)

    device = torch.device('cuda')

    model = VAE().to(device)
    criteon = nn.MSELoss()
    optimizer = optim.Adam(model.parameters(), lr=1e-3)
    print(model)

    viz = visdom.Visdom()

    for epoch in range(1000):

        for batchidx, (x,) in enumerate(mnist_train):
            # [b, 1, 28, 28]
            x = x.to(device)
            x_hat, kld = model(x)

            # 重构误差 minimize1
            loss = criteon(x_hat, x)

            if kld is not None:
                elbo = - loss - 1.0 * kld
                loss = - elbo # 总的loss

            # backprop
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        print(epoch, 'loss:', loss.item(), 'kld:', kld.item())

        x, _ = iter(mnist_test).next()
        x = x.to(device)
        with torch.no_grad():
            x_hat, kld = model(x)
        viz.images(x, nrow=8, win='x', opts=dict(title='x'))
        viz.images(x_hat, nrow=8, win='x_hat', opts=dict(title='x_hat'))
        

训练时如果不加载visdom的服务器会报错:
运行

Python -m visdom.server
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习生成模型VAE(Variational Autoencoder)是一种基于神经网络的生成模型。VAE在产生新数据的时候是基于已有数据来做的,通过学习数据的潜在空间表示,然后从该空间中采样生成新的数据样本。VAE模型结合了自编码器和变分推断的思想,通过最大化样本的下界来优化模型参数,使得生成的样本能够更好地拟合原始数据分布。 与传统的自编码器相比,VAE在编码器部分引入了一个均值向量和方差向量,这样可以使得编码后的潜在表示服从一个高斯分布。这种设计使得VAE不仅能够学习到数据的低维表示,还能够通过在潜在空间中进行采样来生成新的样本。VAE模型的损失函数由重构误差项和正则化项组成,通过最小化该损失函数可以使得生成的样本能够尽可能地接近原始数据分布。 尽管VAE在生成新数据方面的效果相对于其他模型可能有些模糊,但它在学习数据分布和生成新数据方面仍然具有一定的优势。通过使用变分推断和重参数化技巧,VAE能够生成具有多样性的样本,并且能够在潜在空间中进行插值和操作,从而得到更多样化的结果。 总结来说,VAE是一种深度学习生成模型,通过学习数据的潜在空间表示,可以生成新的样本。它结合了自编码器和变分推断的思想,并通过最大化样本的下界来优化模型参数。尽管生成的样本可能有些模糊,但VAE学习数据分布和生成多样化样本方面具有一定的优势。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值