You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Keras的BinaryCrossentropy在from_logits=True时报错,False时正常?

Keras BinaryCrossentropy形状匹配问题解析

当使用Keras的BinaryCrossentropy损失函数时,会出现一种看似矛盾的情况:设置from_logits=True时,因y_true(形状(10,1))与y_pred(形状(10,768))形状不匹配直接抛出错误;但设置from_logits=False时,却能正常计算出损失值。以下是具体场景和原因解析:

场景1:from_logits=True时触发形状错误

import numpy as np
import tensorflow as tf

fake_preds = np.random.rand(10,768)  # 10个样本,每个样本768维的预测输出
fake_labels = np.random.rand(10,1)   # 10个样本,每个样本1维的标签

loss1 = tf.keras.losses.BinaryCrossentropy(from_logits=True)
print(loss1(fake_labels, fake_preds).numpy()) 

运行后抛出错误:

ValueError: `logits` and `labels` must have the same shape, received ((10, 768) vs (10, 1)).

场景2:from_logits=False时正常运行

loss2 = tf.keras.losses.BinaryCrossentropy(from_logits=False)
print(loss2(fake_labels, fake_preds).numpy())

输出结果为0.998左右的随机值,运行无报错。

原因解析

两者的核心差异在于Keras对输入的处理逻辑和校验严格程度:

  • from_logits=True模式:此时输入的y_pred是未经过激活函数的原始logits值,损失函数需要直接基于logits计算交叉熵。Keras在这里做了严格的形状校验,要求logits和labels形状完全一致——因为每个logits维度都需要对应一个标签维度,否则会出现逻辑歧义,所以直接抛出错误提示。
  • from_logits=False模式:此时默认y_pred是经过sigmoid激活后的概率值(范围0-1),Keras会启用TensorFlow的广播机制来自动匹配形状。你的例子中,形状为(10,1)的y_true会被广播扩展为(10,768),和y_pred逐元素计算损失后取平均,最终得到一个单一的损失值。

需要注意的是:虽然广播机制让代码能运行,但这通常不是实际任务中的预期逻辑——相当于把单个标签重复768次,和每个预测维度计算损失,这种操作在多数场景下是不合理的,只是Keras在非logits模式下没有强制形状匹配,而是依赖广播处理了输入。

内容的提问来源于stack exchange,提问作者Rahul Ohlan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:40:28