因为最近在研究自编码和变分自编码的区别,以及应用方向,现在总结内容和大家分享一下。
自编码 (Autoencoder)
自编码(Autoencoder)在降维算法普遍被认可的一种算法,算法的主要出发点:如果有个网络,你将数据输入(N维),可以是图片或者其他特征,然后网络吐出了相同的数据,那么我们是否可以认为网络的某些隐层特点(输出, M维)可以代表你的输入数据特点?—- 因为基于这个隐层输出,网络又重新输出了原始数据。
基于这个想法,普遍的网络设置,都是将隐层设置成一个低维(M << N), 然后将损失函数 (Loss function)设置成原始输入和输出的diff。
这里将用mnist手写数字图片数据作为一个代码样例说明, 这里我们简单将代码逻辑分几个部分进行串行讲解:
- 网络结构
- 前向数据流 (forward)
- 损失函数 (loss function) & 优化器 (optimizer)
- 训练 & 梯度下降
数据简单介绍 28 * 28维图片,图片pixel值[0, 1],图片内容1 - 9, 知道了输入纬度,咱们直接来设置网络结构 (比如我们想将 28 * 28 降维到 64维)
网络结构
class AutoEncoder(nn.Module):
"""
"""
def __init__(self, latent_num=16):
"""
TODO: doconvolution
"""
super(AutoEncoder, self).__init__()
self.fc1 = nn.Linear(IMG_SIZE, 256)
self.fc1.weight.data.normal_(0.0, 0.05)
self.fc2 = nn.Linear(256, 64)
self.fc2.weight.data.normal_(0.0, 0.05)
self.fc3 = nn.Linear(64, 256)
self.fc3.weight.data.normal_(0.0, 0.05)
self.fc4 = nn.Linear(256, IMG_SIZE)
self.fc4.weight.data.normal_(0.0, 0.05)
前向数据流 (forward)
有了网络结构,我们还需要将网络数据流串联起来,这个过程普遍成为forward,