深度学习——(6)pytorch冻结某些层的参数
深度学习——(6)pytorch冻结某些层的参数
在加载预训练模型的时候,有时候想冻结前面几层,使其参数在训练过程中不发生变化(不进行反向传播)
问题出现
在之前的blog——中,使用如下语法
net = vgg(model_name=model_name, num_classes=1000,init_weights=True) # 没有训练好的权重,需要加载ImageNet的权重
net.load_state_dict(torch.load(pre_path, map_location=device))
for parameter in net.parameters():
parameter.required_grad = False
注:上面语句的含义我的理解是将所有的层都冻结 但是,出现了一个神奇的问题,当我打印每一层是否已经冻结,所有层的require_grad都显示为True。** 这,这不就是意思把真个model已知都在反向传播吗??那我加载权重干什么??为了一探究竟,所以做了下面的尝试,想看看到底这个required_grad是怎么一回事?
一探究竟
try 1. 不加required_grad
当不加required_grad的时候(上面代码不加后面两行),默认required_grad=True,训练时候的loss值应该会很大,看看结果如何 确实很大!!!
try 2. 使用原来的格式更改(上面提到的)
如果使用前面提到的,那应该所有的参数都被冻结了,loss应该不会像上面那么大了,但是打印每一层的grad依然显示True。——反正就神奇!
for parameter in net.parameters(): #required_grad==False 才不会反向传播,只训练下面部分(微调)
parameter.required_grad = False
for name, value in net.named_parameters():
print(name: {0}, grad: {1}.format(name, value.requires_grad))
try 3. 定义no_grad列表将部分层冻结
这才是我的初衷,师兄也和我说先冻结前面的层,对后面的分类进行整体学习,然后放开全局进行微调。所以我的意愿是先冻结feature层进行学习。
no_grad = [features.0.weight,features.0.bias,
features.2.weight,features.2.bias,
features.5.weight,features.5.bias,
features.7.weight,features.7.bias,
features.10.weight,features.10.bias,
features.12.weight,features.12.bias,
features.14.weight,features.14.bias,
features.17.weight,features.17.bias,
features.19.weight,features.19.bias,
features.21.weight,features.21.bias,
features.24.weight,features.24.bias,
features.26.weight,features.26.bias,
features.28.weight,features.28.bias
]
for name, value in net.named_parameters():
if name in no_grad:
value.requires_grad = False
else:
value.requires_grad = True
print(name: {0}, grad: {1}.format(name, value.requires_grad))
上一篇:
JS实现多线程数据分片下载
