我正在 Tensorflow 中为 MNIST 数据集试验 VAE 实现。首先,我训练了一个基于 MLP 编码器和解码器的 VAE。它训练得很好,损失减少了,它生成了看似合理的数字。下面是这个基于 MLP 的 VAE 解码器的代码:
x = sampled_z
x = 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 学习率。
隔江千里
相关分类