在Pytorch中微调预训练模型MobileNet_V2

8

我是pyTorch的新手,正在尝试创建一个分类器,其中我有大约10种图像文件夹数据集。为此任务,我使用了预训练模型(MobileNet_v2),但问题是我不能更改它的FC层。它没有model.fc属性。请问是否有人能帮助我做到这一点。谢谢。

4个回答

9

做类似以下的操作:

import torch
model = torch.hub.load('pytorch/vision', 'mobilenet_v2', pretrained=True)
print(model.classifier)

model.classifier[1] = torch.nn.Linear(in_features=model.classifier[1].in_features, out_features=10)
print(model.classifier)

输出:

Sequential(
  (0): Dropout(p=0.2)
  (1): Linear(in_features=1280, out_features=1000, bias=True)
)
Sequential(
  (0): Dropout(p=0.2)
  (1): Linear(in_features=1280, out_features=10, bias=True)
)

注意:你需要使用torch.hub,需安装torch >= 1.1.0版本。


8
MobileNet V2源代码来看,该模型最后有一个名为classifier的序列模型。因此,您应该能够像这样更改分类器的最后一层:
import torch.nn as nn
import torchvision.models as models
model = models.mobilenet_v2()
model.classifier[1] = nn.Linear(model.last_channel, 10)

很遗憾,我现在无法测试这段代码。
这里也是一个很好的参考,关于如何微调模型。


实际上,模块 torchvision.models 没有属性 mobilnet_v2。现有的模型包括 [resnet, alexnet, vgg, squeezenet, densenet, inception] - Anubhav Singh
3
@AnubhavSingh,实际上自最近torchvision的更新后确实有所改变。 https://pytorch.org/docs/stable/torchvision/models.html - Deb
我明白了。我的错。非常感谢你。 - Anubhav Singh

3

MobilenetV2的实现需要输入num_classes(默认为1000),并提供一个名为self.classifier的属性,它是一个输出维度为num_classes的torch.nn.Linear层。你可以使用这个属性进行微调。你可以查看代码以获得更好的理解。

import torchvision.models as models
model = models.mobilnet_v2(num_classes=10)

1
很高兴知道有这些额外的参数!但应该指出,使用num_classes参数会防止下载预训练模型,而这正是这个问题的关键。此外,这里是代码的更新链接。 - DalyaG

0

通过查看models.mobilenet_v2中的最后一层,您可以看到以下内容:

(classifier): Sequential(
(0): Dropout(p=0.2, inplace=False)
(1): Linear(in_features=1280, out_features=1000, bias=True)

要将 out_features1000 修改为任意类别数 num_classes

from torchvision import models
import torch.nn as nn
model_ft = models.mobilenet_v2(pretrained=True)
num_ftrs = model_ft.classifier[1].in_features
model_ft.classifier[1] = nn.Linear(num_ftrs, num_classes)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接