【发布时间】:2020-11-18 23:52:40
【问题描述】:
我有一个由多个模块组合而成的深度神经网络,例如编码器、解码器等。在训练之前,我从预训练模型加载其部分参数,仅用于模块子集。例如,我可以加载一个预训练的编码器。然后我想冻结预训练模块的参数,以便它们不会与其余模块一起训练。在 Pytorch 中:
for param in submodel.parameters()
param.requires_grad = False
现在,我应该在学习时继续对这些冻结的模块应用 dropout 还是应该停用它(参见下面的示例)?为什么?
def MyModel(nn.Module):
...
def forward(x):
if freeze_submodule:
self.submodule.eval() # disable dropout when submodule is frozen
x = self._forward(x)
if freeze_submodule:
self.submodule.train()
【问题讨论】:
-
我不太明白你的问题。为什么要冻结子模块?你到底想完成什么?
-
@VictorZuanazzi 冻结预训练子模块有助于避免它们的权重被训练非预训练子模块导致的梯度弄乱。参见,例如,Jean et al 2015 或 Zoph et al., 2016。
标签: deep-learning transfer-learning dropout