Skip to content

Question regarding InvertedResidual block implementation #31

Open
@AndyAtCMU

Description

@AndyAtCMU

感谢fire717老师分享的代码实现和解析文章。我拜读之后感到受益匪浅。

这边对于mobilenet_v2的代码实现有一点细节方面的问题,不知道老师您能否为我解惑?
这是本repo对于InvertedResidual模块的实现

def forward(self, x):
    x = self.conv1(x)
    for _ in range(self.n):
         x = x + self.conv2(x)
    return x

以下是参考torchvision中的mobilenet_v2实现中对应的部分:

# building inverted residual blocks
for t, c, n, s in inverted_residual_setting:
    output_channel = _make_divisible(c * width_mult, round_nearest)
    for i in range(n):
        stride = s if i == 0 else 1
        features.append(block(input_channel, output_channel, stride, expand_ratio=t, norm_layer=norm_layer))
        input_channel = output_channel

我目前理解的两者之间的区别是,本实现版本中的conv2部分是网络结构相同且共用相同权重的InvertedResidual block,输入通过conv1后将通过(n-1)个权重相同的模块。而在torchvision的实现版本中,因为block会调用InvertedResidua的constructor,生成的是网络结构相同但不共用权重的InvertedResidualBlock。不知道我这样的理解是否正确?想请教一下原版本movenet的实现也采用了类似的设计吗?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions