Tensorflow 上的全卷积网络 (FCN)

24h*_*urs 3 tensorflow

我正在尝试在 tensorflow 上重新实现 FCN。我已经实现了反卷积层。

up8_filter = tf.Variable(tf.truncated_normal([64, 64, 21, 21]))
prob_32 = tf.nn.conv2d_transpose(score, up8_filter, output_shape = [batch_size, 224, 224, 21], strides = [1, 32, 32, 1])
tf.histogram_summary('fc8_filter', up8_filter)
Run Code Online (Sandbox Code Playgroud)

训练看起来很好,损失值下降直到变成Nan. 我检查了张量板,它表明up8_filter似乎有分歧。

在此处输入图片说明

有没有办法规范 Tensorflow 中的权重值?
我试过以下方法

  1. 较低的学习率
  2. 零均值图像

我没有按照 FCN 实现将图像填充到 100 像素,因为 Tensorflowconv2d不支持它。我使用caffe-tensorflow转换了 VGG 权重,我无法改变它的网络结构。

我很抱歉这个令人困惑的问题,有很多事情要出错,我不知道从哪里开始。

损失值的片段。

第 1 步:损失 = 732171599872.00
第 10 步:损失 = 391914520576.00
第 20 步:损失 = 32141299712.00
第 30 步:损失 = 1255705344.00

[更新]:

损失函数 loss32

 loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
                                    tf.reshape(prob_32, [batch_size*224*224, 21]),
                                    tf.reshape(lbl_ph, [-1]) ))
Run Code Online (Sandbox Code Playgroud)

[更新2]

我遵循了 ziky90 的建议,它奏效了。训练现在收敛了,deconv 过滤器似乎停止了发散。我会再次报告准确性。

Mar*_*ind 5

也看看我的 Tensorflow FCN 实现。将此损失函数训练脚本结合使用时,训练有效。

以下是我在实施 FCN 时获得的一些见解。

  1. deconv 过滤器需要初始化为双线性的。
  2. tf.nn.sparse_softmax_cross_entropy_with_logits可以使用,但在某些情况下会导致数值不稳定。另请参阅此Tensorflow 问题。因此,我决定使用张量运算来实现交叉熵。
  3. 当使用大图像(导致 large softmax batches)时,降低训练率是有用的。Adam 优化器与学习率相结合1e-6似乎很有用。