张量列表和张量列表

时间:2020-05-14 06:22:20

标签: python tensorflow keras tensor torch

我正在将代码从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()不起作用,因为它给出了相同的初始TypeError,说更新的代码中缺少'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.,将不胜感激。

1 个答案:

答案 0 :(得分:1)

以这种方式尝试:

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