You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何冻结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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:15:42