【问题标题】:PyTorch transfer learning with pre-trained ImageNet modelPyTorch 迁移学习与预训练的 ImageNet 模型
【发布时间】:2018-12-21 12:18:06
【问题描述】:

我想在已经在 ImageNet 上训练过的模型上使用迁移学习创建一个图像分类器。

如何将torchvision.models ImageNet 分类器的最后一层替换为我自己的自定义分类器?

【问题讨论】:

    标签: python pytorch torchvision


    【解决方案1】:

    获取预训练的 ImageNet 模型(resnet152 的准确率最高):

    from torchvision import models
    # https://pytorch.org/docs/stable/torchvision/models.html
    model = models.resnet152(pretrained=True)
    

    打印出它的结构,以便我们与最终状态进行比较:

    print(model)
    

    从模型中移除最后一个模块(通常是单个全连接层):

    classifier_name, old_classifier = model._modules.popitem()
    

    冻结模型的特征检测器部分的参数,使其不被反向传播调整:

    for param in model.parameters():
        param.requires_grad = False
    

    创建一个新的分类器:

    classifier_input_size = old_classifier.in_features
    
    classifier = nn.Sequential(OrderedDict([
                               ('fc1', nn.Linear(classifier_input_size, hidden_layer_size)),
                               ('activation', nn.SELU()),
                               ('dropout', nn.Dropout(p=0.5)),
                               ('fc2', nn.Linear(hidden_layer_size, output_layer_size)),
                               ('output', nn.LogSoftmax(dim=1))
                               ]))
    

    分类器的模块名称需要与被移除的模块名称相同。将我们的新分类器添加到特征检测器的末尾:

    model.add_module(classifier_name, classifier)
    

    最后,打印出新网络的结构:

    print(model)
    

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 2022-11-10
      • 1970-01-01
      • 2021-04-17
      • 2020-11-30
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多