胶州住房和城乡建设厅网站,天津网上办事大厅官网,驻马店制作网站的公司,永久免费个人网站这里写目录标题1 Pytorch计算图和自动微分2 将单个数据从计算图中剥离 .detach3 使用with torch.go_grad(): 包含的代码段不会计算微分1 Pytorch计算图和自动微分
从功能上理解#xff1a; 计算图就是类似于数据结构中的无环有向图#xff0c;Pytorch中的计算图就是为了记录…
这里写目录标题1 Pytorch计算图和自动微分2 将单个数据从计算图中剥离 .detach3 使用with torch.go_grad(): 包含的代码段不会计算微分1 Pytorch计算图和自动微分
从功能上理解 计算图就是类似于数据结构中的无环有向图Pytorch中的计算图就是为了记录一个数据从开始到最后所作的操作和参数这样在进行反向传播时候(backward)就会有足够的参数去计算梯度得到最终值相较于操作过程中数据梯度之后再通过优化器(optimizer.step())对目标函数进行优化就几乎完成了一轮模型训练的目的。
将Tensor的requires_grad属性设置为True时Pytorch的torch.autograd会自动地追踪它的计算轨迹当需要计算微分的时候只需要对最终计算结果的Tensor调用backward方法中间所有计算节点的微分就会被保存在grad属性中
import torchx torch.arange(9, dtypetorch.float).view(3,3)
print(x默认不缓存计算轨迹,x, x.requires_grad)
y torch.randn(3,3, requires_gradTrue)
print(y设置requires_grad属性,y, y.requires_grad)
z torch.sum(torch.mm(x, y))
z.backward()
print(得到Z, z, z.requires_grad)
print(经过计算未保留x的梯度, x.grad)
print(经过计算保留了y的梯度, y.grad)out:
x默认不缓存计算轨迹 tensor([[0., 1., 2.],[3., 4., 5.],[6., 7., 8.]]) False
y设置requires_grad属性 tensor([[-0.2810, -2.7142, 1.8053],[-0.6549, 1.0730, -1.9470],[ 0.5629, -0.0692, -0.7376]], requires_gradTrue) True
得到Z tensor(-32.7122, grad_fnSumBackward0) True
经过计算未保留x的梯度 None
经过计算保留了y的梯度 tensor([[ 9., 9., 9.],[12., 12., 12.],[15., 15., 15.]])从上面可以看出y设置了requires_grad为True时在计算过后Pytorch会缓存其梯度信息而x为设置该属性即未保存该梯度信息。 汇总
Tensor属性作用针对Tensor构造时的属性后期也可以输出查看device该节点运行的设备环境即CPU/GPUrequires_grad自动微分机是否需要对该节点求导缺省为False针对Tensor输出时的属性构造时不可指定用来输出查看grad输出节点对该节点的梯度缺省为Nonegrad_fn中间计算节点关于全体输入节点的映射记录了前向传播经过的操作。叶节点为Noneis_leaf该节点是否为叶节点
当需要计算中间数据(x)的梯度时只需要将最后的结果值进行backward()后再打印x.grad即可
2 将单个数据从计算图中剥离 .detach 一般在模型训练中计算评价指标时我们需要停止数据的计算轨迹缓存则可以使用.detach将数据从计算图中剥离出去这个是针对单个数据的。 import torch
x torch.rand(3, 3, requires_gradTrue)
w torch.ones(3, 3, requires_gradTrue)
print(x)
print(w)
yy torch.mm(w, x)
print(yy.requires_grad)detach_yy yy.detach() #一般模型中使用loss计算评价指标时都会用类似这样的式子将loss从计算图中剥离备份出去。
y torch.sum(yy)
y.backward()print(进行剥离后detach_yy的属性, detach_yy.grad)
print(x的梯度缓存, x.grad)
print(w的梯度缓存, w.grad)out:
tensor([[0.8037, 0.2443, 0.3994],[0.9879, 0.9484, 0.4035],[0.3057, 0.6682, 0.4186]], requires_gradTrue)
tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]], requires_gradTrue)
True
进行剥离后detach_yy的属性 None
x的梯度缓存 tensor([[3., 3., 3.],[3., 3., 3.],[3., 3., 3.]])
w的梯度缓存 tensor([[1.4474, 2.3398, 1.3925],[1.4474, 2.3398, 1.3925],[1.4474, 2.3398, 1.3925]])3 使用with torch.go_grad(): 包含的代码段不会计算微分 想必这个在模型测试阶段大家都会用之所以用这个是将模型测试阶段的微分不计算在模型中否则模型把测试集都学过了那以后拿什么进行模型评价呢 import torch
x torch.rand(3, 3, requires_gradTrue)
w torch.ones(3, 3, requires_gradTrue)
y torch.sum(torch.mm(w, x))
print(正常缓存梯度信息, y.requires_grad)with torch.no_grad():y torch.sum(torch.mm(w, x))print(在with torch.no_grad中, y.requires_grad)out:
正常缓存梯度信息 True
在with torch.no_grad中 False