requires_grad 与叶节点的关系
requires_grad relation to leaf nodes
来自docs:
requires_grad – Boolean indicating whether the Variable has been
created by a subgraph containing any Variable, that requires it. Can
be changed only on leaf Variables
- 这里的叶节点是什么意思?叶子节点只是输入节点吗?
- 如果只能在叶节点改变,那我怎么冻结图层呢?
图的叶节点是那些不是直接从图中其他节点计算的节点(即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
如果叶节点 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)
尽管如此,你真正做的是冻结整个梯度计算(这是你应该做的,因为它避免了不必要的计算)。从技术上讲,您可以保留 requires_grad
标志,并且只为您想要学习的参数子集定义优化器。
来自docs:
requires_grad – Boolean indicating whether the Variable has been created by a subgraph containing any Variable, that requires it. Can be changed only on leaf Variables
- 这里的叶节点是什么意思?叶子节点只是输入节点吗?
- 如果只能在叶节点改变,那我怎么冻结图层呢?
图的叶节点是那些不是直接从图中其他节点计算的节点(即
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
如果叶节点
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)
尽管如此,你真正做的是冻结整个梯度计算(这是你应该做的,因为它避免了不必要的计算)。从技术上讲,您可以保留
requires_grad
标志,并且只为您想要学习的参数子集定义优化器。