pytorch网络层结构的数组化

最近再写openpose,它的网络结构是多阶段的网络,所以写网络的时候很想用列表的方式,但是直接使用列表不能将网络中相应的部分放入到cuda中去。
其实这个问题很简单的,使用moduleList就好了。
1 我先是定义了一个函数,用来根据超参数,建立一个基础网络结构

stage = [[3, 3, 3, 1, 1], [7, 7, 7, 7, 7, 1, 1]]
branches_cfg = [[[128, 128, 128, 512, 38], [128, 128, 128, 512, 19]],
                [[128, 128, 128, 128, 128, 128, 38], [128, 128, 128, 128, 128, 128, 19]]]

# used for add two branches as well as adapt to certain stage
def add_extra(i, branches_cfg, stage):
    """
    only add CNN of brancdes S & L in stage Ti  at the end of net
    :param in_channels:the input channels & out
    :param stage: size of filter
    :param branches_cfg: channels of image
    :return:list of layers
    """
    in_channels = i
    layers = []
    for k in range(len(stage)):
        padding = stage[k] // 2
        conv2d = nn.Conv2d(in_channels, branches_cfg[k], kernel_size=stage[k], padding=padding)
        layers += [conv2d, nn.ReLU(inplace=True)]
        in_channels = branches_cfg[k]
    return layers

2 然后用普通列表装载他们

conf_bra_list = []
paf_bra_list = []

# param for branch network
in_channels = 128

for i in range(all_stage):
   if i > 0:
       branches = branches_cfg[1]
       conv_sz = stage[1]
   else:
       branches = branches_cfg[0]
       conv_sz = stage[0]

   conf_bra_list.append(nn.Sequential(*add_extra(in_channels, branches[0], conv_sz)))
   paf_bra_list.append(nn.Sequential(*add_extra(in_channels, branches[1], conv_sz)))
   in_channels = 185

3 再然后,使用moduleList方法,把普通列表专成pytorch下的模块

# to list
self.conf_bra = nn.ModuleList(conf_bra_list)
self.paf_bra = nn.ModuleList(paf_bra_list)

4 最后,调用就好了

out_0 = x
# the base transform
for k in range(len(self.vgg)):
    out_0 = self.vgg[k](out_0)

# local name space
name = locals()
confs = []
pafs = []
outs = []

length = len(self.conf_bra)
for i in range(length):
    name['conf_%s' % (i + 1)] = self.conf_bra[i](name['out_%s' % i])
    name['paf_%s' % (i + 1)] = self.paf_bra[i](name['out_%s' % i])
    name['out_%s' % (i + 1)] = torch.cat([name['conf_%s' % (i + 1)], name['paf_%s' % (i + 1)], out_0], 1)
    confs.append('conf_%s' % (i + 1))
    pafs.append('paf_%s' % (i + 1))
    outs.append('out_%s' % (i + 1))

5 顺便装了一下,使用了python局部变量命名空间,name = locals(),其实完全使用普通列表保存变量就好了,高兴就好。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值