ShuffleNet 中优化器的参数
Parameters for Optimizer in ShuffleNet
在 ShuffleNet 中,发送到优化器的参数首先从以下函数传递,该函数生成权重字典:
def get_parameters(model):
group_no_weight_decay = []
group_weight_decay = []
for pname, p in model.named_parameters():
if pname.find('weight') >= 0 and len(p.size()) > 1:
# print('include ', pname, p.size())
group_weight_decay.append(p)
else:
# print('not include ', pname, p.size())
group_no_weight_decay.append(p)
assert len(list(model.parameters())) == len(group_weight_decay) + len(group_no_weight_decay)
groups = [dict(params=group_weight_decay), dict(params=group_no_weight_decay, weight_decay=0.)]
return groups
然后:
optimizer = optim.Adam(get_parameters(model), lr=0.01)
但是这个函数和仅仅使用 model.parameters
而不是 get_parameters(model)
有什么区别呢?
与 model.parameters()
yo get all 单个“组”中的模型参数,因此优化器的所有超参数对于所有 model.parameters()
.
相比之下,get_parameters()
将 model.parameters()
分为两组:group_weight_decay
和 group_no_weight_decay
。顾名思义,对于第二组的参数,优化器将 weight_decay
超参数设置为零。
在 ShuffleNet 中,发送到优化器的参数首先从以下函数传递,该函数生成权重字典:
def get_parameters(model):
group_no_weight_decay = []
group_weight_decay = []
for pname, p in model.named_parameters():
if pname.find('weight') >= 0 and len(p.size()) > 1:
# print('include ', pname, p.size())
group_weight_decay.append(p)
else:
# print('not include ', pname, p.size())
group_no_weight_decay.append(p)
assert len(list(model.parameters())) == len(group_weight_decay) + len(group_no_weight_decay)
groups = [dict(params=group_weight_decay), dict(params=group_no_weight_decay, weight_decay=0.)]
return groups
然后:
optimizer = optim.Adam(get_parameters(model), lr=0.01)
但是这个函数和仅仅使用 model.parameters
而不是 get_parameters(model)
有什么区别呢?
与 model.parameters()
yo get all 单个“组”中的模型参数,因此优化器的所有超参数对于所有 model.parameters()
.
相比之下,get_parameters()
将 model.parameters()
分为两组:group_weight_decay
和 group_no_weight_decay
。顾名思义,对于第二组的参数,优化器将 weight_decay
超参数设置为零。