pytorch 什么是惩罚一个预测超过另一个预测的正确方法?

vsnjm48y  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(132)

我有一个基于BERT的序列分类模型,它将4个字符串作为输入,并为每个字符串输出2个标签:

my_input = [string_1, string_2, string_3, string_4]
out_logits = model(my_input).logits
out_softmax = torch.softmax(out_logits)
out_softmax 
>>> tensor([[0.8666, 0.1334],
        [0.8686, 0.1314],
        [0.8673, 0.1327],
        [0.8665, 0.1335]], device='cuda:0', grad_fn=<SoftmaxBackward0>)

我的损失函数是nn.CrossEntropyLoss(),我的标签是Tensor,其索引对应于正确的标签:tensor([0., 0., 0., 1.])。注意,除了一个标签之外,每个标签都是1

loss = loss_fun(out_softmax, labels_tensor)
# step
optim.zero_grad()
loss.backward()
optim.step()

我遇到的问题是,模型只能预测一个类(例如,上面的第一列),不完全确定为什么会发生这种情况,但我认为对应该是1的预测进行更多的惩罚可能会有所帮助。
我怎样才能惩罚更多的预测?

cqoc49vn

cqoc49vn1#

可以将权重Tensor(每个类一个权重)传递给nn.CrossEntropyLoss的构造函数以获得这样的权重:
参数:
权重(Tensor,可选)-为每个类指定的手动重缩放权重。如果指定,则必须是大小为C的Tensor
其中C是类的数量。
但你也应该考虑其他选择,见上面@Sean的评论或this question

相关问题