由于错误,我忘了降低交叉熵输出的平均值,然后再将其作为损失进行补偿,但是无论如何训练还是产生了合理的结果。
现在我想知道我是否做了:
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits, name='cross_entropy_per_example')
op = tf.train.AdamOptimizer(0.01).minimize(loss)
与:
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits, name='cross_entropy_per_example'))
op = tf.train.AdamOptimizer(0.01).minimize(loss)
我的印象是成本函数的优化需要单个值张量,但是我困惑为什么尽管传递了带有多个值的张量也要进行训练。
答案 0 :(得分:1)
tf.gradients
(因此,它的大多数更高级别的接口,包括Optimizer
)都隐式地总结了您要区分的内容。 tf.gradients
将仅计算相对于标量的梯度。 tf.gradients
documentation中对此有所提及。
因此,根据您的情况,reduce_mean
除以该值即可。