pytorch中的顺序容器——torch.nn.Sequential

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch中的顺序容器——torch.nn.Sequential相关的知识,希望对你有一定的参考价值。

参考技术A

pytorch官网对torch.nn.Sequential的描述如下。

使用方式:

方式一:
这是一个有顺序的容器,将特定神经网络模块按照在传入构造器的顺序依次被添加到计算图中执行。
方式二:
也可以将以特定神经网络模块为元素的有序字典(OrderedDict)为参数传入。
方式三:
也可以利用add_module函数将特定的神经网络模块插入到计算图中。add_module函数是神经网络模块的基础类(torch.nn.Module)中的方法,如下描述所示用于将子模块添加到现有模块中。

先看一下初始化函数 init ,在初始化函数中,首先是if条件判断,如果传入的参数为1个,并且类型为OrderedDict,通过字典索引的方式利用add_module函数将子模块添加到现有模块中,否则,通过for循环遍历参数,将所有的子模块添加到现有中。

由于每一个神经网络模块都继承于nn.Module,因此都会实现 __call__ 与 forward 函数,所以forward函数中通过for循环依次调用添加到现有模块中的子模块,最后输出经过所有神经网络层的结果。

参考文献:
https://blog.csdn.net/dss_dssssd/article/details/82980222

顺序模型中的pytorch跳过连接

【中文标题】顺序模型中的pytorch跳过连接【英文标题】:pytorch skip connection in a sequential model 【发布时间】:2019-01-17 06:49:29 【问题描述】:

我正试图围绕顺序模型中的跳过连接。使用函数式 API,我会做一些简单的事情(简单的例子,可能不是 100% 语法正确,但应该明白):

x1 = self.conv1(inp)
x = self.conv2(x)
x = self.conv3(x)
x = self.conv4(x)

x = self.deconv4(x)
x = self.deconv3(x)
x = self.deconv2(x)
x = torch.cat((x, x1), 1))
x = self.deconv1(x)

我现在使用顺序模型并尝试做类似的事情,创建一个跳过连接,将第一个 conv 层的激活一直带到最后一个 convTranspose。我查看了实现 here 的 U-net 架构,这有点令人困惑,它做了这样的事情:

upconv = nn.ConvTranspose2d(inner_nc * 2, outer_nc,
                                    kernel_size=4, stride=2,
                                    padding=1, bias=use_bias)
down = [downrelu, downconv, downnorm]
up = [uprelu, upconv, upnorm]

if use_dropout:
    model = down + [submodule] + up + [nn.Dropout(0.5)]
else:
    model = down + [submodule] + up

这不就是在顺序模型中添加层吗?有down conv,后跟submodule(递归添加内层),然后连接到up,这是upconv层。关于Sequential API 的工作原理,我可能遗漏了一些重要的信息,但是从 U-NET 截取的代码实际上是如何实现跳过的?

【问题讨论】:

【参考方案1】:

您的观察是正确的,但您可能错过了 UnetSkipConnectionBlock.forward() 的定义(UnetSkipConnectionBlock 是定义您共享的 U-Net 块的 Module),这可能会澄清此实现:

(来自pytorch-CycleGAN-and-pix2pix/models/networks.py#L259

# Defines the submodule with skip connection.
# X -------------------identity---------------------- X
#   |-- downsampling -- |submodule| -- upsampling --|
class UnetSkipConnectionBlock(nn.Module):

    # ...

    def forward(self, x):
        if self.outermost:
            return self.model(x)
        else:
            return torch.cat([x, self.model(x)], 1)

最后一行是键(适用于所有内部块)。跳过层只需将输入x 和(递归)块输出self.model(x) 与您提到的操作列表self.model 连接起来即可完成——因此与您编写的Functional 代码没有太大区别。

【讨论】:

以上是关于pytorch中的顺序容器——torch.nn.Sequential的主要内容,如果未能解决你的问题,请参考以下文章

一维中的 PyTorch 圆形填充

Pytorch神经网络序列化容器

pytorch torch.nn.Sequential(* args)(嘎哈用的?构建神经网络用的?)

pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型

pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型

docker容器内运行pytorch多gpu报错 RuntimeError: NCCL Error 2: unhandled system error