为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用反卷积层训练 VAE

无法使用反卷积层训练 VAE

肥皂起泡泡 2021-06-03 17:39:09
我正在 Tensorflow 中为 MNIST 数据集试验 VAE 实现。首先,我训练了一个基于 MLP 编码器和解码器的 VAE。它训练得很好,损失减少了,它生成了看似合理的数字。下面是这个基于 MLP 的 VAE 解码器的代码:x = sampled_zx = tf.layers.dense(x, 200, tf.nn.relu)x = tf.layers.dense(x, 200, tf.nn.relu)x = tf.layers.dense(x, np.prod(data_shape))img = tf.reshape(x, [-1] + data_shape)下一步,我决定添加卷积层。只改变编码器工作得很好,但是当我在解码器(而不是 fc 层)中使用反卷积时,我根本没有得到任何训练。损失函数永远不会减少,输出总是黑色的。这是反卷积解码器的代码:x = tf.layers.dense(sampled_z, 24, tf.nn.relu)x = tf.layers.dense(x, 7 * 7 * 64, tf.nn.relu)x = tf.reshape(x, [-1, 7, 7, 64])x = tf.layers.conv2d_transpose(x, 64, 3, 2, 'SAME', activation=tf.nn.relu)x = tf.layers.conv2d_transpose(x, 32, 3, 2, 'SAME', activation=tf.nn.relu)x = tf.layers.conv2d_transpose(x, 1, 3, 1, 'SAME', activation=tf.nn.sigmoid)img = tf.reshape(x, [-1, 28, 28])这看起来很奇怪,代码对我来说看起来很好。我把它缩小到解码器中的反卷积层,那里有一些东西打破了它。例如,如果我在最后一次解卷积后添加一个全连接层(即使没有非线性!),它又可以工作了!这是代码:x = tf.layers.dense(sampled_z, 24, tf.nn.relu)x = tf.layers.dense(x, 7 * 7 * 64, tf.nn.relu)x = tf.reshape(x, [-1, 7, 7, 64])x = tf.layers.conv2d_transpose(x, 64, 3, 2, 'SAME', activation=tf.nn.relu)x = tf.layers.conv2d_transpose(x, 32, 3, 2, 'SAME', activation=tf.nn.relu)x = tf.layers.conv2d_transpose(x, 1, 3, 1, 'SAME', activation=tf.nn.sigmoid)x = tf.contrib.layers.flatten(x)x = tf.layers.dense(x, 28 * 28)img = tf.reshape(x, [-1, 28, 28])在这一点上我真的有点卡住了,有没有人知道这里可能会发生什么?我使用 tf 1.8.0,Adam 优化器,1e-4 学习率。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

可能是您在最终的 deconv 层中使用了 sigmoid 将输出限制为 0-1,您不在基于 MLP 的自动编码器中这样做,或者在 deconvs 后添加完全连接时可能会出现数据范围问题?


查看完整回答
反对 回复 2021-06-09
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信