Python2.7下PyTorch传递模块列表出现语法错误的解决方法
Python 2.7中
nn.Sequential多列表解包的语法错误修复 这个问题我太熟悉了——你碰到的是Python版本之间的语法兼容坑!Python 2.7不支持在函数调用里连续使用多个*对可迭代对象进行解包,这个特性是Python 3.5及以后版本才新增的,所以你写的nn.Sequential(*list1, *list2)在Python2里直接触发语法错误。
给你两种在Python2.7下能正常运行的解决办法:
方法1:先合并列表,再一次性解包
最直观的方式是把两个模块列表先合并成一个大列表,再传入nn.Sequential:
# 合并两个模块生成函数返回的列表 down1_layers = make_conv_bn_relu(in_channels, 16, kernel_size=3, stride=1, padding=1) + \ make_conv_bn_relu(16, 32, kernel_size=3, stride=2, padding=1) # 解包合并后的列表传入Sequential self.down1 = nn.Sequential(*down1_layers)
方法2:用itertools.chain链式合并(无额外列表变量)
如果不想多定义一个变量,可以用itertools.chain把多个列表链接成一个迭代器,再解包传入:
from itertools import chain self.down1 = nn.Sequential(*chain( make_conv_bn_relu(in_channels, 16, kernel_size=3, stride=1, padding=1), make_conv_bn_relu(16, 32, kernel_size=3, stride=2, padding=1) ))
两种方法都能实现你想要的把多组Conv-BN-ReLU模块串进nn.Sequential的效果,完美适配Python2.7的语法限制。
内容的提问来源于stack exchange,提问作者Avijit Dasgupta
相关产品推荐
相关产品推荐

