我正在 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 后添加完全連接時可能會出現數據范圍問題?
添加回答
舉報
0/150
提交
取消