Python 为什么BinaryAccurance()会更改其值?

Python 为什么BinaryAccurance()会更改其值?,python,numpy,tensorflow,keras,Python,Numpy,Tensorflow,Keras,我使用以下单元格定义了一个jupyter python笔记本,并逐一执行: 第1单元: import tensorflow as tf ba = tf.keras.metrics.BinaryAccuracy() labels = [ np.array([[0]], dtype=np.float32), np.array([[0]], dtype=np.float32), np.array([[1]], dtype=np.float32), np.array([[1]], dtype=np

我使用以下单元格定义了一个jupyter python笔记本,并逐一执行:

第1单元:

import tensorflow as tf

ba = tf.keras.metrics.BinaryAccuracy()

labels = [ 
np.array([[0]], dtype=np.float32),
np.array([[0]], dtype=np.float32),
np.array([[1]], dtype=np.float32),
np.array([[1]], dtype=np.float32),
np.array([[0]], dtype=np.float32) 
]

preds = [ 
np.array([[0.1]], dtype=np.float32),
np.array([[0.1]], dtype=np.float32),
np.array([[0.9]], dtype=np.float32),
np.array([[0.1]], dtype=np.float32),
np.array([[0]], dtype=np.float32) 
]
第二单元:

ba(labels, preds)
> <tf.Tensor: shape=(), dtype=float32, numpy=0.8>
ba(标签、pred)
> 
第三单元:

ba(np.ones(100), np.ones(100))
> <tf.Tensor: shape=(), dtype=float32, numpy=0.8333333>
ba(新一代(100),新一代(100))
> 
请注意,第三个单元格中的结果完全错误!它应该是
1.0
,因为它是一个完美的匹配。如果我多次执行这个单元格,值也会不同

但是,如果我省略了第二个单元格,只执行第一个和第三个单元格,则计算是正确的。这是一种奇怪的行为

为什么BinaryAccurance()会更改其值?这是一个bug,是我做错了什么,是我的设置错了,还是只是一些我不知道的机制


此外,如果您只执行了第一个和第三个单元格,然后多次返回执行第二个单元格,则每次的值都不同

您应该使用
reset\u states()


谢谢你的回答@MarcoCerliani!显然,为了清除隐藏状态,显然
reset\u states()
是很重要的,但是
binaryAccurality()
在哪里和为什么会有这些隐藏状态?它甚至不是模型的一部分,只是一个简单的tf度量,称为..BinaryAccurance和其他tf度量具有这种行为,当您在培训过程中使用该度量时,这非常有用。U将BinaryAccurance简单地用作独立函数,但其行为仍然存在;所以简单地使用重置状态,总是在你使用它之前,完成工作。。。别忘了投票;-)
np.random.seed(33)

ba = tf.keras.metrics.BinaryAccuracy()

print(ba(np.random.randint(0,3, (100)), np.random.randint(0,3, (100)))) # 0.3

ba.reset_states()

print(ba(np.ones(100), np.ones(100))) # 1.0