参考博客一: https://blog.csdn.net/zzy_pphz/article/details/105574082.
参考博客二: https://blog.csdn.net/zzy_pphz/article/details/105574288.
一、问题描述
我自己的网络模型用model.children()
返回只有一个模型,所有的层都在一个模块里,没法用for name, module in model._modules.items
来冻结部分模块。于是采用名字层冻结的方式。
二、代码实现
思路:
frozen_layers = [model.conv3d_1,model.conv3d_2,model.conv3d_3,model.channel_attention_1,model.spatial_attention_1,model.cancha ] #记录需要冻结的层的名字 #第一步冻结细化重构
for layer in frozen_layers:
for name, value in layer.named_parameters(): #冻结指定层的参数
value.requires_grad = False
params = filter(lambda p: p.requires_grad, model.parameters()) #确定新的可更新的网络参数
for k,v in model.named_parameters(): # 查看是否冻结成功
print('{}: {}'.format(k, v.requires_grad))
optimizer = torch.optim.Adam(params, lr = learning_rate, betas=(0.9, 0.999)) #优化器