【问题标题】:Question about understanding of Pytorch .named_modules() loops关于理解 Pytorch .named_modules() 循环的问题
【发布时间】:2021-08-04 18:51:22
【问题描述】:

我在这里指的是这个实现:

https://github.com/hszhao/semseg/blob/master/model/pspnet.py

在第 49-58 行,作者写道:

for n, m in self.layer3.named_modules():
    if 'conv2' in n:
        m.dilation, m.padding, m.stride = (2, 2), (2, 2), (1, 1)
    elif 'downsample.0' in n:
        m.stride = (1, 1)

for n, m in self.layer4.named_modules():
    if 'conv2' in n:
        m.dilation, m.padding, m.stride = (4, 4), (4, 4), (1, 1)
    elif 'downsample.0' in n:
        m.stride = (1, 1)

这些循环到底发生了什么?

我的理解是,作者正在创建一个 resnet 模型(他的 resnet.py 这里是 https://github.com/hszhao/semseg/blob/master/model/resnet.py),然后调用不同的层,他在他的 resnet 类中实现了这些层以将它们转发到下面。

resnet.py 中的 layer3 和 layer4 是通过调用函数 def _make_layer(self, block, planes, blocks, stride=1): 生成的,所以我假设在循环中使用 .named_modules() 时,它正在循环通过这个 def _make_layer 函数中的模块,是吗?如果是这样,elif 部分会发生什么?没有模块,称为 downsample.0 ? (唯一的模块是 nn.Conv2d 和 nn.BatchNorm2d)

【问题讨论】:

    标签: python python-3.x pytorch resnet


    【解决方案1】:

    下面是在那里使用的 resnet 示例。

    model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
    

    在 Resnet 类中,它因此调用 super,它有 self.downsample 如果不是 none:

    if self.downsample is not None:
            residual = self.downsample(x)
    

    它可以有顺序层或其他层。

    class Bottleneck(nn.Module):
        expansion = 4
    
        def __init__(self, inplanes, planes, stride=1, downsample=None):
            super(Bottleneck, self).__init__()
            self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
            self.bn1 = nn.BatchNorm2d(planes)
            self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
                                   padding=1, bias=False)
            self.bn2 = nn.BatchNorm2d(planes)
            self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False)
            self.bn3 = nn.BatchNorm2d(planes * self.expansion)
            self.relu = nn.ReLU(inplace=True)
            self.downsample = downsample
            self.stride = stride
    

    【讨论】:

    • 您能否详细说明循环本身?或者我没有理解你的意思,但我不明白你的意思。
    • named_modules 返回网络中的所有模块,根据pytorch.org/docs/stable/_modules/torch/nn/modules/… 生成模块名称和模块本身。所以“conv2”和“batchform”就像你说的那样存在,但即使不存在也可以定义下采样。它来自超类。
    • 好的,我明白了。但后来我不明白,下采样到底是做什么的。为什么将“步幅”作为参数?在整个网络中,输入似乎发生的所有事情都是residual = self.downsample(x)。它有什么作用?
    • 我没有完全理解作者的观点,但可能目标是当 value 是其他东西时将 stride 设置为 1。 m.stride = (1, 1) 设置潜在模块的步幅。您可以搜索其他 resnet 实现。
    • 如果打算将步幅设置为 1,那在 if 部分不是已经完成了吗?我见过其他实现,但它们并不能真正帮助我准确理解这部分。
    猜你喜欢
    • 2020-07-10
    • 2014-05-21
    • 1970-01-01
    • 2022-01-10
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多