Python val() 通过字符串对应至同名变量

eval()函数可以方便的在python中,通过字符串访问变量名。方便代码中提取特定的一系列变量名相近的变量。

在写Pytorch的一套代码(GPS DlinkNet_fusion),想要提取ResNet中的layer1、layer2、layer3、layer4. 一句一句的写代码太多,又不太雅观。这时候可以用val() 通过字符串对应至同名变量。

简单例子,提取resnet.layer1,resnet.layer2,…

resnet = models.resnet34(pretrained=True)
blocks = []
for i in range(1,5):
    blocks.append(eval('resnet.layer'+str(i)))

包括类变量也可以"self.xxx"这样访问到

eval('self.conv'+str(1))  # self.conv1

VQA MCAN code,看到了一种更优雅的写法。getattr()可以利用字符串获取对应名字属性。下面代码也是resnet的CNN部分,提取image feature

def build_model(args):
    cnn = getattr(torchvision.models, args.model)(pretrained=True)
    layers = [cnn.conv1, 
              cnn.bn1,
              cnn.relu,
              cnn.maxpool]
    for i in range(args.model_stage):
        name = 'layer%d' % (i + 1)
        layers.append(getattr(cnn, name))
    model = torch.nn.Sequential(*layers)
    model.cuda()
    model.eval()
    return model
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值