Абстрактный

В этой статье рассматривается трансферное обучение (TL), мощная техника в области глубокого обучения. В трансферном обучении архитектуры сетей и обученные параметры, полученные с помощью определенного набора данных, заимствуются и используются для новой задачи. Мы изучаем различные подходы TL для распознавания изображений в наборе данных CIFAR-10 с использованием предварительно обученных сетевых архитектур в наборе данных ImageNet. Не маскируйтесь академическим тоном, это не академическая статья. В конце есть фрагменты кода на tensorFlow Keras.

Введение

Мы, люди, можем применить то, чему мы научились, выполняя определенную задачу, к другой, слабо связанной с ней. Со дня своего рождения (некоторые утверждают, что и раньше) мы переносим знания, полученные в той или иной ситуации, на новые случаи, с которыми постоянно сталкиваемся в жизни. Мы часто удивляемся скорости, с которой человек «схватывает» тему. Чего мы не знаем, так это того, что она, вероятно, передает некоторые навыки, полученные ранее, в другом контексте.

Например, мы используем знание родного языка для изучения нового языка или владение первым иностранным языком для изучения второго. Умение ездить на велосипеде очень помогает при езде на мотоцикле. Чем ближе задачи, тем легче передать знания. Ваше знание испанского поможет вам с португальским. Но пользы от него при изучении немецкого языка будет значительно меньше. Мы редко чему-то учимся с нуля. Всегда есть какие-то предварительные знания.

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

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

Эта статья представляет собой исследование некоторых методов трансферного обучения, основанных на гипотетической задаче, а именно на классификации набора данных CIFAR-10. Мы будем говорить о нашей отправной точке, нашей цели, о том, как мы туда попали, о препятствиях, которые мы встретили на пути, и о найденных обходных путях и хитростях. Обучение езде не обошлось без пары царапин, но оно того стоило. Давай кататься!

Материалы и методы

Набор данных

Мы будем работать с набором данных CIFAR-10. Он состоит из 60 000 цветных изображений 32x32 в 10 классах или категориях, по 6 000 изображений в каждом классе. Есть 50 000 обучающих изображений и 10 000 тестовых изображений. Десять (10) различных классов представляют самолеты, автомобили, птиц, кошек, оленей, собак, лягушек, лошадей, корабли и грузовики.

Для начала мы будем использовать Наборы данных Keras для загрузки Набора данных классификации небольших изображений CIFAR10. Взгляните на прикрепленный код в приложениях. Он показывает процесс загрузки, какой вид имеют данные и как они меняются после предобработки. Обратите внимание на входную форму обучающего набора (50000, 32, 32, 3), что означает, что у нас есть 50 000 изображений 32x32 с тремя каналами, соответствующими RGB. Наши тестовые данные содержат 1000 изображений одинакового размера. У нас также есть этикетки для обучающих и тестовых наборов. Они приходят в виде массива целых чисел, чтобы увидеть, что они означают, мы должны сопоставить их со списком меток. Мне всегда нравится буквально видеть то, с чем я имею дело, поэтому с помощью Matplolib давайте визуализируем некоторые изображения. У меня нет проблем с тем, чтобы увидеть двух лошадей и грузовик, птицу как-то сложнее, но мне нужно протереть глаза, чтобы разглядеть оленя.

Обычно мы были бы готовы передать наш набор данных в модель и запустить все это. Но в трансферном обучении мы хотим максимально точно имитировать условия обучения базовой модели. Keras поставляется со встроенной функцией для этого. Он имеет по одному для каждой из доступных предварительно обученных моделей. Вторая часть кода показывает, что делает эта предварительная обработка. Исходный набор данных имел числа от 0 до 255, соответствующие диапазону RGB. После предварительной обработки они преобразуются в небольшие отрицательные числа. Обычной практикой является нормализация значений, то есть деление на 255, но обратите внимание, что предварительная обработка делает больше, в документации говорится, что она нормализует данные до набора данных ImageNet. Если мы визуализируем этот новый массив через Matplolib, мы получим изображение с большим количеством черного цвета. Это потому, что Matplolib принимает либо от 0 до 1 для ввода с плавающей запятой, либо от 0 до 255 для целого числа. У нас есть много записей вне диапазона, и Matplotlib преобразует их в ноль.

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

Базовая модель

Чтобы решить нынешнюю проблему, Keras представляет нам Keras Applications, которые представляют собой модели глубокого обучения, доступные вместе с предварительно обученными весами. Мы используем эти модели для прогнозирования, извлечения признаков и тонкой настройки. Они различаются по своей глубине (имеется в виду топологическая глубина сети), количеству обучаемых параметров, размеру и точности. Веса моделей являются результатом обучения на подмножестве ImageNet, содержащем 1000 категорий и 1,2 миллиона изображений. Обратите внимание, что наша задача требует значительно меньше усилий, чем задача ImageNet. Мы переходим от тысячи (1.000) различных категорий только к десяти (10). Но набор данных, доступных для обучения, также на порядки меньше.

Я не буду обсуждать или углубляться в достоинства каждой модели архитектуры. Это не цель этого блога, если вам интересно, взгляните на мой пост: Крижевский, Суцкевер, Хинтон и ImageNet об AlexNet, прочитайте соответствующую статью или другой обзор, например DenseNet — плотная сверточная сеть (изображение Классификация). С учетом сказанного и принятия всех их как одинаково подходящего выбора для нашей текущей задачи, давайте перейдем к механике их использования.

Первое решение — включать или нет последний полносвязный слой наверху сети (аргумент include_top). Этот слой отвечает за выполнение классификации. В исходном наборе данных (ImageNet) было 1000 категорий, мы хотим иметь только десять (10). Поэтому не включаем его для обучения нашего нового. Если бы наша цель состояла в том, чтобы классифицировать новый набор данных среди тех же 1000 категорий, мы бы оставили его. Мы не проводим никакого обучения, а берем всю модель и используем ее для прогнозирования. Мы также можем оставить его, если хотим дополнительно обучить модель на расширенном наборе данных, всегда с 1000 категориями.

Теперь перейдем к весам. Здесь мы решаем, какие значения будут иметь наши параметры. Мы будем использовать «imagenet» в качестве аргумента. Это может быть «нет» для случайной инициализации или путь к другим параметрам, которые мы ранее нашли при обучении на другом наборе данных.

Далее нужно решить, будем ли мы замораживать все слои базовой модели или обучать некоторые или все из них. Если мы заморозим их все, базовая модель будет действовать как экстрактор признаков. Думайте об этом как о функции, которая отображает наш входной тензор, представляющий изображения, в карты признаков. Эти карты объектов также являются изображениями, на которых мы будем выполнять классификацию, используя слой, который мы добавим следующим. Чтобы получить лучшее представление, давайте визуализируем их, используя прилагаемый код. Мы выберем MobileNetV2 в качестве нашей модели. Обратите внимание, что мы увеличили размер ввода с 32x32 до 96x96. Причина в том, что это минимальный входной размер, который принимает MobileNetV2. Мы сделали это только с одним изображением, а не со всем набором данных. Эта операция очень интенсивно использует оперативную память. Если бы мы делали это с полным набором данных, то мы использовали бы лямбда-слой, чтобы делать это партиями. Чтобы проиллюстрировать это, давайте поговорим об апсэмплинге. Повышение дискретизации является обратным пулу и также приводит к увеличению размера вывода. Keras также имеет встроенный метод слоя для этого.

Слои классификации

По сути, мы используем базовый режим (MobileNet, DenseNet и т. д.) в качестве средства сопоставления объектов и обучаем последние слои нашей составленной модели различать эти объекты. Это классификационные слои плотносвязного типа. Модель будет завершена, как только мы добавим последние слои, сглаживающий слой с активацией softmax. Мы можем добавить больше слоев с активацией relu, чтобы улучшить классификацию.

Наша модель готова. Первая часть — это базовая модель (мы можем решить обучать ее или нет). Важно то, что он имеет параметры, полученные в результате обучения с набором данных Imagenet. А вторая часть или вершина отвечает за классификацию, если мы разместили хотя бы один классификационный слой. У нас есть предварительно обработанный ввод, и теперь мы можем скомпилировать полную модель. Перед этим давайте взглянем на сводку модели. Мы начнем с 32 x 32 и дерева (3) входных каналов RGB и изменим его размер до 96 x 96 x 3 (см. рисунок). Затем мы позволили ему пройти через нашу замороженную базовую модель, основанную на MobileNetV2, которая выводит 1280 карт признаков 3 x 3. Позже мы сглаживаем его до одномерного массива размером 115,210, чтобы, наконец, запустить его через наш слой softmax и получить наши десять (10) категорий классификации. Обратите внимание, что из 2 373 194 параметров модели мы обучаем только 115 210 параметров, соответствующих классификационному слою softmax. То есть под 5% от общего количества.

Оптимизация и обучение

Мы будем использовать оптимизатор Адама с кросс-энтропией в качестве параметра потерь. Мы будем использовать планировщик скорости обучения, обратный вызов Tensorboard с соответствующим каталогом журналов, чтобы визуализировать процесс позже, раннюю остановку с аргументом терпения 5 эпох и контрольную точку модели, чтобы сохранить нашу лучшую модель. Вы можете найти код в приложениях. Графики скорости обучения оказали значительное влияние на точность проверки.

Взгляните на мои статьи Загляните в методы оптимизации ML и Методы регуляризации ML для получения дополнительных материалов по этому вопросу.

Увеличение данных

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

Инфраструктура

Мы будем использовать Google Colab, бесплатную среду для ноутбуков Jupyter, которая работает в облаке и хранит свои блокноты на Google Диске. Он поставляется с возможностью запуска на графическом процессоре, что значительно сокращает время обработки.

Результаты и обсуждение

Базовая модель с MobilenetV2

Уже в первую эпоху мы получаем точность проверки выше 0,77, и всего за две (2) эпохи обучения мы поднимаемся выше точности 0,8. Пик точности приходится на эпоху 8, но уже начиная со второй эпохи ощутимого улучшения нет. Тот факт, что точность теста очень рано приближается к значениям, близким к 1, предполагает, что реального обучения больше не происходит. И небольшое ухудшение после восьмой эпохи предполагает переоснащение. Одной из стратегий противодействия этому является увеличение данных.

MobileNetV2 с увеличением данных

Показатели точности тестирования и проверки начинаются с более низких значений (0,68 и 0,75). Теперь мы тренируемся на четырехкратном (4) расширенном наборе данных (20 000 образцов). Точность теста не приближается к единице так быстро, как раньше, и вместе с точностью проверки продолжает улучшаться до 14-й эпохи, где она выходит на плато. Окончательный результат точности проверки практически такой же, как и для испытания без увеличения данных.

MobileNetV2 с увеличением данных и дополнительным плотным слоем

Введя еще один плотный слой, на этот раз с активацией relu, мы теперь имеем 2 951 946 обучаемых параметров по сравнению с 115 210, которые у нас были раньше. То есть в 25 раз больше. В наших предыдущих прогонах точность проверки пересекает точность теста уже после первой эпохи, в этом испытании это происходит только на восьмой эпохе. Мы расширили возможности классификации нашей модели, которая показывает новую точность проверки 0,82850.

Обучаемый MobilenetV2 с увеличением данных и дополнительным плотным слоем

Разморозив слои базовой модели, мы теперь будем обучать всю модель. Количество обучаемых параметров составляет 5 175 818, что почти вдвое больше, чем в предыдущем испытании. Теперь, когда мы также обучаем базовую модель, остается трансферное обучение, потому что мы использовали предварительно изученный вес в качестве инициализации. После пяти (5) эпох мы уже достигли точности проверки выше 0,9.

Обучение этой модели занимает значительно больше времени. Время на эпоху составляет около 30 минут, в то время как предыдущее испытание длилось менее 1 минуты.

Densenet121 с дополнительным плотным слоем и последующим размораживанием верхнего слоя

Ввод 32 x 32, на котором мы не выполняем ни изменение размера, ни повышение частоты дискретизации, ни увеличение данных. Неудивительно, что обучение происходит намного быстрее (менее минуты за эпоху). Модель со всеми замороженными слоями изо всех сил пытается достичь конечной точности проверки 0,70210. Можно с уверенностью сказать, что информация слишком сжата (32 х 32) и недостаточна для модели. Тем не менее, мы остановимся на этом, чтобы увидеть эффект размораживания последних слоев базовой модели.

Мы перейдем от 132 490 обучаемых параметров к 171 402, разница 36864 соответствует conv5_block16_2_conv, который мы разморозили. Мы улучшили точность проверки до 0,71490. Это небольшое улучшение, но оно показывает, что мы можем оптимизировать извлечение признаков, заимствованных из предварительно обученной модели DenseNet. Мы тренируем только один из 121 слоя модели.

Обучаемый Densenet121 с повышающей дискретизацией, увеличением данных и дополнительными плотными слоями

DenseNet — более глубокая модель и, следовательно, имеет больше параметров. Кроме того, мы увеличиваем возможности классификации, добавляя один дополнительный плотный слой. Мы достигаем точности проверки 0,9226 для набора данных задачи.
Время обучения на эпоху было в диапазоне двух минут с использованием Google Colab, в отличие от следов imageNet, которые мы используем с повышением дискретизации вместо изменения размера. Вместо 96 x 96 входной размер теперь составляет 64 x 64, что составляет примерно половину размера.

….. и еще

Теперь ясно, что мы можем продолжать экспериментировать, и я призываю вас к этому. Вы можете поиграть с размером ввода, мы пробовали 32, 64 и 96, но ничто не мешает вам перейти к 128 или 256 (может потребоваться больше времени для обработки). Мы попробовали две архитектуры MobileNet и DenseNet, есть много других (приложения Keras имеют 26 разных), некоторые более мелкие, такие как VGG16 (с 23 слоями), и более глубокие, такие как InceptionResNetV2 (с 512). Мы пытались заморозить всю базовую модель, разморозить только самый последний слой и разморозить его полностью, но вы можете попробовать все промежуточное, например четверть или половину сетки, внизу или вверху. Вы можете добавить более плотно связанные слои, а также сверточные. Cifar-10 — это только один набор данных, вы можете попробовать свой собственный с меньшим или большим количеством категорий. Продолжайте экспериментировать!

Заключительные замечания

"nanos gigantum humeris insidentes"

Мы стоим на плечах гигантов. Сообщество машинного обучения не только невероятно разнообразно и быстро развивается, но и открыто и щедро делится знаниями. Это большое удовольствие для всех, кто отваживается войти в этот мир, поскольку позволяет нам опираться на предыдущие с трудом полученные знания. Трансферное обучение — один из многих способов сделать это.

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

Благодарности

Машинное обучение опирается на глубокие математические концепции. Тем не менее подход к выбору гиперпараметров часто сводится к пробам и ошибкам. При таком подходе успешные следы от сверстников являются неоценимым вкладом в процесс. Поэтому я хочу поблагодарить своих коллег из Холбертона Пауло Морилло, Эдвара Ортиса, Эмму Гачансипу, Карлоса Молано, Джона Кука, Хорхе Сафру, Хуана Альберто Лондоньо, Пьера Беахуге, Хана Нгуена, Хуана Диего Аранго, Хосе Альвареса де Луго и Кристиана. Уильямс за ценные обсуждения, которые мы провели.

Дальнейшее чтение

Вы определенно хотите взглянуть на пост Дипанджана (ди-джея) Саркара Всеобъемлющее практическое руководство по переносу обучения с помощью реальных приложений в глубоком обучении.

Специализация Эндрю Нг на deeplearning.ai видео — еще один отличный источник.

Наконец, чтобы глубже погрузиться в это, прочитайте A Survey on Deep Transfer Learning Tan Et. аль Университета Цинхуа в Пекине.

Приложения

Загрузка набора данных и предварительная обработка

Увеличение данных

Повышение частоты дискретизации

Обучаемый MobileNetV2 (изменение размера и увеличение данных)

DenseNet121 (замороженные слои)

Полностью обучаемый DenseNet121 (повышение дискретизации и увеличение данных)