我遵循本教程训练了用于实例分割的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
也应该更改吗?
函数签名是
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。默认情况下,它将冻结名为conv1
和layer1
的前两个块。这就是Faster R-CNN论文中的方法,该论文冻结了预训练主干的初始层。
(只需打印模型以检查其结构(。
layers_to_train = ['layer4', 'layer3', 'layer2', 'layer1', 'conv1'][:trainable_layers]
现在,如果您甚至不希望前两层冻结,可以设置trainable_backbone_layers=5
(在设置pretrained_backbone=False
时自动完成(,这将从头开始训练整个resnet主干。
检查PR#2160。
来自maskrcnn_resnet50_fpn
文档:
- 预训练(bool(–如果为True,则返回在COCO train2017上预训练的模型
- pretrained_b主干(bool(–如果为True,则返回在Imagenet上预训练主干的模型
- trainable_backbone_layers(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