Tensorflow 张量流上的全卷积网

Tensorflow 张量流上的全卷积网,tensorflow,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_fil

我正在尝试在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
。我检查了tensorboard,它表明
up8\u过滤器
似乎发散了

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

  • 低学习率
  • 零均值图像
  • 我没有按照FCN实现将图像填充到100像素,因为Tensorflow
    conv2d
    不支持它。我转换VGG的重量使用,有没有太多我可以做,以改变它的网络结构

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

    丢失值的代码段

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

    [更新]:

    损失函数 损失32

    [更新2]


    我按照ziky90的建议做了,它成功了。训练现在收敛了,deconv滤波器似乎停止了发散。我将报告阿吉安的准确性

    如果我将其与参考caffe实现进行比较,那么我发现,您不是在
    反褶积
    /
    tf.nn.conv2d\u转置
    层中通过双线性插值来初始化权重,而是通过
    tf.truncated\u normal
    来初始化权重


    您可以查看caffe中的参考实现,它是从调用的,也可以查看我的Tensorflow。当将此与培训脚本结合使用时,培训工作正常

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

  • deconv滤波器需要初始化为双线性
  • tf.nn.sparse\u softmax\u cross\u entropy\u with\u logits
    可以使用,但在某些情况下会导致数值不稳定。另见此。因此,我决定使用张量运算实现交叉熵
  • 当使用大图像时(这会导致大的
    softmax批处理
    ),降低训练速率是有用的。Adam optimizer与学习率为
    1e-6
    的组合似乎很有用

  • 学习率越低?你的损失函数是什么?我现在也在玩FCN,试图让它们在tensorflow中工作。如果我将其与参考caffe实现进行比较,那么我会发现,在
    反褶积
    /
    tf.nn.conv2d_transpose
    层中,不是通过双线性插值初始化权重,而是通过tf.truncated_normal初始化权重。顺便说一句,我正在解决相关问题:我在FCN论文/实现中没有看到初始化deconv过滤器权重的特定代码。希望我们都在谈论Jonathan Long的论文?如果是,那么如果您查看了caffe中的参考实现,他们会在这里初始化它:这是从Hi MarvMind调用的,对于您的FCN实现,您还提供了测试代码,如test_fcn16_vgg.py。这是否与tensorvision中包含的评估脚本重叠?您能否详细说明使用tensorvison与FCN实施相结合的工作流程?
     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]) ))