【问题标题】:Difference between model.train(False) and required_grad = Falsemodel.train(False) 和 required_grad = False 之间的区别
【发布时间】:2020-12-13 06:35:08
【问题描述】:

我使用 Pytorch 库,我正在寻找一种方法来冻结我的模型中的权重和偏差。

我看到了这两个选项:

  1. model.train(False)

  2. for param in model.parameters(): param.requires_grad = False

有什么区别(如果有的话),我应该使用哪一个来冻结我的模型的当前状态?

【问题讨论】:

    标签: machine-learning deep-learning pytorch


    【解决方案1】:

    它们非常不同。

    独立于反向传播过程,当您训练或评估模型时,某些层具有不同的行为。在 pytorch 中,只有 2 个:BatchNorm(我认为在您评估时会停止更新其运行均值和偏差)和 Dropout(仅在训练模式下丢弃值)。所以model.train()model.eval()(相当于model.train(false))只需设置一个布尔标志来告诉这2层“冻结自己”。请注意,这两层没有任何受后向操作影响的参数(我认为在前向传递过程中会改变batchnorm buffer张量)

    另一方面,将所有参数设置为“requires_grad=false”只是告诉 pytorch 停止记录反向传播的梯度。这不会影响 BatchNorm 和 Dropout 层

    如何冻结你的模型取决于你的用例,但我想说最简单的方法是使用torch.jit.trace。这将为您的模型创建一个冻结副本,完全处于您调用trace 时的状态。您的模型不受影响。

    通常,您会调用

    model.eval()
    traced_model = torch.jit.trace(model, input)
    

    【讨论】:

    • 它torch.jit.trace 可逆吗?如果我决定要再训练几个时期
    • 我编辑了我的答案以增加清晰度。跟踪您的模型不会影响它,它只会创建它的冻结副本
    • BatchNorm 确实有可训练的参数——新的均值和标准差。请澄清你的答案。
    【解决方案2】:

    训练时有two ways冻结在PyTorch中:

    • requires_grad 设置为False
    • 将学习率 lr 设置为零

    虽然model.train(False) 是一种不训练的方式。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2012-08-23
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多