[torch] loss函数的注意事项

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)

这样会导致第一个错误:

  1. 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()

  1. 然后报错: 大致信息我忘了,好像是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进行训练

否则训练的曲线可能会不好看?

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值