我对使用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
如果有人对如何实现这一点有任何想法,我将不胜感激!感谢。
答案 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)
然后我可以在以后应用渐变。