我想有一个多标签分类任务,我想用
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>
。如您所见,它们不匹配。有人能告诉我为什么吗?他们必须产生相同或至少相似的数字,但差异很小。