Использование предварительно обученных моделей pypi против PyTorch

У меня есть две установки - одна занимает ок. 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])

Все это скопировано и взломано из кода других людей, поэтому есть части, которые я не понимаю. Но больше всего сбивает с толку то, почему один может быть намного быстрее другого. Я хотел бы использовать второй вариант, потому что мне его легче понять, и я могу просто поменять предварительно обученную модель, чтобы протестировать другие.


person ashley    schedule 10.07.2019    source источник
comment
cnn_leaner и Learner — это подпрограммы fastai — docs.fast.ai/vision.learner.html все, что приходит после этого, чтобы тренироваться, это learn.fit_one_cycle(4)   -  person ashley    schedule 10.07.2019
comment
Что это за pretrainedmodels модуль? Я полагаю, что модели отличаются друг от друга. Что произойдет, если вы подключите одну и ту же модель в обоих примерах (скажем, из torchvision)   -  person Szymon Maszke    schedule 10.07.2019
comment
Это должно быть одно и то же: pypi.org/project/pretrainedmodels и pytorch.org/docs/stable/torchvision/models.html   -  person ashley    schedule 10.07.2019


Ответы (1)


Обе архитектуры разные. Я предполагаю, что вы используете pretrained-models.pytorch .

Обратите внимание, что вы используете SE-ResNeXt в первом примере и ResNeXt во втором (стандартный из torchvision).

Первая версия использует более быструю блочную архитектуру (сжатие и возбуждение), исследовательский документ с ее описанием >здесь.

Я не уверен в точных различиях между обеими архитектурами и реализациями, за исключением разных используемых строительных блоков, но вы можете print обе модели и проверить различия.

Наконец, вот хорошая статья, обобщающая, что такое сжатие и возбуждение есть. В основном вы выполняете GlobalAveragePooling на всех каналах (им pytorch это будет torch.nn.AdaptiveAvgPoo2d(1) и flatten впоследствии), проталкиваете его через два линейных слоя (с промежуточной активацией ReLU), заканчивая sigmoid, чтобы получить веса для каждого канала. Наконец, вы умножаете каналы на тех.

Кроме того, вы делаете что-то странное с модулями, преобразующими их в torch.nn.Sequential. В forward вызове предварительно обученной сети, которую вы удаляете путем копирования модулей, может быть какая-то логика, она тоже может играть роль.

person Szymon Maszke    schedule 10.07.2019