首页 > 解决方案 > 为什么 BinaryAccuracy() 会改变它的值?

问题描述

我用以下单元定义了一个 jupyter python notebook,我一个一个地执行:

第一个单元格:

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(np.ones(100), np.ones(100))
> <tf.Tensor: shape=(), dtype=float32, numpy=0.8333333>

请注意第三个单元格中的结果是完全错误的!它应该是1.0,因为它是一个完美的匹配。如果我多次执行这个单元格,值也会不同!

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

为什么 BinaryAccuracy() 会改变它的值?这是一个错误,我做错了什么,是我的设置错误,还是只是我不知道的某种机制?

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

标签: pythonnumpytensorflowkeras

解决方案


你应该使用reset_states()

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

推荐阅读