使用optim.SGD传入Hardtanh/ReLU参数时报空参数列表错误,求原因
问题原因
nn.Hardtanh、nn.ReLU这类激活函数属于无参数层,它们内部没有可训练的权重(weight)或偏置(bias)参数,调用.parameters()方法会返回空的参数迭代器,优化器拿到空列表就会抛出optimizer got an empty parameter list错误。nn.Linear是带可训练参数的层,包含weight和bias两个可训练张量,调用.parameters()能返回有效的参数集合,因此优化器可以正常初始化。
解决方案
根据你的实际需求调整优化目标:
- 如果是误将激活函数替换了全连接输出层:应该保留全连接层作为输出层,把激活函数附加在其后,示例代码:
num_ftrs = model_conv.fc.in_features # 用Sequential组合全连接层和激活函数 model_conv.fc = nn.Sequential( nn.Linear(num_ftrs, 1), nn.Hardtanh(min_val=0.0, max_val=1.0) ) # 优化全连接层的参数(激活函数无参数无需优化) optimizer_conv = optim.SGD(model_conv.fc[0].parameters(), lr=config.learning_rate, momentum=config.momentum)
- 如果需要优化模型其他部分的参数:比如想优化卷积主干的参数,直接指定对应参数即可:
# 优化整个模型的参数 optimizer_conv = optim.SGD(model_conv.parameters(), lr=config.learning_rate, momentum=config.momentum) # 或者仅优化卷积主干参数(假设主干存在于model_conv.base下) optimizer_conv = optim.SGD(model_conv.base.parameters(), lr=config.learning_rate, momentum=config.momentum)
内容的提问来源于stack exchange,提问作者Krzysztof Marchewka
相关产品推荐
相关产品推荐

