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