requires_grad 与叶节点的关系

问题描述 投票:0回答:1

来自文档

requires_grad – 布尔值,指示变量是否已被 由包含任何需要它的变量的子图创建。能 仅在叶变量上更改

  1. 这里的叶子节点是什么意思?叶子节点只是输入节点吗?
  2. 如果只能在叶节点更改,那么如何冻结图层?
pytorch
1个回答
17
投票
  1. 图的叶节点是那些不是直接从图中其他节点计算的节点(即

    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
    只能为叶节点设置的原因:对于所有其他节点,它可以被智能地推断出来,并且实际上是由用于计算这些其他变量的叶节点的设置决定的。

  2. 请注意,在典型的神经网络中,所有参数都是叶节点。它们不是根据网络中的任何其他

    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
    标志,只为您想要学习的参数子集定义优化器。

© www.soinside.com 2019 - 2024. All rights reserved.