如何在预加载的 torchvision 模型中找到层的名称?

How to find the name of layers in preloaded torchvision models?

我正在尝试将 GradCAM 与从 torchvision 预加载的 Deeplabv3 resnet50 模型一起使用,但在 Captum 中我需要说出层的名称(nn.module 类型)。我找不到有关如何完成此操作的任何文档,是否有人对如何获取最终 ReLu 层的名称有任何想法?

提前致谢!

您可以查看它的表示并通过简单地打印它来了解它的位置:

>>> model = torchvision.models.segmentation.deeplabv3_resnet50()
>>> model
DeepLabV3(
  (backbone): IntermediateLayerGetter(
    (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
    (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (relu): ReLU(inplace=True)
    (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    (layer1): Sequential(
      (0): Bottleneck(
        ...

要获得层的实际确切名称,您可以使用 named_modules 遍历模块并只选择 nn.ReLU 层:

>>> relus = [name for name, module in model.named_modules() if isinstance(module, nn.ReLU)]

>>> relus
['backbone.relu',
 'backbone.layer1.0.relu',
 'backbone.layer1.1.relu',
 'backbone.layer1.2.relu',
 'backbone.layer2.0.relu',
 'backbone.layer2.1.relu',
 'backbone.layer2.2.relu',
 'backbone.layer2.3.relu',
 'backbone.layer3.0.relu',
 'backbone.layer3.1.relu',
 'backbone.layer3.2.relu',
 'backbone.layer3.3.relu',
 'backbone.layer3.4.relu',
 'backbone.layer3.5.relu',
 'backbone.layer4.0.relu',
 'backbone.layer4.1.relu',
 'backbone.layer4.2.relu',
 'classifier.0.convs.0.2',
 'classifier.0.convs.1.2',
 'classifier.0.convs.2.2',
 'classifier.0.convs.3.2',
 'classifier.0.convs.4.3',
 'classifier.0.project.2',
 'classifier.3']

然后选择最后一个:

>>> relus[-1]
'classifier.3'