我正在尝试将Tensorflow 1.x中编写的代码更新为Tensorflow 2.1.0中的代码。我一直在使用Tensorflow 2.1.0文档转换代码,在这段代码之前我没有任何问题。
loss = tf.losses.softmax_cross_entropy(one_hot_labels, logits)
上面的代码是Tensorflow 1.x版本,我认为,根据Tensorflow 2.1.0文档,正确更新的代码是
loss = tf.nn.softmax_cross_entropy_with_logits(one_hot_labels, logits)
然后,当我运行
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
我得到以下错误。
Loss must be scalar, given: Tensor("softmax_cross_entropy_with_logits/Reshape_2:0", shape=(512,), dtype=float32)**
所以,我猜测在Tensorflow 1.x版本中,损失是以'tensor'的形式传递给tf.Estimator.EstimatorSpec的,但在Tensorflow 2.1.0中,损失必须传递为 scalar
到 tf.estimator.EstimatorSpec
? 如果我没记错的话,Tensorflow 1.x和2.1.0中的损失(这里定义的方式)都是张量。
那么,有没有人知道如何将张量转换为标量(我认为这在建立CNN模型时既不充分也不高效),或者更好的是,如何解决这个难题?
还是我把原代码转换的方式不对?
除非绝对必要,否则不使用compat.v1.我会非常感激(即除了compat.v1.之外,在Tensorflow 2.1.0中没有其他方式使用代码)。
你可以将结果平均化 (这就是 tf.losses.softmax_cross_entropy
反正 tf.losses.compute_weighted_loss
):
loss = tf.math.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(one_hot_labels, logits))