来自文档:
requires_grad - 布尔值,指示变量是否由包含任何变量的子图创建,需要它.只能在叶子变量上更改
图的叶节点是那些Variables
不是直接从图中的其他节点计算的节点(即).例如:
import torch
from torch.autograd import Variable
A = Variable(torch.randn(10,10)) # this is a leaf node
B = 2 * A # this is not a leaf node
w = Variable(torch.randn(10,10)) # this is a leaf node
C = A.mm(w) # this is not a leaf node
Run Code Online (Sandbox Code Playgroud)
如果是叶节点requires_grad
,则从中计算的所有后续节点也将自动生成require_grad
.否则,您无法应用链规则来计算叶节点的梯度requires_grad
.这就是为什么requires_grad
只能为叶节点设置的原因:对于所有其他节点,可以巧妙地推断它,并且实际上由用于计算这些其他变量的叶节点的设置确定.
注意,在典型的神经网络中,所有参数都是叶节点.它们不是从Variables
网络中的任何其他计算的.因此,使用冷冻层requires_grad
很简单.这里是一个从PyTorch文档中获取的示例:
model = torchvision.models.resnet18(pretrained=True)
for param in model.parameters():
param.requires_grad = False
# Replace the last fully-connected layer
# Parameters of newly constructed modules have requires_grad=True by default
model.fc = nn.Linear(512, 100)
# Optimize only the classifier
optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
Run Code Online (Sandbox Code Playgroud)
即使你真正做的是冻结整个梯度计算(这是你应该做的,因为它避免了不必要的计算).从技术上讲,您可以保留requires_grad
标志,并仅为您想要学习的参数子集定义优化器.
归档时间: |
|
查看次数: |
1524 次 |
最近记录: |