张量列表和仅张量

List of tensors and just tensors

我正在将代码从 tensorflow 1.x 更新到 2.1.0。

我更改了 tensorflow 1.x 代码

labels = tf.cast(labels, tf.int64)
predict = tf.argmax(input=logits, axis=1)
tf.metrics.accuracy(labels=labels, predictions=predict)

到 tensorflow 2.1.0 代码。

labels = tf.cast(labels, tf.int64)
predict = tf.argmax(input=logits, axis=1)
tf.keras.metrics.Accuracy.update_state(labels, predict) #updated code

但是,当我 运行 更新代码时,出现以下错误。

TypeError: update_state() missing 1 required positional argument: 'y_pred'

所以,我查看了tensorflow 2.1.0文档, tf.keras.metrics.Accuracy.update_state() 的参数似乎是一个列表(以[ , , , ]的形式)。然后,我搜索了一种将张量转换为列表的方法,即

labels = tf.make_tensor_proto(labels)
labels = tf.make_ndarray(labels)

在我运行这段代码之后,它给出了以下错误。

TypeError: List of Tensors when single Tensor expected

所以,我尝试将张量列表转换为张量

labels = tf.stack(labels)
#or
labels = torch.stack(labels)

tf.stack() 没有工作,因为它给出了相同的初始类型错误,说更新代码中缺少 'y_pred'。

torch.stack(),然而报错如下

TypeError: stack() : argument 'tensors' (position 1) must be tuple of Tensors, not Tensor

所以,我猜 torch.stack() 只接受元组,不接受列表。 但是,tf.stack() 似乎接受了一个列表,但它并没有把它变成一个张量?

我的标签和预测甚至是张量列表吗?如果是这样,为什么 tf.stack() 不把它们变成张量?我怎样才能正确转换标签和预测,以便它们可以传递到 tf.keras.metrics.Accuracy.update_state()?

除非绝对必要,否则如果不使用 compat.v1.,我将不胜感激。

这样试试:

labels = [0,1]
logits = np.asarray([[0.9,0.1],[0.1,0.9]])

labels = tf.cast(labels, tf.int64)
predict = tf.argmax(input=logits, axis=1)
acc = tf.keras.metrics.Accuracy()
acc = acc.update_state(y_true=labels, y_pred=predict)
acc