深度学习实现彩色图像特征提取:线性解码器

在前面的讨论中,用到的激励函数都是sigmoid函数:

以为最终的输出层所有输出的范围是[0,1],而我们在自编码学习的动机就是使得输出等于输入,于是所有输入必须调整到[0,1]范围内,但是问题来了,有些数据集输入范围容易调整,比如Minist,但是PCA白化处理的输入并不满足[0,1],所以需要找到一种能够处理非[0,1]范围内的机制。

为了解决这个问题,我们让输出层的输出和该层输入相等:a(3) = z(3),这就相等于把激励函数改为 f(z) = z,称这个激励函数为 线性激励函数,这样就可以输出大于1和小于0的值,那么我们就可以用实值作为输入训练整个自编码器,即输入的范围不用再限制在[0,1]之内,可以是任意实数。

在这个线性解码器模型中:\hat{x} = a^{(3)} = z^{(3)} = W^{(2)}a + b^{(2)}.

随着激励函数的改变,输出单元的梯度求法也要随之改变:


\begin{align}
\delta_i^{(3)}
= \frac{\partial}{\partial z_i} \;\;
        \frac{1}{2} \left\|y - \hat{x}\right\|^2 = - (y_i - \hat{x}_i) \cdot f'(z_i^{(3)})
\end{align}

 

因为输出层f(z) = z,所以 f'(z) = 1,于是:


\begin{align}
\delta_i^{(3)} = - (y_i - \hat{x}_i)
\end{align}

 

当采用反向传播计算误差时,还是和以前一样:


\begin{align}
\delta^{(2)} &= \left( (W^{(2)})^T\delta^{(3)}\right) \bullet f'(z^{(2)})
\end{align}

这是因为隐层的激励函数还是sigmoid函数,没有改变。

下面的练习用线性编码器学习出彩色图像的特征,数据集http://ufldl.stanford.edu/wiki/resources/stl10_patches_100k.zip,里面是采样好的100,00幅8*8的RGB图像,随机前100幅采样得到的图像:

经过白化处理后:

学习出的特征:

可以看出和灰度图像类似,学习出的仍然是一些物体的边缘部分。

实验代码:linear_autoencoder.rarminFunc.rar,其中minFunc.rar是用来优化自动编码代价函数的工具函数包。

 

学习来源:http://deeplearning.stanford.edu/wiki/index.php/Exercise:Learning_color_features_with_Sparse_Autoencoders

 

 

posted @ 2014-10-26 12:37  90Zeng  阅读(3863)  评论(0编辑  收藏  举报