28.AutoEncoder

回顾:CNN处理位置相关性,RNN在时间维度上共享权值,还分析了RNN存在的问题:梯度爆炸和梯度离散。
增强学习Reinforcement learning
与外界进行交互,例如游戏。
监督学习supervised learning
无监督学习unsupervised learning/predict learning
为什么需要无监督学习
1.减少维度

AutoEncoder

在这里插入图片描述

重建自己:输入和输出的维度一样,最中间有一个neck,可用于升维或者降维
在这里插入图片描述
重建图片-输入图像
在这里插入图片描述

AutoEncoder的变种

denoising encoder、dropout encoder和adversarial encoder
在这里插入图片描述

在这里插入图片描述
当dropout为0时,loss是最低的,但accuracy可能不是最高的,因为此时可能发生overfitting,导致模型也记住了一些噪声。

在这里插入图片描述
从分布图中可以看到,encoder h的分布不属于常见的一些分布,但是我们希望它的均值为0,方差是某个特定的数,这样在做generation时,可以更好的控制y轴值h的变化,使h在-1到1内满足某种分布。
但是假如在这个范围内,我们重建的图片和原来一样或者不满足某种分布:
在这里插入图片描述

在这里插入图片描述
前半部分:
在∅网络下,xi在z下的概率最大,loss最小。
z是来自于pθ网络,在给定xi得到的z的概率,在该分布下,我们要求在∅网络下,xi在z下的概率最大的情况,此时最接近于真实分布。这就是重建xi。
也可以理解为使得(x ̅i-xi )的值最小。
后半部分:
KL(p q)是指pq函数重叠的面积,p与q越接近,重叠面积越大,kl就越小。
在这里插入图片描述
KL(p,q)的意思是使p接近于q。

对于autoencoder,是x→h→x ̅,每个关系都是一一对应的。对于variaional autoencoder,h属于q(h)分布,对于x是用一个分布表示的,从q(h)分布中取一个分布的样本,赋值为一个h或者z,然后根据z重建出x ̅,取得样本具有随机性。
sample的过程是不可微的。
在这里插入图片描述
z=μ+σ⊙ε
Reparameterization trick:解决sample不能微分的问题
在这里插入图片描述

AutoEncoder实战

实现autoencoder重建minst

ae

在这里插入图片描述
在这里插入图片描述

import torch
from torch import nn

class AE(nn.Module):
    def __init__(self):
        super(AE, self).__init__()


        #[b,784]=>[b,20]
        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(20,64),
            nn.ReLU(),
            nn.Linear(64,256),
            nn.ReLU(),
            nn.Linear(256,784),
            nn.Sigmoid()
        )

    def forward(self,x):
        '''

        :param x: [b,1,28,28]
        :return:[]
        '''
        batchsz=x.size(0)
        #flatten
        x=x.view(batchsz,784)
        #encoder
        x=self.encoder(x)
        #decoder
        x=self.decoder(x)
        #reshpe
        x=x.view(batchsz,1,28,28)

        return x


vae

在这里插入图片描述

import numpy as np
import torch
from torch import nn

class VAE(nn.Module):
    def __init__(self):
        super(VAE, self).__init__()

        #[b,784]=>[]
        #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()
        )
        self.decoder=nn.Sequential(
            nn.Linear(10,64),
            nn.ReLU(),
            nn.Linear(64,256),
            nn.ReLU(),
            nn.Linear(256,784),
            nn.Sigmoid()
        )

    def forward(self,x):
        '''

        :param x:
        :return:
        '''
        batchsz=x.size(0)
        x=x.view(batchsz,784)
        #encoder
        #[b,20],including mean and sigma
        h_=self.encoder(x)
        #[b,20]=>[b,10]and [b,10]
        mu,sigma=h_.chunk(2,dim=1)
        #reparametrize trick,epison~N(0,1)
        h=mu+sigma*torch.rand_like(sigma)

        #decoder
        x_hat=self.decoder(h)
        x_hat=x_hat.view(batchsz,1,28,28)
        #KL
        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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值