pytorch 反向传播 自动求导

welcome to my blog

输出是个标量

# 设y=2x^2
# 当x=2时, y对x求导的结果8, 下面进行验证
x = torch.tensor([2],dtype=torch.float,requires_grad=True)
y = 2*x*x
# 反向求导
y.backward()
# 保存y对x求导的结果
res = x.grad
print(res)
# 求导结果: tensor([8.])

输出是个向量

# 设y=3(x+1)^2
# 当x=[2,2,2]时, y对x求导的结果[18, 18, 18], 下面进行验证
x = torch.tensor([2,2,2],dtype=torch.float,requires_grad=True) # tensor([2., 2., 2.], requires_grad=True)
y = 3*(x+1)*(x+1) # tensor([27., 27., 27.], grad_fn=<MulBackward0>)
# 输出是个变量时必须指定变量的长度, 所以声明一个tmp张量, tmp的值会参与求导, 实际上就是跟求导结果相乘, 所以值为1得到的是原始的求导结果, 值为0.1得到的是原始求导结果的十分之一, 看下面的例子立马就明白了
tmp = torch.tensor([0.1,1,10],dtype=torch.float)
# 反向求导
# tmp的dtype必须是torch.float类型的, 不指定浮点类型的话求导时会报错:RuntimeError: Expected isFloatingType(grads[i].type().scalarType()) to be true, but got false
y.backward(tmp)
# 保存y对x求导的结果
res = x.grad
print(res)
# tensor([ 1.8000,  18.0000,  180.0000]) 之所以不都是18, 是因为tmp的值的作用
发布了489 篇原创文章 · 获赞 101 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/littlehaes/article/details/103824487