В следующих абзацах я объясню, почему вам следует подумать об использовании предварительно обученных моделей, а не создавать их с нуля.

Чтобы эффективно изучить этот курс, вы должны знать, что такое нейронные сети, как они работают и как их обучать. Если вы рассмотрели все, начиная с уроков 1 и 3 из Введение в PyTorch от Udacity, то вы должны быть в хорошей позиции для того, что будет дальше. Вы можете заполнить пробелы, которые могут возникнуть у вас из Урока 4.

Если вы еще не прошли курс, вы все равно можете пройти его, если у вас есть некоторые знания о нейронных сетях и минимальный опыт их реализации в вашей любимой библиотеке (желательно PyTorch: P)

Что касается рабочей среды, я предпочитаю использовать Jupyter, такие как Kaggle Kernel или даже Google Colab, поэтому вам не нужно ничего устанавливать на вашем компьютере, кроме браузера, если вы хотите что-то протестировать.

Что вы имеете в виду под предварительно обученными моделями?

Предварительно обученная модель представляет собой модель, которая была обучена для определенной задачи на наборе данных ImageNet. В случае PyTorch существует несколько очень популярных архитектур моделей, которые доступны для загрузки в ваш ноутбук, например, VGG, ResNet, DenseNet, Inception и другие. С остальной частью списка вы можете ознакомиться здесь. Это называется трансферным обучением. Звучит знакомо? Конечно, если вы помните, мы впервые увидели это в Уроке 4, особенно в тетрадке 7 и 8. [1]

Ниже показано, как импортировать предварительно обученную модель [2].

import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)
squeezenet = models.squeezenet1_0(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
densenet = models.densenet161(pretrained=True)
inception = models.inception_v3(pretrained=True)

Что такое трансферное обучение?

Весь этот процесс называется переносом обучения, и на самом деле это немного больше, чем просто импорт модели в вашу рабочую среду. Одно из лучших резюме, которое я смог найти о том, почему вам следует использовать трансферное обучение, взято из очень популярного ресурса, курса CS231n Стэнфордского университета:

«На практике очень немногие люди обучают всю сверточную сеть с нуля (со случайной инициализацией), потому что относительно редко можно получить набор данных достаточного размера. Вместо этого обычно предварительно обучают ConvNet на очень большом наборе данных (например, ImageNet, который содержит 1,2 миллиона изображений с 1000 категориями), а затем используют ConvNet либо как инициализацию, либо как средство извлечения фиксированных функций для интересующей задачи ». - [3]

Несколько лет назад утверждалось, что трансферное обучение - это лучший способ развития отрасли, и это до сих пор является обоснованным заявлением. [4] [5]

Почему мне следует использовать предварительно обученную модель?

Если это вас еще не убедило, я приведу еще несколько причин в поддержку своего утверждения.

  • Проблема с тем, чтобы не использовать его, заключается в том, что вы - в зависимости от того, какой у вас опыт - потратите серьезное количество времени на обучение своей модели с нуля. Вам придется проделать множество вычислений и экспериментов, чтобы построить правильную архитектуру CNN. Подумайте, сколько вопросов дизайна вам нужно будет решить: сколько слоев мне нужно? А как насчет объединения? Могу ли я складывать стопки? Более того, также будет иметь значение сложность набора данных.
  • У вас может не быть достаточно большого набора данных, чтобы ваша модель могла быть достаточно хорошо обобщена, и у вас также может не быть вычислительных ресурсов для этого.
  • Имейте в виду, что ImageNet имеет 1000 классов, поэтому предварительно обученные модели были обучены работать с множеством разных вещей.
  • Тяжелая работа по оптимизации параметров уже проделана за вас, теперь вам нужно точно настроить модель, поиграв с гиперпараметрами, так что в этом смысле предварительно обученная модель является спасатель.

Теперь о точной настройке модели можно подробно рассказать в другой статье, и я не буду вдаваться в подробности здесь. Тем не менее, я могу окончательно посоветовать вам, где почитать о тонкой настройке. Для начала я бы порекомендовал: Учебник PyTorch, мой репозиторий в курсе и другой ресурс, но для Keras (все еще полезно для идей).

Всегда ли предварительно обученная модель подходит под мою задачу?

Это зависит от …

  • Если вы занимаетесь исследованием построения другой модели, вы, вероятно, не читали бы это;)
  • Если вы делаете это в экспериментальных целях, вам может быть интересно загрузить архитектуру со случайно инициализированными параметрами, поэтому нет.
  • Если вы столкнулись с проблемой, когда ваш набор данных сильно отличается от ImageNet, и вы уже пытались переобучить предварительно обученную модель, тогда, конечно, нет.
  • Если вам интересно узнать, как работают CNN, вам следует сосредоточить свои усилия на создании с нуля.

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

Как мне решить, какую предварительно обученную архитектуру модели использовать?

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

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

В зависимости от того, какую архитектуру модели я считаю наиболее полезной, я стараюсь внимательно читать, какие тесты они достигли в ходе экспериментов. PyTorch и другие фреймворки предоставляют первую и пятерку ошибок в ImageNet для своих предварительно обученных моделей, так что, по сути, это также может быть хорошей отправной точкой. [1] [7]

И, наконец, то, что я вам представил, - это лишь небольшая часть трансферного обучения, и она почти не затрагивает поверхность. С этого момента я могу порекомендовать вам посетить CS231n, Блог Себастьяна Рудера и Модельный зоопарк, чтобы узнать больше.

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

Ресурсы, которые я использовал:

  1. Репозиторий Udacity Deep Learning: https://github.com/udacity/deep-learning-v2-pytorch/blob/master/intro-to-pytorch/Part%208%20-%20Transfer%20Learning%20(Exercises). ipynb
  2. Документация по моделям PyTorch: https://pytorch.org/docs/stable/torchvision/models.html
  3. TransferLearning: http://cs231n.github.io/transfer-learning/#tf
  4. Блог Себастьяна Рудера: http://ruder.io/transfer-learning/index.html#whytransferlearningnow
  5. CNN: http://cs231n.github.io/convolutional-networks/
  6. Шпаргалка по глубокому обучению: https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-deep-learning-tips-and-tricks#parameter-tuning
  7. Тесты архитектуры модели: https://github.com/jcjohnson/cnn-benchmarks