在CNN中正确使用tf.cond

时间:2018-03-22 18:47:05

标签: tensorflow conv-neural-network backpropagation

我对使用tf.cond有疑问。我试图通过CNN运行2个图像,并且仅使用较低的交叉熵损失值运行backprop。代码如下:

train_cross_entropy = tf.cond(train_cross_entropy1 < train_cross_entropy2, lambda: train_cross_entropy1, lambda: train_cross_entropy2)

使用此train_cross_entropy与写入一样慢 train_cross_entropy = train_cross_entropy1 + train_cross_entropy2

这告诉我,它正在通过图形的两个部分而不仅仅是一个部分进行反向支持。 我希望它几乎和写作一样快 train_cross_entropy = train_cross_entropy1

如果有人对如何实现这一点有任何想法,我将不胜感激!感谢。

2 个答案:

答案 0 :(得分:1)

假设您使用相同的CNN处理两个图像,这是有道理的。让我们分别考虑前向(输入 - >成本)和后向(后向/梯度)计算。

对于正向计算,需要对条件处理两个输入,因为需要比较两个交叉熵值。因此,declare cur1 cursor for select * from stockmarket.STOCK_QUOTE use index for order by (XK2_STOCK_QUOTE,XK4_STOCK_QUOTE) order by QUOTE_SEQ_NBR,QUOTE_TIME; 案例并不比增加两个成本更快。

对于向后计算,实际上没有区别:在任何一种情况下,错误都需要从输出层一直反向传播到网络的开头。请注意,我们正在计算与变量(网络权重)相关的渐变;输入被认为是固定的。因此,添加成本的数量无关紧要:这只是改变了backprop在输出层开始的标量成本值。实际传播保持不变(只是使用不同的值)。

答案 1 :(得分:1)

我只需要在tf.cond中移动渐变计算,如下所示:

    def f1(): 
        grads = tf.gradients(train_cross_entropy1, var_list, 
                             stop_gradients=[train_cross_entropy2])
        return grads
    def f2(): 
        grads = tf.gradients(train_cross_entropy2, var_list, 
                             stop_gradients=[train_cross_entropy1])
        return grads

    gradients = tf.cond(train_cross_entropy1 < train_cross_entropy2, f1, f2)

然后我可以在以后应用渐变。