使用 pypi 预训练模型与 PyTorch
Using pypi pretrained models vs PyTorch
我有两个设置 - 一个大约需要。 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])
这都是从其他人的代码中复制和破解的,所以有些部分我不明白。但最令人困惑的是为什么一个会比另一个快得多。我想使用第二个选项,因为它对我来说更容易理解,而且我可以换掉预训练模型来测试不同的模型。
两种架构不同。我假设您使用的是 pretrained-models.pytorch.
请注意,您在第一个示例中使用了 SE-ResNeXt,在第二个示例中使用了 ResNeXt(来自 torchvision
的标准示例)。
第一个版本使用更快的块架构(Squeeze 和 Excitation),描述它的研究论文 here。
除了使用不同的构建块外,我不确定架构和实现之间的确切差异,但是
您可以 print
两个模型并检查差异。
最后 here 是一篇很好的文章,总结了 Squeeze And Excitation 是什么。基本上你在所有通道上做 GlobalAveragePooling
(我是 pytorch,之后是 torch.nn.AdaptiveAvgPoo2d(1)
和 flatten
),将它推过两个线性层(ReLU
激活 in-between ) 由 sigmoid
完成以获得每个通道的权重。最后你将通道乘以那些。
此外,您在将模块转换为 torch.nn.Sequential
时做了一些奇怪的事情。您通过复制模块删除的预训练网络的 forward
调用中可能存在一些逻辑,它也可能发挥作用。
我有两个设置 - 一个大约需要。 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])
这都是从其他人的代码中复制和破解的,所以有些部分我不明白。但最令人困惑的是为什么一个会比另一个快得多。我想使用第二个选项,因为它对我来说更容易理解,而且我可以换掉预训练模型来测试不同的模型。
两种架构不同。我假设您使用的是 pretrained-models.pytorch.
请注意,您在第一个示例中使用了 SE-ResNeXt,在第二个示例中使用了 ResNeXt(来自 torchvision
的标准示例)。
第一个版本使用更快的块架构(Squeeze 和 Excitation),描述它的研究论文 here。
除了使用不同的构建块外,我不确定架构和实现之间的确切差异,但是
您可以 print
两个模型并检查差异。
最后 here 是一篇很好的文章,总结了 Squeeze And Excitation 是什么。基本上你在所有通道上做 GlobalAveragePooling
(我是 pytorch,之后是 torch.nn.AdaptiveAvgPoo2d(1)
和 flatten
),将它推过两个线性层(ReLU
激活 in-between ) 由 sigmoid
完成以获得每个通道的权重。最后你将通道乘以那些。
此外,您在将模块转换为 torch.nn.Sequential
时做了一些奇怪的事情。您通过复制模块删除的预训练网络的 forward
调用中可能存在一些逻辑,它也可能发挥作用。