【问题标题】:requires_grad relation to leaf nodesrequires_grad 与叶节点的关系
【发布时间】:2017-12-08 09:13:00
【问题描述】:

来自docs

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

  1. 这里的叶节点是什么意思?叶节点是否只是输入节点?
  2. 如果只能在叶节点处更改,那我如何冻结图层呢?

【问题讨论】:

    标签: torch pytorch


    【解决方案1】:
    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 标志,只为您想学习的参数子集定义优化器。

    【讨论】:

    • 一个层的所有参数都是叶子节点并且需要grad,这就是custom Network的输出需要grad的原因。是真的吗?
    • 我能想到一个反例。权重归一化要求您的变量根据数据进行初始化。 PyTorch 中关于此的当前行为是什么?
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2019-09-05
    • 2017-05-08
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多