我们说我有一些代码,例如:
out = tf.nn.softmax(x) # shape (batch,time,n)
labels = .... # reference labels of type (batch,time)->int
然后我将我的损失定义为交叉熵:
loss = -tf.log(tf.gather_nd(out, labels))
TensorFlow会自动替换计算图中的loss
吗?
loss = sparse_softmax_cross_entropy_with_logits(x, labels)
我期望TensorFlow适用哪种类型的优化?
后续问题:如果TensorFlow没有进行此优化,我该如何手动完成?考虑到我有一个模块化框架,我得到一些out
张量,可能是softmax
操作的输出,我想计算交叉熵,我想使用sparse_softmax_cross_entropy_with_logits
如果可能的话。我怎么能做到这一点?我可以做类似以下的事情吗?
if out.op == "softmax": # how to check this?
x = out.op.sources[0] # how to get this?
loss = sparse_softmax_cross_entropy_with_logits(x, labels)
else:
loss = -tf.log(tf.gather_nd(out, labels))
答案 0 :(得分:0)
TensorFlow通常不会以您希望的方式将节点合并在一起。这是因为其他代码(例如,在运行时获取输出)可能依赖于像softmax这样的中间节点,因此将它们移回用户后面将会令人困惑。
如果您确实希望自己作为更高级别框架的一部分进行此优化,则可以分析当前的graphdef,但TF中没有注释来告诉您输出是什么,因为这可能会有所不同在运行时取决于session.run的调用方式。