使用pypi预训练模型与PyTorch

时间:2019-07-10 18:38:14

标签: python pytorch pre-trained-model fast-ai

我有两种不同的设置-一种大约需要运行10分钟,另一个运行一个小时后仍在运行:

10 m:

import pretrainedmodels 

def resnext50_32x4d(pretrained=False):
    pretrained = 'imagenet' if pretrained else None
    model = pretrainedmodels.se_resnext50_32x4d(pretrained=pretrained)
    return nn.Sequential(*list(model.children()))

learn = cnn_learner(data, resnext50_32x4d, pretrained=True, cut=-2, split_on=lambda m: (m[0][3], m[1]),metrics=[accuracy, error_rate])

未完成:

import torchvision.models as models

def get_model(pretrained=True, model_name = 'resnext50_32x4d', **kwargs ):
    arch = models.resnext50_32x4d(pretrained, **kwargs )
    return arch

learn = Learner(data, get_model(), metrics=[accuracy, error_rate])

所有内容都是从其他人的代码复制并入侵的,所以有些部分我不理解。但是最令人困惑的是为什么一个会比另一个快得多。我想使用第二个选项,因为它对我来说更容易理解,我可以换掉预训练的模型来测试不同的模型。

1 个答案:

答案 0 :(得分:1)

两种架构都不同。我假设您正在使用pretrained-models.pytorch

请注意,您在第一个示例中使用的是 SE -ResNeXt,在第二个示例中使用的是ResNeXt(来自torchvision的标准示例)。

第一个版本使用更快的块架构(挤压和激励),研究论文对此进行了描述here

除了使用不同的构建块外,我不确定体系结构和实现之间的确切区别,但是 您可以print两种模型并检查差异。

最后here是一篇不错的文章,总结了挤压和激发是什么。基本上,您会在所有通道上执行GlobalAveragePooling(在pytorch之后将是torch.nn.AdaptiveAvgPoo2d(1)flatten),将其推过两个线性层(中间激活ReLU)用sigmoid来获得每个通道的权重。最后,您将通道乘以那些。

此外,您正在对将模块转换为torch.nn.Sequential的模块做一些奇怪的事情。 forward调用通过复制模块删除的预训练网络可能有些逻辑,它也可能起作用。