从网上看了说pytorch自定义损失函数的几种方法,其他几种就不说了,网上有好的教程说明
我就说一下大家最迷惑的 完全自定义损失函数,如果有不对的地方,请及时支出:
def my_mse_loss(x, y):
return torch.mean(torch.pow((x - y), 2))
这个损失函数,为什么可以反向传播,
首先经过pytorch 模型处理的结果变量的 requires_grad
设置为 True,这个属性代表了变量是否需要求导的,默认是不需要的,接下来一段代码可以验证
input = torch.randn(8, 3, 50, 100)
print(input.requires_grad)
# False
net = nn.Sequential(nn.Conv2d(3, 16, 3, 1),
nn.Conv2d(16, 32, 3, 1))
for param in net.named_parameters():
print(param[0], param[1].requires_grad)
# 0.weight True
# 0.bias True
# 1.weight True
# 1.bias True
output = net(input)
print(output.requires_grad)
# True
pytorch 变量 backward()方法是反向传播求导的方法。
可以z是一个标量,当调用它的backward方法后会根据链式法则自动计算出叶子节点的梯度值。
x = torch.tensor(1.0, requires_grad=True)
y = torch.tensor(2.0, requires_grad=True)
z = x**2+y
z.backward()
print(z, x.grad, y.grad)
>>> tensor(3., grad_fn=<AddBackward0>) tensor(2.) tensor(1.)
所以: 经过模型处理的变量可以求导,然后调用反向传播方法,在优化器的作用下,就可以做到反向传播更新参数。