《三分钟了解》系列 二: AutoEncoder 自编码

Hello,大家好~ 今天是第二个三分钟:《AutoEncoder 自编码》(本系列将全部采用PyTorch框架在Linux服务器上来进行网络的搭建)


目录: 

  • AutoEncoder(AE) 
  • PyTorch上利用AE对Mnist数据集进行复原
  • Variational AutoEncoder (VAE)
  • 训练神经网络时的三个概念:Epoch, Batch, Iteration

    一、 AutoEncoder(AE) 

AutoEncoder 自编码 是神经网络中的另一个重要内容。AE主要由两部分组成:encode和decode。

输入一张图片,经过encode之后将其压缩至很小的图片(也可以叫做特征),在经过decode,确定图像能够还原回去。另外可作解释:通过encode可以将输入的样本 x 映射到一个特征空间 z,再通过decode将抽象的特征 z 映射回原始空间得到重构之后的样本 x' 。这倒是有点jpeg2000压缩算法的意思:有损压缩。

AE 最终学习的目标不是解码,而是通过重构误差来优化encode和decode来使得我们能够得到最优的特征Z,从而进行下一步的其他应用工作。比如,数据降维,数据去噪,图像修复,信息检索等。

整体框架,其实是fully connected layer。只看encode部分,是一个数据压缩的过程。只看decode部分,又是一个GAN生成的过程。(这就有意思了。。。.)

AE的loss function一般都会选择MSE(Mean square error)

对于这个框架我倒是有点疑问。。。基本上大家都说是无监督的学习过程,因为他没有使用样本的label。 但也看到一种说法是自监督学习,而自监督应该属于监督学习的一个旁支。我迷惑了。。。(⊙o⊙)…


二、用pytorch来实现一个简单的自编码器

定义一个4层网络作为编码器,Mnist数据集图片大小为28*28,经过4层之后最后变为3维。(跟全连接层一样,第一层的输入是一个向量也就是28*28=784维,之后经过4层不断降维:128—64—12—3)因为使用了Tanh作为激活函数,也就是将原始图片的灰度数据从0—255之间压缩到了-1—1之间。因此在解码的过程中要使用sigmoid()和输入对应。

class AutoEncoder(nn.Module):
    def __init__(self):
        super(AutoEncoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(28*28, 128),
            nn.Tanh(),
            nn.Linear(128, 64),
            nn.Tanh(),
            nn.Linear(64, 12),
            nn.Tanh(),
            nn.Linear(12, 3),
        )
        self.decoder = nn.Sequential(
            nn.Linear(3, 12),
            nn.Tanh(),
            nn.Linear(12, 64),
            nn.Tanh(),
            nn.Linear(64, 128),
            nn.Tanh(),
            nn.Linear(128, 28*28),
            nn.Sigmoid(),
        )
    def forward(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)
        return encoded, decoded

autoencoder = AutoEncoder()
optimizer = torch.optim.Adam(autoencoder.parameters(), lr=LR)
loss_func = nn.MSELoss()

最终结果:设epoch=20,可以看出复原还是比较准的。观察动态生成图,还真有GAN的意思。。。


三、VAE

AE的升级版比较多,比如,Sparse AutoEncoder(SAE):对损失函数添加一个L1正则项或者使用KL-散度

Denoising AutoEncoder (DAE):“Vincent Extracting and composing robust features with denoising autoencoders, 2008”中提出的。

Contrative AutoEncoder(CAE): "Contractive auto-encoders: Explicit invariance during feature extraction, 2011"中提出的。

Stacked AutoEncoder(SAE),在文章“Greedy Layer-Wise Training of Deep Networks, 2007”中提出。

以及。。。等等

Variational AutoEncoder(VAE),是由 Kingma 和 Welling 在“Auto-Encoding Variational Bayes, 2014”中提出的一种生成模型。

我觉得VAE比较有意思,因此只对其作详解。VAE跟GAN一样,也是一个生成模型,而且是2017年最火的生成模型之一。

只观察这个解码的过程,可不就是一个GAN嘛~但是由于这个h 是由特定训练得到的,它已经包含原图的一些信息了,由于我们无法凭空创造所有的h, 因此这个生成器只能生成一个已知的东西而不能像GAN一样随意创造。

VAE的原理其实也非常简单,只是在AE中添加某些约束,迫使生成的 h 在大体上能够遵守正态分布即可。由此,在随机生成图片的过程中就变成了只需要输入一个呈现近似 正态分布的 h, 直接对其 decode,就可以得到我们想要的图片, 从而略过了AE中的encode过程。

 VAE的loss function包括两个部分,一个跟AE相同,生成图片和原始图片之间的MSE,另一个损失用KL散度来表示。这里的KL-散度用来描述 隐含变量所服从的分布和标准正态分布之间的差异。因为隐含变量所服从的分布会影响最终生成的图片。

KL-散度的计算公式

为了避免KL散度的计算,在实际的训练过程中,VAE非常巧妙地用了一个技巧: 重新参数化。

每次编码之后生成两个向量:一个用来表示均值,另一个表示标准差,用这两个向量来合成隐藏向量 h 。即就是用标准正态分布乘以标准差再加上均值。

基本概念就是这些,公式推导太多了。改天专门推导一下。


四、基本概念:

1. Epoch: 使用训练集的全部数据对模型进行一次完整的训练,“一代训练”。自己设定。

2. Batch: 使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分就叫做“一批数据”。

3. Iteration: 使用一个Batch数据对模型进行一次参数更新的过程,“一次训练” 

(说人话就是,训练的时候将数据按预先设定的batchz-size分块,之后将数据按块分批次训练,完成对所有数据的训练就是一个Epoch, 在每个Epoch内要遍历完所有的块,也就是Iteration)

 

例如:上面mnist数据复原中。mnist数据集中训练数据有60000张。我设定的Epoch=20,  Batch_size=64。因此:

每个Epoch要训练的图片:60000;

训练集Batch的个数: 60000/ 64 = 937+1 =938 (加1是因为无法整除,如果可以正如就不用加1)

每个Epoch需要完成的Batch个数: 938

每个Epoch中具有的Iteration个数: 938 

每个Epoch内权重要发生的更新次数: 938

训练20代后,权重更新:20*938次

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值