vector的回答已经比较详细地介绍了自己写pytorch 里loss function 的方法。但是在你自己去定义loss function前需要明白pytorch的自动求导机制,从而避免很多问题。
1.你想用的loss function究竟能不能作为loss function来监督学习。很多时候我们想要让test的结果适应与你的metric,那么第一想法是我直接拿评价标准作为loss呗,譬如图像超分辨用MSE训练,用PSNR测试,这是可行的,因为他们“可导”。但是很多时候,任务的评价标准是复杂的,里面可能有阈值设定、统计操作,你希望直接用这个评价标准做loss并不一定可行,它不可导。
2.了解torch的求导机制(autograd)。用pytorch训练时,似乎只用加个requires_grad=True网络就什么都给我们算了,但是往往我们自己去写loss function时会存在loss没有grad_fn的情况,那么你需要了解torch里的结构图、张量、叶子节点等有关torch是如何完成自动求导过程的。可以参考如下回答:xiaopl:PyTorch 的 Autogradzhuanlan.zhihu.com
这也是@vector三种写loss function方法里为什么有的需要自己写backward有的只用定义forward的原因,以及为什么最好用torch的运算而不要转成numpy的原因,因为要保证tensor在“管道”里流动。