如何冻结ML网络除最后一层外的所有层?附CNN实现代码
冻结CNN除最后一层外所有层的实现方法
在PyTorch中,冻结网络层的核心是将对应层参数的requires_grad属性设置为False,反向传播时这些参数就不会被更新。针对你的ConvNet模型,具体实现方法如下:
方法一:精准指定冻结层
直接对需要冻结的层(conv1、conv2、fc1、fc2)逐个设置参数不可训练,保留最后一层fc3的可训练状态:
# 初始化并加载预训练模型 model = ConvNet() model.load_state_dict(torch.load("你的预训练权重路径.pth")) # 冻结卷积层和前两个全连接层 for param in model.conv1.parameters(): param.requires_grad = False for param in model.conv2.parameters(): param.requires_grad = False for param in model.fc1.parameters(): param.requires_grad = False for param in model.fc2.parameters(): param.requires_grad = False # 确保最后一层可训练(默认是True,此步骤可选,用于兜底) for param in model.fc3.parameters(): param.requires_grad = True
方法二:先全冻结再开启最后一层
这种方式更简洁,适合只保留最后一层训练的场景:
# 初始化并加载预训练模型 model = ConvNet() model.load_state_dict(torch.load("你的预训练权重路径.pth")) # 先冻结所有参数 for param in model.parameters(): param.requires_grad = False # 单独开启最后一层fc3的训练权限 for param in model.fc3.parameters(): param.requires_grad = True
优化器配置技巧
为提升训练效率,优化器只需传入requires_grad=True的参数,避免不必要的计算:
# 方式1:过滤出可训练参数 optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.001) # 方式2:直接传入最后一层的参数(更高效) optimizer = torch.optim.Adam(model.fc3.parameters(), lr=0.001)
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

