使用torch.nn.CrossEntropyLoss传入weight参数触发TypeError错误
问题原因及解决方法
核心错误原因
你把weight参数传错地方了:
CrossEntropyLoss的weight是初始化损失函数实例时的参数,用来预设类别权重;- 而你直接把它放到了损失计算的调用(
forward方法)里,forward方法只接受模型输出(input)和标签(target),不识别weight这个关键字参数,所以触发了类型错误。
正确代码写法
先初始化带权重的损失函数实例,再用这个实例计算损失:
# 1. 初始化损失函数时传入weight参数 criterion = nn.CrossEntropyLoss(weight=weights) # 2. 用实例计算损失,只传模型输出和标签 loss = criterion(outputs, labels)
额外注意点
weights的维度要对应类别数量,不是和outputs/labels的长度一致:
- 假设你的任务有N个类别,
weights应该是形状为(N,)的张量; - 比如outputs是
(batch_size, N),labels是(batch_size,),那weights的长度必须是N,每个元素对应一个类别的权重。
内容的提问来源于stack exchange,提问作者Donald Mac Duck
相关产品推荐
相关产品推荐

