仅使用预先训练的火炬网络的某些层

时间:2019-06-05 06:34:30

标签: image-processing machine-learning computer-vision pytorch object-detection

我正在尝试仅使用通过以下方式初始化的预先训练的Torchvision Faster-RCNN网络中的某些层:

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()

这有效。但是,将model.modules()model.children()传递到nn.Sequential会产生错误。即使通过整个模型也会导致错误,例如

model = torch.nn.Sequential(*model.modules())
model.eval()
# x is a [C, H, W] image
y = model(x)

导致

AttributeError: 'dict' object has no attribute 'dim'

model = torch.nn.Sequential(*model.children())
model.eval()
# x is a [C, H, W] image
y = model(x)

导致

TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not tuple

这使我感到困惑,因为过去我已经修改了其他PyTorch预训练模型。如何使用FasterRCNN预训练模型创建仅使用某些图层的新(预训练)模型,例如除了最后一层以外的所有层?

1 个答案:

答案 0 :(得分:2)

与其他简单的CNN模型不同,将基于R-CNN的检测器转换为简单的nn.Sequential模型并非易事。如果查看R-CNN('generalized_rcnn.py')的功能,您会发现输出功能(由FCN主干计算)不仅传递给RPN组件,而且还与输入图像甚至与目标(在培训期间)。

因此,我想,如果您想更改R-CNN的运行方式,则必须使用基类torchvision.models.detection.FasterRCNN()并为其提供不同的roi池参数。