我正在尝试仅使用通过以下方式初始化的预先训练的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预训练模型创建仅使用某些图层的新(预训练)模型,例如除了最后一层以外的所有层?
答案 0 :(得分:2)
与其他简单的CNN模型不同,将基于R-CNN的检测器转换为简单的nn.Sequential
模型并非易事。如果查看R-CNN('generalized_rcnn.py'
)的功能,您会发现输出功能(由FCN主干计算)不仅传递给RPN组件,而且还与输入图像甚至与目标(在培训期间)。
因此,我想,如果您想更改R-CNN的运行方式,则必须使用基类torchvision.models.detection.FasterRCNN()
并为其提供不同的roi池参数。