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

当sum(y_true)=1时应选用何种损失函数?使用CategoricalCrossentropy遇类型错误

问题解决:CategoricalCrossentropy类型错误

这个错误跟你的标签格式没关系——你的[0.2, 0.8]这类概率分布标签完全符合CategoricalCrossentropy的要求(sum=1的非独热分布是合法输入)。问题出在你调用损失函数的方式错了。

错误原因

你大概率是直接把CategoricalCrossentropy类本身传给了模型的compile方法,或者计算损失时直接用了类对象,而没有实例化它。比如你可能写了:

# 错误写法:直接传类,不是实例
model.compile(optimizer='adam', loss=CategoricalCrossentropy)

这种写法会导致Keras把类对象当成损失张量来处理,自然会报类型不匹配的错误。

正确用法

有两种正确的方式:

  1. 用字符串指定损失函数名称(最简单)
model.compile(optimizer='adam', loss='categorical_crossentropy')
  1. 实例化损失函数类(加括号)
from keras.losses import CategoricalCrossentropy
# 实例化后传入,括号不能少
model.compile(optimizer='adam', loss=CategoricalCrossentropy())

关于标签的补充说明

你的标签是概率分布而非独热编码,完全适配CategoricalCrossentropy:

  • 如果模型最后一层用的是softmax激活(输出概率),保持默认的from_logits=False即可;
  • 如果模型输出是logits(没有经过softmax),需要在实例化时设置from_logits=True:
loss = CategoricalCrossentropy(from_logits=True)
model.compile(optimizer='adam', loss=loss)

内容的提问来源于stack exchange,提问作者Fenil Gajera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:53:15