Tensorflow 1.x 到 Tensorflow 2.1.0

问题描述 投票:0回答:1

我正在尝试将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中,损失必须传递为 scalartf.estimator.EstimatorSpec? 如果我没记错的话,Tensorflow 1.x和2.1.0中的损失(这里定义的方式)都是张量。

那么,有没有人知道如何将张量转换为标量(我认为这在建立CNN模型时既不充分也不高效),或者更好的是,如何解决这个难题?

还是我把原代码转换的方式不对?

除非绝对必要,否则不使用compat.v1.我会非常感激(即除了compat.v1.之外,在Tensorflow 2.1.0中没有其他方式使用代码)。

python tensorflow loss-function softmax cnn
1个回答
2
投票

你可以将结果平均化 (这就是 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))
© www.soinside.com 2019 - 2024. All rights reserved.