TensorFlow会尽可能自动使用sparse_softmax_cross_entropy_with_logits吗?

时间:2016-12-12 14:29:23

标签: tensorflow

我们说我有一些代码,例如:

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))

1 个答案:

答案 0 :(得分:0)

TensorFlow通常不会以您希望的方式将节点合并在一起。这是因为其他代码(例如,在运行时获取输出)可能依赖于像softmax这样的中间节点,因此将它们移回用户后面将会令人困惑。

如果您确实希望自己作为更高级别框架的一部分进行此优化,则可以分析当前的graphdef,但TF中没有注释来告诉您输出是什么,因为这可能会有所不同在运行时取决于session.run的调用方式。