给定的示例here分别为encoder
和decoder
使用了两个优化器。为什么?什么时候这样做?
答案 0 :(得分:2)
如果您有多个网络(从多个对象的意义上继承自nn.Module
),您必须这样做的原因很简单:构建torch.nn.optim.Optimizer
对象时,它需要参数应该优化作为一个论点。在你的情况下:
encoder_optimizer = optim.Adam(encoder.parameters(), lr=learning_rate)
decoder_optimizer = optim.Adam(decoder.parameters(), lr=learning_rate)
这也使您可以自由地将参数作为学习速率独立变化。如果您不需要,可以创建一个继承自nn.Module
并包含网络,编码器和解码器的新类,或者创建一组参数,以便按照here解释给优化器:
nets = [encoder, decoder]
parameters = set()
for net in nets:
parameters |= set(net.parameters())
其中|
是此上下文中集合的union运算符。