在前面的讨论中,用到的激励函数都是sigmoid函数:
以为最终的输出层所有输出的范围是[0,1],而我们在自编码学习的动机就是使得输出等于输入,于是所有输入必须调整到[0,1]范围内,但是问题来了,有些数据集输入范围容易调整,比如Minist,但是PCA白化处理的输入并不满足[0,1],所以需要找到一种能够处理非[0,1]范围内的机制。
为了解决这个问题,我们让输出层的输出和该层输入相等:a(3) = z(3),这就相等于把激励函数改为 f(z) = z,称这个激励函数为 线性激励函数,这样就可以输出大于1和小于0的值,那么我们就可以用实值作为输入训练整个自编码器,即输入的范围不用再限制在[0,1]之内,可以是任意实数。
在这个线性解码器模型中:.
随着激励函数的改变,输出单元的梯度求法也要随之改变:
因为输出层f(z) = z,所以 f‘(z) = 1,于是:
当采用反向传播计算误差时,还是和以前一样:
这是因为隐层的激励函数还是sigmoid函数,没有改变。
下面的练习用线性编码器学习出彩色图像的特征,数据集http://ufldl.stanford.edu/wiki/resources/stl10_patches_100k.zip,里面是采样好的100,00幅8*8的RGB图像,随机前100幅采样得到的图像:
经过白化处理后:
学习出的特征:
可以看出和灰度图像类似,学习出的仍然是一些物体的边缘部分。
实验代码:linear_autoencoder.rar,minFunc.rar,其中minFunc.rar是用来优化自动编码代价函数的工具函数包。
时间: 2024-10-10 02:02:22