【发布时间】:2021-11-13 00:54:21
【问题描述】:
在学习了autograd之后,我尝试自己制作损失函数。 这是我的损失
def myCEE(outputs,targets):
exp=torch.exp(outputs)
A=torch.log(torch.sum(exp,dim=1))
hadamard=F.one_hot(targets, num_classes=10).float()*outputs
B=torch.sum(hadamard, dim=1)
return torch.sum(A-B)
我和 torch.nn.CrossEntropyLoss 比较
这里是结果
for i,j in train_dl:
inputs=i
targets=j
break
outputs=model(inputs)
myCEE(outputs,targets) : tensor(147.5397, grad_fn=<SumBackward0>)
loss_func = nn.CrossEntropyLoss(reduction='sum') : tensor(147.5397, grad_fn=<NllLossBackward>)
值相同。
我想,因为这些是不同的功能,所以 grad_fn 是不同的,它 不会造成任何问题。
但是发生了一些事情!
4 个 epoch 后,损失值变为nan。
与myCEE相反,nn.CrossEntropyLoss 学习进展顺利。
所以,不知道是不是我的功能有问题。
在阅读了一些关于nan 问题的帖子后,我在模型中堆叠了更多的卷积。
结果 39-epoch 的训练没有出错。
不过,我想知道 myCEE 和 nn.CrossEntropyLoss 之间的区别
【问题讨论】:
标签: python pytorch loss-function cross-entropy