【问题标题】:Why does BinaryAccuracy() change its values?为什么 BinaryAccuracy() 会改变它的值?
【发布时间】:2021-03-10 10:36:41
【问题描述】:

我用以下单元定义了一个 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() 会改变它的值?这是一个错误,是我做错了什么,是我的设置错误,还是只是我不知道的某种机制?

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

【问题讨论】:

    标签: python numpy tensorflow keras


    【解决方案1】:

    你应该使用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
    

    【讨论】:

    • 感谢@MarcoCerliani 的回答!显然它对reset_states() 很重要,以便清除隐藏状态,但是BinaryAccuracy() 在哪里以及为什么会有这些隐藏状态?它甚至不是模型的一部分,只是一个简单的 tf 指标,称为..
    • BinaryAccuracy 和其他 tf 指标具有这种行为,这在您在训练过程中使用指标时很有用。你只是将 BinaryAccuracy 用作独立函数,但行为仍然存在;所以简单地使用reset_states,总是在你使用它之前,做这项工作......不要忘记投票;-)
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多