- Autoencode 自编码
自编码是一种把输入数据通过编码层和解码层,尽量复制原数据信息的神经网络。编码层主要目的是压缩图片以及提取图片特征,方便用作分类等处理;解码层则是将特征通过与编码层相反的网络结构还原为与原图相近的图片。通过将输入与输出尽可能的相似(不是相等),可以保证提取的图片特征能很好的表示原数据。
如图,数据x通过函数编码层提取特征y,再通过解码层获取还原数据z,通过误差函数不断优化x和z的相似度完成训练。
- DAE(降噪自编码)
降噪自编码主要为了防止过拟合,对图片加入噪声处理。加入了噪声后的自编码网络会有更高的鲁棒性。(论文:Extracting and composing robust features with denoising autoencoders)
如下图,DAE和dropout其实很像,dropout是随机挑选一定比例的神经元使其权重变为0,也就是这个神经元不参与训练,使得网络有更好的鲁棒性。而DAE则是把输入数据x以一定概率把输入点设置为0(也就是黑色),你会发现图片中多出黑点(噪音),得到噪声模型x‘。
这个数据的优势在于更接近测试数据,鲁棒性更好,用mnist手写数据来举例,黑点多了意味着数字内容(白色)少了。
- SDAE(堆叠降噪自编码)
最后就是这次学习的堆叠降噪自编码网络,论文:Stacked Denoising Autoencoders: Learning Useful Representations in
a Deep Network with a Local Denoising Criterion。
这个网络就是把多个DAE组合在一起的结果,在训练时对输入加入噪音,训练完成就不需要了。
逐层贪婪训练:每一层的自编码都进行非监督训练,也就是训练第k层,用第k-1层作为输入,再连接一个k-1层的隐藏层作为解码器,最小化输入和重构输出的误差,训练好k层再训练k+1层。
for i in range(len(self.layers) - 1):
encoder = Sequential()
if i == len(self.layers) - 2:
Dropout(0.5, input_shape=(self.layers[i + 1],))
encoder.add(Dense(units=self.layers[i + 1], activation='relu', init='glorot_uniform'))
else:
Dropout(0.5, input_shape=(self.layers[i + 1],))
encoder.add(Dense(units=self.layers[i + 1], activation='relu', init='glorot_uniform'))
decoder = Sequential()
Dropout(0.2, input_shape=(self.layers[i],))
decoder.add(Dense(units=self.layers[i], activation='relu', init='glorot_uniform'))
encoder_input = Input(shape=(self.layers[i],))
code = encoder(encoder_input)
reconstruct_code = decoder(code)
combined = Model(encoder_input, reconstruct_code)
optimizer = SGD(0.01, 0.9)
combined.compile(loss='mse', optimizer=optimizer, metrics=['accuracy'])
通常训练后编码层组合在一起都会对结果有很大影响,所以还要再做fine-funting(微调),用带label的数据进行训练。这个等详细学习再做记录。