为了从头开始训练pytorch模型,我需要更改哪些参数?

2024-05-13 03:07:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我按照本教程培训了一个pytorch模型,用于实例分割: https://pytorch.org/tutorials/intermediate/torchvision_tutorial.html

我不想在完全不同的数据和类别上训练一个模型,这与COCO完全无关。我需要做哪些更改来重新培训模型。根据我的阅读,我猜除了有正确数量的课程外,我只需要训练这一行:

model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)

model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False)

但是我注意到还有另外一个参数:pretrained_backbone=True, trainable_backbone_layers=None它们也应该更改吗


Tags: 实例https模型truemodelmodels教程pytorch
2条回答

maskrcnn_resnet50_fpn{a1}

  • 预培训(bool)-如果为真,则返回在COCO train2017上预培训的模型
  • 预训练主干(bool)–如果为真,则返回在Imagenet上预训练主干的模型
  • 可训练主干层(int)–从最终块开始的可训练(非冻结)resnet层的数量。有效值介于0和5之间,5表示所有主干层都是可训练的

因此,对于从头开始的培训,请使用:

model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False, pretrained_backbone=False, trainable_backbone_layers=5, num_classes=your_num_classes)

或:

model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False, pretrained_backbone=False, num_classes=your_num_classes)

因为在maskrcnn_resnet50_fpn的源代码中:

if not (pretrained or pretrained_backbone):
    trainable_backbone_layers = 5

函数签名是

torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False, progress=True, num_classes=91, pretrained_backbone=True, trainable_backbone_layers=3, **kwargs)

设置pretrained=False将告诉PyTorch不要下载在COCO train2017上预先培训过的模型。你想要它,因为你对训练感兴趣

通常,如果您想在不同的数据集上进行训练,这就足够了

设置pretrained=False时,PyTorch将在ImageNet上下载预训练的ResNet50。默认情况下,它将冻结名为conv1layer1的前两个块。这是如何在更快的R-CNN论文中完成的,该论文对预训练主干的初始层进行了冻结

(只需打印模型以检查其结构)

layers_to_train = ['layer4', 'layer3', 'layer2', 'layer1', 'conv1'][:trainable_layers]

现在,如果您甚至不想冻结前两层,可以设置trainable_backbone_layers=5(设置pretrained_backbone=False时自动完成),这将从头开始训练整个resnet主干网

勾选PR#2160

相关问题 更多 >