1

假设我训练了一个自动编码器。我想冻结编码器的参数进行训练,所以只有解码器训练。

我可以这样做:

# assuming it's a single layer called 'encoder'
model.encoder.weights.data.requers_grad = False 

或者我只能将解码器的参数传递给优化器。有区别吗?

4

1 回答 1

2

最实用的方法是遍历要冻结的模块的所有参数并设置required_gradFalse. 这使您可以灵活地打开和关闭模块,而无需每次都初始化新的优化器。您可以使用parameters所有nn.Modules 上可用的生成器来执行此操作:

for param in module.parameters():
    param.requires_grad = False

此方法与模型无关,因为您不必担心您的模块是否包含多个层或子模块。


或者,您可以调用该函数nn.Module.requires_grad_一次:

module.requires_grad_(False)
于 2021-08-04T11:54:51.730 回答