Рубрики
Без рубрики

KERAS VS PYTORCH: Как отличить инопланетян против хищников с учетом передачи

Автор оригинала: FreeCodeCapm Team.

Пацирк Мидюла

Эта статья была написана Piotr Migdał , Rafał Jakubanis и я. В предыдущем посте они дали вам Обзор различий между Керами и Питорчом Направляясь помочь вам выбрать рамки, которая лучше подходит для ваших потребностей.

Теперь пришло время для суда по бою.

Мы собираемся к ямы керасу и питорше друг против друга, показывая свои сильные и слабые стороны в действии. Мы представляем настоящую проблему, вопрос жизни и смерти: отличительные иностранцы от хищников!

Мы выполним классификацию изображений, одно из задач компьютерных зрителей глубоко обучают. По мере того как тренировка с нуля невозможно в большинстве случаев (так как он очень голоден), мы будем выполнять передачу обучения с использованием Resnet-50, предварительно обученные на ImageNet. Мы получим максимально практичным, чтобы показать как концептуальные различия, так и конвенции.

В то же время мы будем держать код довольно минимально, чтобы сделать его понятно и легко читать и повторно использовать. Посмотреть Ноутбуки на Github , Kaggle ядра или Версии Нептуна с модными графиками Отказ

Подождите, что такое передача обучения? И почему Resnet-50?

Передача обучения Это процесс изготовления крошечных корректировок к сети, обученной данной задаче для выполнения другой, аналогичной задачи.

В нашем случае мы работаем с моделью Resnet-50, обученной, чтобы классифицировать изображения из ImageNet набор данных. Достаточно Узнайте много текстур и узоров Это может быть полезно в других визуальных задачах, даже когда иностранец, как этот случай инопланетян против хищника. Таким образом, мы будем использовать гораздо меньше вычислительной мощности для достижения гораздо лучших результатов.

В нашем случае мы собираемся сделать это самым простым способом:

  • Держите предварительно обученные сверточные слои (так называемые функции экстрактора), с их весами заморожены, а также
  • Удалите оригинальные густые слои и замените их новыми плотными слоями, которые мы будем использовать для обучения.

Итак, какая сеть мы должны выбрать как функциональный экстрактор?

Resnet-50 Это популярная модель для классификации изображений ImageNet (Alexnet, VGG, Googlenet, Preception, Xception – другие популярные модели). Это 50-слойный архитектура глубокой нейронной сети на основе Остаточные соединения , которые являются соединениями, которые добавляют модификации с каждым слоем, а не полностью изменяют сигнал.

Resnet был современным на ImageNet в 2015 году. С тех пор Новые архитектуры с более высокими оценками на ImageNet были изобретены. Тем не менее, они не обязательно лучше обобщать для других наборов данных (см. Улучшенные модели ImageNet Models лучше? Арксивская бумага).

Хорошо, пришло время погрузиться в код.

Пусть матч начался!

Мы создадим наш Alien Vs. Prestator Challenge за семь шагов:

0. Подготовьте набор данных 1. Импортные зависимости 2. Создание генераторов данных 3. Создайте сеть 4. Поезд модели 5. Сохранить и загрузите модель 6. Сделайте прогнозы на образце тестирования

Мы дополняем этот пост блога с помощью кода Python в ноутбуках Jupyter ( Keras-Resnet50.ipynb , Pytorch-Resnet50.ipynb ). Эта среда удобнее для прототипов, чем простые скрипты, так как мы можем выполнить IT-яческую ячейку и пик в вывод.

Хорошо, пойдем!

0. Подготовьте набор данных

Мы создали набор данных, выполнив поиск Google со словами «Alien» и «хищник». Мы сохранили jpg миниатюры (около 250 × 250 пикселей) и вручную отфильтровывали результаты. Вот некоторые примеры:

Мы разделим наши данные на две части:

  • Данные тренировки (347 образцов на класс) – используется для обучения сети.
  • Данные проверки (100 образцов на класс) – не используется во время тренировки, но не требуется для проверки производительности модели на ранее невидимые данные.

KERA требует, чтобы данные были организованы в папках следующим образом:

Если вы хотите увидеть процесс организации данных в каталоги, посмотрите файл data_prep.ipynb. Вы можете скачать набор данных из Kaggle Отказ

1. Импорт зависимостей

Во-первых, технические данные. Мы предполагаем, что у вас есть Python 3.5+, KERAS 2.2.2 (с Tensorflow 1.10.1 Backend) и Pytorch 0.4.1. Проверьте требования .txt Файл в репо.

Итак, во-первых, нам нужно импортировать необходимые модули. Мы отделим код в Keras, Pytorch и Common (один требуется в обоих).

Мы можем проверить версии Frameworks, набрав keras .__ version__ и Факел .__ Версия __ , соответственно.

2. Создание генераторов данных

Обычно изображения не могут быть загружены сразу, так как это было бы слишком много для памяти для обработки. В то же время мы хотим воспользоваться повышением производительности ГПУ, сразу обрабатывая несколько изображений. Итак, мы загружаем изображения в партии (например, 32 изображения сразу) с использованием генераторов данных. Каждый проход через весь набор данных называется эпоха Отказ

Мы также используем генераторы данных для предварительной обработки: мы изменяем размер и нормализуем изображения, чтобы сделать их в виде Resnet-50 (224 x 224 px, с масштабированными цветными каналами). И последнее, но не менее важное, мы используем генераторы данных для случайного возмущения изображений на лету:

Выполнение таких изменений называется Увеличение данных Отказ Мы будем использовать его, чтобы показать нейронную сеть, какие виды преобразований не имеют значения. Или, чтобы поставить его другим способом, мы наведем потенциально бесконечный набор данных, создавая новые изображения на основе исходного набора данных.

Почти все визуальные задачи выгоду, чтобы различные степени, от увеличения данных для обучения. Для получения дополнительной информации о расширении данных см. Применительно к планктоне фотографии или Как использовать его в KERAS Отказ В нашем случае мы случайным образом сдвигаем, Zoom и горизонтально переворачивают наши инопланетяне и хищники.

Здесь мы создаем генераторы, которые:

  • Загрузить данные из папок,
  • нормализовать данные (как тренировку, так и проверка), и
  • Данные в расширении (только поезд).

В Кере вы получите встроенные увеличения и PrevoCessess_input Метод Normization изображений помещает в Resnet-50, но у вас нет контроля над их заказом. В Pyyorch вы должны нормализовать изображения вручную, но вы можете организовать увеличение по любым способам.

Есть также другие нюансы: Например, KERAS по умолчанию заполняет остальную часть дополненного изображения с пограничными пикселями (как вы можете видеть на рисунке выше), тогда как Pytorch покидает его черным. Всякий раз, когда одна структура справится с вашей задачей намного лучше, чем другая, посмотрите, чтобы увидеть, выполняют ли они предварительно обработкой тождественными; Мы ставим, они не.

3. Создайте сеть

Следующим шагом является импортирование предварительно обученной модели Resnet-50, которая является ветером в обоих случаях. Мы заморозим все сверточные слои Resnet-50 и тренируем только два последних полностью подключенных (плотных) слоев. Поскольку наша задача классификации имеет только 2 класса (по сравнению с 1000 классами ImageNet), нам нужно настроить последний слой.

Мы тут:

  • Загрузите предварительно обученную сеть, отрежьте голову и замораживаем его веса,
  • Добавьте пользовательские плотные слои (выбираем 128 нейронов для скрытого слоя), а также
  • Установите функцию оптимизатора и потери.

Мы загружаем Resnet-50 с Keras и Pytorch без каких-либо усилий. Они также предлагают много других известных предварительно обученных архитектур: см. Keras ‘Model Zoo и Модель Pytorch Zoo Отказ Итак, каковы различия?

В KERAS мы можем импортировать только объектные слои, не загружая посторонние данные ( include_top = false ). Затем мы создаем модель функционально, используя входы и выходы базовой модели. Тогда мы используем model.compile (...) Выпекать в нее функцию потери, оптимизатор и другие метрики.

В Pytorch модель является объектом Python. В случае models.resnet50 плотные слои хранятся в model.fc атрибут. Мы перезаписываем их. Функция и оптимизаторы потери являются отдельными объектами. Для оптимизатора нам нужно явно пройти список параметров, которые мы хотим обновить.

В Pyyorch мы должны четко указать, что мы хотим загрузить в GPU, используя .to (устройство) метод. Мы должны написать это каждый раз, когда мы намерены поставить объект на GPU, если это доступно. Хорошо…

Слой замораживания работает аналогично. Однако в Пакетный нормализационный слой кера разбит (как в текущей версии; thx przemysław

Керас и Питорч разбираются с потерей журнала по-другому.

В KERAS сеть прогнозирует вероятности (имеет встроенный функция Softmax ), а встроенные функции стоимости предполагают, что они работают с вероятностями.

В Pytorch у нас больше свободы, но предпочтительный способ – вернуть логиты. Это сделано для численных причин, выполнение Softmax, то потери журнала означает ненужную log (exp (x)) Операции. Итак, вместо использования Softmax, мы используем LogsoftmaxNLLLOSS ) ИЛИ комбинируйте их в один Nn.crossentropyloss Функция потери.

4. Поезд модели

Хорошо, Resnet загружен, так что давайте будем готовы к пространству грохота!

Теперь мы перейдем к самому важному шагу – модель обучения. Нам нужно передавать данные, рассчитать функцию потери и изменять весы сети соответственно. Хотя у нас уже были некоторые различия между KERAS и PYTORCH в увеличении данных, длина кода была похоже. Для обучения … Разница массивная. Посмотрим, как это работает!

Мы тут:

  • тренировать модель и
  • Измерьте функцию потери (потери журнала) и точность как наборов обучения, так и для валидации.

В Кере, model.fit_generator Выполняет тренинг … И это все! Обучение в Кере это просто удобно. И, как вы можете найти в ноутбуке, KERAS также дает нам бар прогресс и функцию времени на свободу. Но если вы хотите сделать что-нибудь нестандартное, то боль начинается …

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

Давайте переключаем шестерни и разделите тренировочный код Pytorch. У нас были вложенные петли, итерации по поводу:

  • эпохи,
  • Этапы обучения и валидации, а также
  • Паташки.

Корпус эпохи ничего не делает, кроме как повторять код внутри. Этапы обучения и валидации сделаны по трем причинам:

  • Некоторые специальные слои, как Пакетная нормализация (настоящее в Resnet-50) и Открытие (отсутствует в Resnet-50), работайте по-разному во время обучения и валидации. Мы устанавливаем свое поведение по model.train () и Model.eval () , соответственно.
  • Мы используем разные изображения для обучения и для проверки, конечно.
  • Самое главное и наименее удивительное: мы тренируем сеть во время тренировок. Волшебные команды Optimizer.ZERO_GRAD () , потеря. Backward () и Optimizer.step () (В этом порядке) выполнить работу. Если вы знаете, что обратная обработка Вы цените их элегантность.

Затем мы позаботимся о вычислении потери эпохи и печатаем себя.

5. Сохранить и загрузить модель

Экономия

После того, как наша сеть обучена, часто с высокими вычислениями и затратами на рассрочку, приятно держать его на потом. В целом, есть два типа сбережений:

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

Это зависит от вас, какой вы выбираете.

Мы тут:

  • Сохранить модель.

Одной строки кода достаточно в обоих каркасах. В Кере вы можете либо сохранить все для HDF5 Файл или сохранить вес HDF5 и архитектуре для читаемого файла JSON. Кстати: Затем вы можете загрузить модель и запустить его в браузере Отказ

В настоящее время Pytorch Creators Рекомендую сохранить только вес Отказ Они препятствуют сохранению всей модели, потому что API все еще развивается.

Загрузка

Модели загрузки так же просто, как сохранение. Вы должны просто помнить, какой метод сохранения вы выбрали и файловые пути.

Мы тут:

  • загрузить модель.

В KERAS мы можем загрузить модель из файла JSON, а не создавать его в Python (по крайней мере, когда мы не используем пользовательские слои). Этот вид сериализации позволяет удобно для передачи моделей.

Pytorch может использовать любой код Python. Так что в значительной степени мы должны повторно создать модель в Python.

Весы моделей загрузки аналогичны как в обоих каркасах.

6. Сделайте прогнозы на образце тестируемых изображений

Хорошо, наконец, это наконец-то время сделать некоторые прогнозы! Для справедливо проверяйте качество нашего решения, мы попросим модель предсказать тип монстров из изображений, не используемых для обучения. Мы можем использовать набор валидации или любое другое изображение.

Мы тут:

  • Тестовые изображения нагрузки и предварительной обработки,
  • предсказать категории изображений и
  • Показать изображения и прогнозы.

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

В KERAS и PYTORCH нам нужно загрузить и предварительно обработать данные. Ошибка новинок – забыть о стадии предварительной обработки (включая масштабирование цвета). Вероятно, он будет работать, но приведет к худшим прогнозам (поскольку это эффективно видит одинаковые формы, но с разными цветами и контрастами).

В Pyyorch есть еще два шага, как нам нужно:

  • преобразовывать логиты к вероятностям, а также
  • Передача данных в ЦП и преобразовывать в Numpy (к счастью, сообщения об ошибках довольно четко, когда мы забываем этот шаг).

И это то, что мы получаем:

Оно работает!

А как насчет других изображений? Если вы не можете придумать ничего (или кого-либо) еще, попробуйте использовать фотографии ваших сотрудников. ?

Заключение

Как видите, KERAS и PYTORCH значительно различаются с точки зрения того, насколько стандартные модели глубоких учебных моделей определены, изменены, обучены, оценены и экспортированы. Для некоторых частей это чисто о различных конвенциях API, а для других фундаментальных различий между уровнями абстракции участвуют.

Keras работает на гораздо более высоком уровне абстракции. Это гораздо больше Plug & Play и, как правило, более сжаты, но по стоимости гибкости.

Pytorch предоставляет более явный и подробный код. В большинстве случаев это означает отладочный и гибкий код, с лишь небольшим накладным расходом. Тем не менее, обучение – это многослойное многословное в Pytorch. Это больно, но иногда обеспечивает много гибкости.

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

Вы пробовали передачу обучения для распознавания изображений? Рассмотрим список ниже для некоторого вдохновения:

Выберите KERAS или PYTORCH, выберите набор данных, и дайте нам знать, как он пошел в разделе комментариев ниже?

Кстати, в ноябре мы бежим Серия практических занятий Где вы можете узнать больше о KERAS и PYTORCH. Piotr Migdał И я приведу некоторых сессий, так что не стесняйтесь проверять это.