PyTorch可训练参数计算异常:EfficientNet-B7参数统计不符
问题原因及解决方法
核心问题
直接修改model.classifier[-1].out_features不会改变线性层的实际参数形状。PyTorch中nn.Linear的out_features只是一个属性标记,修改它不会自动重新初始化权重和偏置张量,原分类层的参数依然是针对1000类任务的(权重形状为(2560, 1000),偏置为(1000)),所以可训练参数数量还是(2560+1)*1000=2561000。
正确修改方式
需要直接替换最后一层线性层,重新创建对应4分类的参数:
from torch import nn from torchsummary import summary from torchvision import models model = models.efficientnet_b7(pretrained=True) # 替换最后一层线性层,指定输入特征数和4个输出类别 model.classifier[-1] = nn.Linear(model.classifier[-1].in_features, 4) # 添加Softmax层 model.classifier = nn.Sequential(*model.classifier, nn.Softmax(dim=1)) # 冻结特征层 for child in model.features: for param in child.parameters(): param.requires_grad = False
验证修改效果
执行以下代码可以确认可训练参数数量:
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad) print(trainable_params) # 输出应为10244
此时summary(model, (3,128,128))也会显示分类层的输出为4,可训练参数数量正确。
内容的提问来源于stack exchange,提问作者john_ny
相关产品推荐
相关产品推荐

