将 from_logits 设置为 True 的二元交叉熵和多标签分类无法按预期工作

问题描述 投票:0回答:0

我想有一个多标签分类任务,我想用

Tensorflow
实现网络。我知道我必须使用
BCE
作为损失和
Sigmoid
作为最后一层的激活。我想要稳定的计算,所以我决定使用选项
from_logits
设置为
True
for
BCE
。问题是我尝试使用以下代码检查一切正常,但结果不匹配。在下面的代码中,
a
对应两个样本。在第一个中,存在最后两个类别。
b
对应于未通过
Sigmoid
激活函数的网络输出。

a = np.array([[0, 0, 1, 1], 
          [0, 1, 0, 1.]]) 
b = np.array([[18, -20, 20, 20], 
              [-18, 0., -10, 12]])     
b_sigmoid = tf.sigmoid(b)     
lf = tf.keras.losses.BinaryCrossentropy()
lt = tf.keras.losses.BinaryCrossentropy(from_logits=True)  

调用

lf(a, b_sigmoid)
会产生
<tf.Tensor: shape=(), dtype=float64, numpy=2.0147683492886337>
,而调用
lt(a, b)
会产生
<tf.Tensor: shape=(), dtype=float64, numpy=2.336649845037007>
。如您所见,它们不匹配。有人能告诉我为什么吗?他们必须产生相同或至少相似的数字,但差异很小。

python tensorflow keras deep-learning tensorflow2.0
© www.soinside.com 2019 - 2024. All rights reserved.