python - Pytorch 预训练模型中的类数
问题描述
我想使用 Pytorch 中的预训练模型在自己的数据集中进行图像分类,但是我应该如何在冻结特征提取层的参数的同时更改类的数量?
这些是我想要包括的模型:
resnet18 = models.resnet18(pretrained=True)
densenet161 = models.densenet161(pretrained=True)
inception_v3 = models.inception_v3(pretrained=True)
shufflenet_v2_x1_0 = models.shufflenet_v2_x1_0(pretrained=True)
mobilenet_v3_large = models.mobilenet_v3_large(pretrained=True)
mobilenet_v3_small = models.mobilenet_v3_small(pretrained=True)
mnasnet1_0 = models.mnasnet1_0(pretrained=True)
resnext50_32x4d = models.resnext50_32x4d(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
提前非常感谢!
我添加的新代码:
import torch
from torchvision import models
class MyResModel(torch.nn.Module):
def __init__(self):
super(MyResModel, self).__init__()
self.classifier = nn.Sequential(
nn.Linear(512,256),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(256,3),
)
def forward(self, x):
return self.classifier(x)
resnet18 = models.resnet18(pretrained=True)
resnet18.fc = MyResModel()
for param in resnet18.parameters():
param.requires_grad_(False)
解决方案
您必须更改相应模型的最终线性层。
以 resnet 为例,当我们打印模型时,我们看到最后一层是全连接层,如下图:
(fc): Linear(in_features=512, out_features=1000, bias=True)
因此,您必须将 model.fc 重新初始化为具有 512 个输入特征和 2 个输出特征的线性层:
model.fc = nn.Linear(512, num_classes)
对于其他型号,您可以在此处查看
要冻结网络的参数,您必须使用以下代码:
for name, param in model.named_parameters():
if 'fc' not in name:
print(name, param.requires_grad)
param.requires_grad=False
验证:
for name, param in model.named_parameters():
print(name,param.requires_grad)
请注意,对于此示例,“fc”是分类层的名称。这不是其他型号的情况。您必须检查模型才能找到分类层的名称。
推荐阅读
- javascript - 单击单选按钮复制
- java - 如何通过spring rest模板使用原始数据发布请求
- javascript - 如何在firebase中为每个用户存储对象列表
- python - Pyx 模块的 Python 错误:“SingleLatexRunner”对象没有属性“texoutput”
- php - strtotime 在不同的环境中失败
- python - Python 覆盖 Excel 中的数据
- java - 如何从组合框中禁用/删除上下文菜单?
- angular - 如何为另一个模型数据添加响应式表单等验证器
- python - Python:如何在派生类之间共享类属性?
- akka - Akka 集群配置