Tensorflow上的完全卷积网(FCN)

时间:2016-05-06 06:12:20

标签: 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)

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

enter image description here

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

  1. 学习率较低
  2. 零均值图片
  3. 由于Tensorflow conv2d不支持,我没有按照FCN实施将图像填充到100像素。我使用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]) ))
    

    [UPDATE2]

    我遵循ziky90的建议并且它有效。现在融合的训练和deconv过滤器似乎停止了分歧。我将报告agian的准确性。

2 个答案:

答案 0 :(得分:4)

另请查看我的Tensorflow FCN implementation。将此loss functionthis培训脚本结合使用时,培训会有效。

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

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

答案 1 :(得分:2)

如果我将其与参考caffe实现进行比较,那么我看到,您不是通过deconvolution / tf.nn.conv2d_transpose图层中的双线性插值来初始化权重,而是通过tf.truncated_normal。< / p>

您可以查看caffe here中的参考实现,并从here

调用它