我定义了一个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(np.ones(100), np.ones(100))
> <tf.Tensor: shape=(), dtype=float32, numpy=0.8333333>
请注意,第三个单元格的结果是完全错误的!应该是1.0
,因为它是完美匹配的。如果我执行这个单元格多次,值也会不同!
然而,如果我省略第二个单元格,只执行第一个和第三个单元格,计算是正确的。这是一个奇怪的行为。
为什么BinaryAccuracy()改变它的值?这是一个错误,我做错了什么,是我的设置错误,或者只是一些机制,我不知道?
同样,如果你只执行了第一个和第三个单元格,然后返回执行第二个单元格多次,每次的值都不一样!
你应该使用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