对于大多数 PyTorch 代码,我们使用以下 Adam 优化器的定义:
有人能解释一下后一个定义为什么比前一个好吗?
optim = torch.optim.Adam(model.parameters(), lr=cfg['lr'], weight_decay=cfg['weight_decay'])
然而,经过反复试验,我发现下面的Adam定义提供了比较大的1.5dB更高的峰值信噪比。
optim = torch.optim.Adam(
[
{'params': get_parameters(model, bias=False)},
{'params': get_parameters(model, bias=True), 'lr': cfg['lr'] * 2, 'weight_decay': 0},
],
lr=cfg['lr'],
weight_decay=cfg['weight_decay'])
这个模型是一个常规的U-Net,其参数在init
和forward action
中定义,就像其他任何PyTorch模型一样。
get_parameters函数定义如下。
def get_parameters(model, bias=False):
for k, m in model._modules.items():
print("get_parameters", k, type(m), type(m).__name__, bias)
if bias:
if isinstance(m, nn.Conv2d):
yield m.bias
else:
if isinstance(m, nn.Conv2d) or isinstance(m, nn.ConvTranspose2d):
yield m.weight
有人能解释一下后一个定义为什么比前一个好吗?