预训练VGG16冻结卷积层训练分类器时出现RuntimeError报错如何解决
报错产生原因
- 错误使用
requires_grad_接口:requires_grad_是PyTorch内置的可调用方法,不是可赋值属性,代码中model_conv.classifier.requires_grad_=True的写法完全不生效,遍历冻结所有参数后,分类器层的参数requires_grad仍为False,反向传播时没有可计算的梯度触发报错。 - 分类层修改逻辑错误:直接修改
out_features属性仅改变了参数描述值,没有实际修改分类层的权重张量形状,也不会自动开启参数梯度,同时还会导致后续计算时输出维度和标签维度不匹配的隐藏问题。
正确修改方案
直接替换VGG16分类器的最后一层全连接层即可,新生成的层参数默认开启梯度,无需额外手动设置梯度开关,完全匹配「冻结卷积层仅训练分类器」的需求,修复后代码如下:
model_conv = torchvision.models.vgg16(pretrained=True) # 冻结全部参数 for param in model_conv.parameters(): param.requires_grad = False # 替换最后一层全连接层,适配自定义数据集类别数 num_ftrs = model_conv.classifier[6].in_features model_conv.classifier[6] = nn.Linear(num_ftrs, len(class_names)) model_conv = model_conv.to(device) criterion = nn.CrossEntropyLoss() optimizer_conv = optim.SGD(model_conv.classifier.parameters(), lr=0.001, momentum=0.9) exp_lr_scheduler = lr_scheduler.StepLR(optimizer_conv, step_size=7, gamma=0.1)
内容的提问来源于stack exchange,提问作者Dhruv Vashist
相关产品推荐
相关产品推荐

