【发布时间】:2017-07-11 13:05:15
【问题描述】:
设置
我用 Tensorflow 为图像构建了一个自动编码器。我的图像的长度和宽度约为 30 像素。我正在使用 5 层:
- 输入层
- 编码器层有 256 个神经元,具有线性函数。 (这一层应该起到预处理 PCA 的作用。)
- 具有 128 个神经元和 sigmoid 函数的编码器层。
- 解码器层有 256 个神经元,具有 sigmoid 函数。
- 解码器/输出层具有与线性函数输入一样多的神经元。
所有层都使用偏差并且是这样定义的
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 的值):
我在自己拍摄的照片上使用了令人满意的自动编码器(数组单元格的值是 0-100):
均方根误差在哪里
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 并得到了
由于我在训练期间的成本相当高并且没有改变,我遵循了https://stackoverflow.com/a/40956761/4533188 的建议并使用了AdamOptimizer。事实上,我得到了更好的结果
虽然成本较低,但在各个时期内它们仍然保持不变:
输出图像也很暗。我相信这也可能是我的rmses 不是我所期望的原因:
0.4642, 0.2669, 0.4976, 0.4378, 0.4753, 0.4688, 0.4615, 0.4571, 0.4691, 0.4487
请注意,我预计第一张图像的rmses 较高,因为中间有一个点,而第二张图像变暗了。我猜rmses 没有达到预期的原因是因为输出图像太暗了。
问题
- 为什么成本在各个时期都没有降低,我该怎么做才能做到这一点?
- 为什么输出图像如此暗,我该怎么做才能让它们更好地表示输入图像?
- 如何让
rmses 符合我的预期?
【问题讨论】:
标签: python machine-learning tensorflow computer-vision autoencoder