Используйте трансферное обучение с TensorFlow, чтобы повысить точность модели для соревнования Kaggle Dogs vs Cats.

Пока я изучаю глубокое обучение, мне нравится практиковать теорию, участвуя в соревнованиях Kaggle. Ранее я создал свёрточную нейронную сеть с TensorFlow, чтобы присоединиться к соревнованию «Кошки против собак» на Kaggle. Благодаря этой сверточной нейронной сети я занял 833-е место в общедоступной таблице лидеров Kaggle.



Точность CNN составляла около 90%. Я хочу попытаться улучшить точность моей модели и подняться в таблице лидеров Kaggle. Я буду использовать трансферное обучение для улучшения своей модели. Трансферное обучение — это метод, при котором вы повторно используете модель, которую кто-то другой обучил, в качестве отправной точки вашей модели. TensorFlow Keras содержит несколько встроенных предварительно обученных моделей, которые вы можете использовать.

Исходный код доступен на Github. Я использовал Python 3.8 и Tensorflow 2.3.

Трансферное обучение

Трансферное обучение — популярный метод повышения точности вашей модели. Вы берете модель, которую кто-то обучил для другой задачи, и повторно используете ее.

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

Помните, что в модели TensorFlow из предыдущей статьи у нас было три сверточных слоя? Что происходит во время обучения, так это то, что TensorFlow обучает каждый сверточный слой определенным функциям изображений.

В 2013 году Мэтт Зейлер и Роб Фергус опубликовали статью Визуализация и понимание сверточных сетей. В этой статье показано, как визуализировать веса нейронной сети, изученной на каждом уровне модели. См. ниже визуализацию первого слоя и последнего слоя CNN. Блок в левом верхнем углу — это визуализация весов, а остальные показывают активацию слоя во время тренировки.

Если вы посмотрите на другие слои визуализации CNN, вы увидите, что каждый слой обнаруживает более специфические особенности изображений. В нашей CNN визуализация последнего слоя содержит определенные части собаки или кошки. См. ниже визуализацию слоя 5 из отчета Matt Zeiler.

С трансферным обучением мы повторно используем слои модели CNN, которые являются общими для всех изображений. Например, это означает, что мы сохраняем первые 70 слоев существующей модели, а также добавляем и переобучаем новые слои.

Теперь, когда вы знаете, что такое трансферное обучение, мы реализуем его с помощью TensorFlow Keras.

Перенос обучения с TensorFlow Keras

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

Модель Inception V3 содержит 159 слоев и 23 миллиона параметров. Это больше, чем наша собственная модель CNN, с девятью слоями и 9 миллионами параметров. Надеюсь, это повысит точность нашей модели.

Мы создадим модель иначе, чем раньше. Мы не используем класс Sequential, но создаем и используем экземпляр модели InceptionV3.

Размер input_shape остался прежним (150x150x3). Чтобы предотвратить переобучение существующих слоев, мы блокируем все слои, устанавливая для свойства trainable каждого слоя значение False.

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

Добавление обучаемых слоев

Мы должны добавить дополнительные слои для обучения модели, используя наши изображения кошек и собак. Мы добавляем наши обучаемые слои после 130-го слоя модели InceptionV3. Этот слой называется «mixed7», см. краткую информацию о модели.

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

Мы добавляем Flatten, скрытый Dense и выходной слой Dense. Затем мы создаем модель, используя существующие построенные layers_out слоев. Начиная с этой части, компиляция и обучение модели выполняются так же, как и раньше.

Как видите, я по-прежнему использую ImageDataGenerators и Image Augmentation для подачи обучающих изображений в конвейер. См. мою предыдущую статью для получения дополнительной информации.

Обучаем модель на 100 эпох.

Результирующая точность обучения и точность проверки

Мы видим, что когда мы сравниваем эти результаты с результатами нашей сверточной сети, мы видим, что и точность обучения, и точность проверки начинаются выше 0,9 по сравнению с 0,6.

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

Создание и отправка прогноза

Мы видим, что если мы создадим прогноз и отправим его в Kaggle, наша оценка составит 0,18834. Наилучший результат при использовании нашей CNN с увеличением изображения составил 0,26211. Так что стало немного лучше. Это позволит нам занять 762-е место в общедоступной таблице лидеров. Прыжок на 71 место!

Оптимизация модели

Можем ли мы еще больше оптимизировать модель? Одна вещь, которую мы можем использовать, это слои Dropout. Основная идея состоит в том, чтобы случайно изменить некоторые активации на ноль во время обучения. Это может помочь предотвратить переоснащение.

Этот метод был впервые представлен Нитишем Шриваставой и соавт. в Отсев: простой способ предотвратить переобучение нейронных сетей. На рисунке ниже наглядно показано, что происходит со слоем Dropout.

Мы добавляем слой Dropout непосредственно перед нашим плотным слоем. Я установил значение Dropout на 20% (0,2) в девятой строке.

Остальной код остается как есть. Мы снова обучаем модель на 100 эпох и визуализируем точность и потери.

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

Создание и отправка нового прогноза

Мы видим, что если мы создадим прогноз и отправим его в Kaggle, наша оценка составит 0,14293. Что является значительным улучшением по сравнению с моделью без слоя Dropout. Это поднимает нас еще на 63 места и занимает 699 место в общедоступной таблице лидеров Kaggle.

В рамках Keras доступно еще много предварительно обученных моделей.

Дальнейшая оптимизация, выбор другой модели

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

Исследования показали, что сверточные сети могут быть более точными, если они содержат более короткие связи между слоями, близкими к входу, и слоями, близкими к выходу. DensRes2.01 — это такая плотно связанная сверточная сеть.

По мере того, как эти предварительно обученные модели становятся больше, время обучения эпохи также увеличивается. Я тренировал модели постоянно около 100 эпох. Keras содержит функции обратного вызова, которые автоматически останавливают обучение, если обнаруживают, что точность не увеличивается или не уменьшается. Функция обратного вызова, которую я буду использовать, — EarlyStopping.

Мы устанавливаем обратный вызов EarlyStopping в качестве аргумента метода model.fit. При создании EarlyStopping вы передаете ему аргумент с именем patience, который устанавливает количество эпох без улучшения после того, как TensorFlow остановит обучение. Иногда точность немного подпрыгивает, и терпение помогает не останавливаться на вершине, если точность упала после эпохи. См. ниже пример.

Еще один метод оптимизации, который мы добавляем, — это настройка скорости обучения. Начальная скорость обучения передается оптимизатору в качестве аргумента в методе compile. Модели часто можно улучшить, если вы уменьшите скорость обучения, когда точность больше не улучшается.

ReduceLROnPlateau может автоматически снижать скорость обучения, если в течение нескольких эпох не наблюдается улучшения. ReduceLRonPlateau также является функцией обратного вызова, передаваемой в качестве аргумента методу model.fit, как и EarlyStopping.

Вы можете увидеть полное создание и инициализацию модели DensRes2.01 ниже.

Мы добавляем модель DenseNet201 непосредственно к Sequential, а затем добавляем Flatten и скрытый слой Dense. Наконец, мы добавляем плотный слой с одним блоком для двоичного вывода.

Мы создаем экземпляры EarlyStopping и ReduceLROnPlateau в строках 15 и 17 и добавляем их в параметр callbacks в строке 26.

Результирующая точность обучения и точность проверки

На моей машине эта модель обучает десять эпох, пока не остановится из-за EarlyStopping.

Точность обучения и проверки близка к 0,99, а потеря — к 0,025.

Создание и отправка последнего прогноза

Осталось только создать прогноз и отправить его в Kaggle. Когда мы отправляем прогнозы, мы видим, что наша оценка составляет 0,11625. Еще одно улучшение по сравнению с моделью InceptionV3, хотя сравнение не совсем честное, поскольку мы не использовали корректировку скорости обучения в Inception.

Набрав 0,11625, мы заняли 624 место в общедоступной таблице лидеров, что является скачком еще на 75 мест.

Вывод

В этой статье описано, как использовать Transfer Learning с TensorFlow и использовать его в соревновании Kaggle Dogs vs. Cats. С помощью Transfer Learning вы можете повторно использовать существующую модель, чтобы повысить ее точность. Вы блокируете большинство слоев, чтобы предотвратить переобучение, и добавляете свои пользовательские слои в конце.

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

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

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

Исходный код этой статьи вы можете найти на GitHub. Репозиторий большой, так как включает в себя все обучающие и тестовые образы.

Спасибо за чтение!