loss 的特判?
事情的起因是我自己在 cross_entropy_loss 中加入了几个 if 特判,导致报了几个错误:
代码如下:
def loss(self, out, target):
mask = target != -1 # 去除tasget中的-1的sample
if torch.sum(mask) == 0:
return torch.tensor(0).to(out.device)
out = out[mask]
target = target[mask]
return F.cross_entropy(out, target, weight=self.loss_weight)
这样会导致第一个错误:
RuntimeError: result type Float can't be cast to the desired output type Long
因为 torch.tensor(0)
默认是 type.Long, 在计算loss时,不能转换成为float。
所以改成: torch.tensor(0.0).float()
- 然后报错: 大致信息我忘了,好像是loss需要设置required_grad=True
torch.tensor(0.0, requires_grad=True).float()
而且有一个坑,我一开始设置成为 :
torch.tensor(0, requires_grad=True).float()
它会报错:
RuntimeError: Only Tensors of floating point and complex dtype can require gradients
这也就是说,只有浮点数和复数支持梯度计算。
loss 最好不要放进optimizer进行训练
否则训练的曲线可能会不好看?