交叉熵计算函数
第一种代码
import torch as t
import torch.nn as nn
# batch_size=3,计算对应每个类别的分数(只有两个类别)
score = t.randn(1, 4)
# 三个样本分别属于1,0,1类,label必须是LongTensor
label = t.Tensor([1]).long()
# loss与普通的layer无差异
criterion = nn.CrossEntropyLoss()
loss = criterion(score, label)
loss
第二种代码
def cal_loss(logits, targets, tag2id):
"""计算损失
参数:
logits: [B, L, out_size] out_size为不同类别的估计值
targets: [B, L]
首先把target经过mask后展平为一维tensor,然后同样的对logit做mask,view后为(-1,out_size)的size,做cross_entropy
可以考虑加value weight
"""
PAD = tag2id.get('<pad>')
assert PAD is not None
mask = (targets != PAD) # [B, L]
targets = targets[mask] #变成一维