对pytorch网络层结构的数组化详解

作者:库页 时间:2023-09-02 12:10:09 

最近再写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(),其实完全使用普通列表保存变量就好了,高兴就好。

来源:https://blog.csdn.net/daniaokuye/article/details/78827436

标签:pytorch,网络层,结构,数组化
0
投稿

猜你喜欢

  • Python3操作MongoDB增册改查等方法详解

    2021-09-20 05:13:49
  • 如何将yolov5中的PANet层改为BiFPN详析

    2023-08-12 18:08:38
  • Python中的tuple元组详细介绍

    2023-03-02 03:54:47
  • 详解Go语言中用 os/exec 执行命令的五种方法

    2024-05-28 15:21:51
  • 聊聊golang中多个defer的执行顺序

    2023-09-03 09:23:22
  • 利用PyQt5生成过年春联

    2023-05-23 21:14:22
  • MAC版修改MySQL初始密码的方法

    2024-01-19 03:19:56
  • Mysql数据库常用命令

    2009-03-06 14:29:00
  • python openvc 裁剪、剪切图片 提取图片的行和列

    2022-07-03 15:29:40
  • Python中itertools的用法详解

    2022-06-05 13:34:52
  • python实现双色球随机选号

    2021-06-26 05:11:09
  • Python字典“键”和“值”的排序5种方法

    2022-01-13 04:45:42
  • 如何设计广告的用户体验?

    2007-12-20 13:12:00
  • Python的Django框架中的Context使用

    2023-09-19 15:29:24
  • 使用python实现学生信息管理系统

    2022-11-24 21:28:35
  • 2007/12/23更新创意无限,简单实用(javascript log)

    2024-04-26 17:11:46
  • web服务器程序运行出现乱码问题的解决方法

    2023-02-26 14:46:48
  • 使用Python多线程爬虫爬取电影天堂资源

    2022-12-06 11:56:27
  • Python中的pygal安装和绘制直方图代码分享

    2021-11-18 15:09:50
  • 一文弄懂MySQL索引创建原则

    2024-01-14 07:38:25
  • asp之家 网络编程 m.aspxhome.com