我正在将代码从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.
,将不胜感激。
答案 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