【问题标题】:Use only certain layers of pretrained torchvision network仅使用预训练的 torchvision 网络的某些层
【发布时间】:2019-10-20 15:47:28
【问题描述】:

我正在尝试仅使用预训练的 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 预训练模型创建仅使用某些层的新(预训练)模型,例如除了最后一层之外的所有层?

【问题讨论】:

  • @Shai 我想删除 RoI-pooling 层,所以将所有内容保留在第一个 RoIHead 之前。换句话说:我希望将两个 Faster-RCNN 阶段作为两个独立的网络。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的提示。我现在查看了 generalized_rcnn.py 并复制了前向传递代码来调整它。它解决了我的问题。
  • @TheWaveLad 确保您能够在更改后加载预训练的参数。您可能需要调整加载的state_dict。
猜你喜欢
  • 2020-06-17
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2019-07-21
  • 2016-03-31
  • 1970-01-01
相关资源
最近更新 更多