Tensorflow autoencoder:如何获得代表性输出?

时间:2017-02-21 18:34:47

标签: python machine-learning tensorflow computer-vision autoencoder

设置

我使用Tensorflow为图像构建了一个自动编码器。我的图像长度和宽度约为30像素。我正在使用5层:

  1. 输入图层
  2. 具有线性函数的256个神经元的编码器层。 (该层应该用作预处理PCA。)
  3. 具有128个具有S型函数的神经元的编码器层。
  4. 具有256个具有S型函数的神经元的解码器层。
  5. 具有与线性函数输入一样多的神经元的解码器/输出层。
  6. 所有图层都使用偏差,并按此定义

    layer_1 = tf.nn.sigmoid(tf.add(
       tf.matmul(x, tf.Variable(tf.random_normal([n_input, n_hidden_1]))),
       tf.Variable(tf.random_normal([n_hidden_1]))
    ))
    

    我的费用由

    定义
    cost = tf.reduce_mean(tf.div(tf.reduce_sum(tf.pow(y_true - y_pred, 2)), 2))
    

    我用RMSPropOptimizer开始学习率为0.01

    我训练了自动编码器大约250000张图像。在下面我展示了我没有训练的测试数据的结果。上排总是显示输入图像,下排总是显示输出图像。

    我在MNIST数据上使用了满意的自动编码器(阵列单元格是0-1的值): enter image description here

    我在自己拍摄的照片上使用了自动编码器(数组单元格的值为0-100): enter image description here

    根均方误差

    rmse = tf.sqrt(tf.reduce_mean(tf.square(tf.sub(y_true, y_pred)), axis=1))
    

    正如人们所预期的那样 - 前三张照片(变暗,变白,交叉)更高,而未更改的照片则更低:

    17.5, 29.6, 12.9, 11.7, 11.2, 11.7, 7.3, 7.1, 7.1, 8.1
    

    但是自动编码器对纹理图像不起作用(阵列单元格为0-1)。首先,我使用了RMSPropOptimizer并获得了

    enter image description here

    由于我的费用在培训期间非常高并且没有改变,因此我遵循了https://stackoverflow.com/a/40956761/4533188的建议并使用了AdamOptimizer。确实,我用

    获得了更好的结果

    enter image description here

    虽然成本较低,但它们在时代期间仍然保持不变:

    enter image description here

    输出图像也很暗。我相信这也可能是我rmse s的原因并不像我期望的那样:

    0.4642, 0.2669, 0.4976, 0.4378, 0.4753, 0.4688, 0.4615, 0.4571, 0.4691, 0.4487
    

    请注意,由于中间的点和第二张图像因为它变暗,我预计第一张图像的rmse s很高。我想rmse s不是那么希望的原因是因为输出图像太暗了。

    问题

    1. 为什么成本不会在时代内降低,我该怎样做才能实现这一目标?
    2. 为什么输出图像如此暗,我该怎么做才能让它们更好地表示输入图像呢?
    3. 如何让rmse成为我所期待的?

1 个答案:

答案 0 :(得分:0)

您的网络显然没有接受培训

  • 您的自动加网图层不对称
  • 不要使用sigmoid,请使用ReLU
  • 使用更好的初始化技术(具体分布取决于激活功能)
  • 分享编码器和解码器层的权重