Class00.4自动求导代码

Class00.4自动求导代码

import torch
# 定义一个4个元素的向量
x = torch.arange(4.0)
x
# 支持梯度计算
x.requires_grad_(True)
# 计算梯度
x.grad
# 计算向量点积
# torch.dot(a,b):向量点积计算
y = 2 * torch.dot(x,x)
# 打印结果
y
# 进行反向传播
# 2x²的导数是4x
y.backward()
# 计算梯度
x.grad
# 进行结果验证
x.grad == 4 * x
# 将之前的梯度清零
x.grad.zero_()
# 将x的计算结果重新赋值给y
# y = 0 + 1 + 2 + 3
y = x.sum()
# 对y进行反向传播
y.backward()
# 计算x的梯度
x.grad
# 打印y的值
# y
# 将之前的梯度清零
x.grad.zero_()
# 设置y=x²
y = x * x
# 对y求和后进行反向传播
y.sum().backward()
# 计算x的梯度
x.grad
# 将之前的梯度清零
x.grad.zero_()
# 设置y=x²
y = x * x
# 将y=x²整体看作是常数
u = y.detach()
# z=常数*x
z = u * x
# 对z求和后进行反向传播
z.sum().backward()
# 一次项的导数结果为常数
x.grad == u
# 将之前的梯度清零
x.grad.zero_()
# 对y求和后进行反向传播
y.sum().backward()
# x²的导数为2x(在u中设置为常数,但y保持不变)
x.grad == 2 * x

def f(a):
# 定义函数b
b = a * 2
# 判断b的L2范数 < 1000
while b.norm() < 1000:
# b的大小翻倍
b = b * 2
# 当b的和 > 0
if b.sum() > 0:
# b赋值给c
c = b
else:
# 否则c=100b
c = 100 * b
return c

# 设置a为随机数,支持梯度计算
a = torch.randn(size=(),requires_grad=True)
# 调用函数f(a)
d = f(a)
# 进行反向传播
d.backward()

# 判断a的梯度是否等于 d/a
a.grad == d / a
# a > 0:d=f(a)=a*2**n
# a < 0:d=f(a)=a*2**n*100

# a > 0:d/a=2**n
# a < 0:d/a=2**n*100

# 所以a.grad==d/a 是成立的

你可能感兴趣的:(深度学习,python,深度学习,pytorch)