如何解决model.trainFalse和required_grad = False之间的区别
我使用Pytorch库,我正在寻找一种方法来冻结模型中的权重和偏差。
我看到了这两个选项:
-
model.train(False)
-
for param in model.parameters(): param.requires_grad = False
有什么区别(如果有),我应该使用哪一个冻结模型的当前状态?
解决方法
它们非常不同。
与反向传播过程无关,在训练或评估模型时,某些层具有不同的行为。在pytorch中,只有2种:BatchNorm(在您评估时,我认为停止更新其运行平均值和偏差)和Dropout(仅在训练模式下丢弃值)。因此,model.train()
和model.eval()
(相当于model.train(false)
)仅设置了一个布尔标志来告诉这两层“冻结自己”。请注意,这两层没有任何受后向操作影响的参数(我认为,batchnorm buffer 张量会在前向传递过程中更改)
另一方面,将所有参数设置为“ requires_grad = false”只会告诉pytorch停止记录反向传播的梯度。这不会影响BatchNorm和Dropout层
如何冻结模型有点取决于您的用例,但是我想说最简单的方法是使用torch.jit.trace。这将在您调用trace
时的状态下完全创建模型的冻结副本。您的模型不受影响。
通常,您会打电话
model.eval()
traced_model = torch.jit.trace(model,input)
,
在训练时,有two ways会冻结在PyTorch中:
- 将
AddHeadersRequiredAttribute
设置为Startup.Configure
- 将学习率lr设置为零
app.UseMiddleware<AddHeadersMiddleware>();
是一种不训练的方式。 ;)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。