结论:
requires_grad_(False)只会将当前层的参数固定,对梯度往前传播不造成影响,从结果上看除了第二层的grad为None,与不固定参数来比其他层grad是相同的。detach_()直接从当前层把梯度截断了。显然,requires_grad_(False)更加灵活,可以把任意层的参数固定,而使用detach_(),当前层和之前的所以层的参数都固定,但是如果需求是一样的话detach_()的性能更好一些。
目录
resnet冻结部分层示例
# 冻结前几层的参数
for name, param in resnet.named_parameters():
if "layer3" not in name and "layer4" not in name: # 冻结特定层
param.requires_grad = False
bn层,卷积层测试:
import torch
from torch import nn
def init_weights(m):
if type(m) == torch.nn.Linear :
m.weight.data=torch.ones_like(m.weight)
m.bias.data = torch.ones_like(m.bias)
class Net(torch.nn.Module):
def __init__(self):
sup