【问题标题】:Using pypi pretrained models vs PyTorch使用 pypi 预训练模型与 PyTorch
【发布时间】:2019-07-10 18:38:14
【问题描述】:

我有两个设置 - 一个需要大约。 10分钟跑另一个还在跑一个小时后:

10 米:

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])

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

【问题讨论】:

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


【解决方案1】:

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

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

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

除了使用的构建块不同外,我不确定架构和实现之间的确切差异,但是 你可以print 两个模型并检查差异。

最后here 是一篇很好的文章,总结了Squeeze And Excitation 是什么。基本上你在所有通道上都做GlobalAveragePooling(我是pytorch,之后是torch.nn.AdaptiveAvgPoo2d(1)flatten),将它推过两个由sigmoid完成的线性层(中间有ReLU激活)以获得每个通道的权重。最后,您将通道乘以这些。

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

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 2018-02-20
    • 2021-11-18
    • 2021-04-05
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2020-02-07
    相关资源
    最近更新 更多