Испытание известных моделей CNN с помощью Tensorflow 2, чтобы помочь Цзянь Яну

Вступление

Вы смотрели комедийный сериал HBO Силиконовая долина? Если так, держу пари, вы помните приложение Not Hotdog, которое разработал Цзянь Ян. Вот клип, который освежит вашу память.

Таким образом, в основном это приложение определяет, является ли что-то хот-догом или нет. Что ж, мы можем потренироваться с другими типами объектов, чтобы идентифицировать их.

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

Я использовал следующие модели для этой проблемы,

  1. Вариант AlexNet
  2. Передача обучения с VGG19
  3. Перенос обучения с ResNet50
  4. Перенос обучения с помощью Inception V3
  5. Передача обучения с помощью Inception ResNet V2

Вы можете просмотреть блокнот на NBViewer и найти его также на GitHub,



Данные

Без данных хорошего качества нет машинного обучения. К счастью, я нашел набор данных на Kaggle [1].

Всего для обучения доступно 3000 изображений.
Из них 1500 - изображения хот-догов, а 1500 - не хот-доги (это еда, мебель, люди или домашние животные).
20% данных обучения будет использоваться для проверки, что означает, что для проверки будут использоваться 600 изображений.
В тестовый набор входят 322 изображения из категории «Хот-дог» и 322 изображения из категории «Хот-дог».

При загрузке я изменил размер всех изображений на 256x256. Кроме того, я разделил их на размер пакета 32.

Давайте посмотрим на некоторые изображения,

Предварительная обработка

Изменение размера

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

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

Увеличение данных - очень полезный шаг. Это помогает сделать модель лучше. Кроме того, он генерирует новые изображения из данного изображения, что увеличивает размер нашего набора данных.

Как? Он может выполнять различные операции, такие как переворачивание, вращение, сдвиг, масштабирование и т. Д. Для создания дополненных данных. Обратите внимание, что TensorFlow делает это «на лету», что означает, что нам не нужно сохранять изображения, но они будут сгенерированы во время обучения.

Я выполнил следующую операцию увеличения данных:
a) Переворот по горизонтали
б) Вращение
в) Масштаб

После увеличения данных мы можем ожидать что-то вроде изображения, показанного ниже,

Изменение масштаба

Мы должны изменить масштаб пикселей с [0, 255] на [0, 1]. Я буду применять это только к AlexNet.

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

Построение модели

AlexNet

AlexNet использовал три основных концепции:
1. Увеличение данных - для увеличения дисперсии данных.
2. Отключение - для устранения переобучения.
3. Блок активации ReLU - для устранения исчезновения проблема градиента.

Я создал вариант архитектуры AlexNet с функцией Dropout и BatchNormalization кое-где. Всего доступно для обучения 58 286 465 парам. Последний слой имеет 1 блок активации сигмовидной кишки.

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

Я пробегал 10 эпох. Я также добавил обратный вызов Early Stopping, который отслеживает val_loss. Мы получаем точность 69,00% с данными проверки и точность 68,47% с данными тестирования. Что не очень радует. Мы могли бы добиться большего, если бы сделали настройку или имели больше данных.

Передача обучения с предварительно подготовленным VGG19

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

Трансферное обучение - очень крутая техника. При трансферном обучении мы загружаем предварительно обученную модель. И снимаем верх (несколько последних плотных слоев) модели. Затем мы замораживаем сверточную базу предварительно обученной модели. Теперь мы можем использовать эту предварительно обученную модель в качестве экстрактора признаков.

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

VGG19

VGG19 от Visual Geometry Group. Имеет 19 слоев. У него появилась новая идея, что когда мы используем несколько маленьких ядер вместо менее крупных, количество обучаемых параметров уменьшается. Также везде используются одинаковые ядра размером 3x3 и максимальный пул 2x2, что упрощает архитектуру.

Я загрузил предварительно обученную модель VGG19 TensorFlow Keras с весами ImageNet и без верхних слоев.

Затем я установил эту базовую модель как не обучаемую.

В архитектуре модели

i) Сначала я добавил входной слой.
ii) Затем слой увеличения данных. Tensorflow автоматически управляет тем, что аугментация выполняется только для обучения.
iii) Затем я использовал предварительную обработку модели VGG19.
iv) После этого я использовал базовую модель, то есть предварительно обученную модель VGG19. . Что не поддается обучению в соответствии с переносом обучения.
v) Затем я использовал 2D-слой Global Average Pooling.
vi) Затем слой Flatten.
vii) Затем полностью связанный плотный слой с 1000 активами Relu. Я также добавил к нему Dropout для регуляризации.
viii) Затем я добавил модуль линейной активации. Потому что я буду использовать `from_logits = True ` в двоичной кроссентропии, чтобы получить вероятности.

Он имеет 514 001 обучаемых парам и 20 024 384 необучаемых парама.

Как и раньше, мы использовали оптимизатор Адама и двоичную кросс-энтропию.

На этот раз мы получаем точность 93,17% с данными проверки и точность 93,47% с данными тестирования. Это очень хорошее улучшение по сравнению с предыдущим.

Передача обучения с предварительно обученным ResNet50

ResNet50 был создан He et al. Имеет 50 слоев. Он ввел идею остаточных блоков. И это помогло в построении моделей с большой глубиной. Остаточные блоки имеют пропускаемые соединения, поэтому, если блок бесполезен, он просто игнорируется.

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

Он имеет 2 050 001 обучаемых парам и 23 587 712 необучаемых парам.

Этап компиляции и подгонки аналогичен описанному выше. И на этот раз мы получаем точность 94,33% с данными проверки и точность 94,56% с данными тестирования. Это всего лишь небольшое улучшение по сравнению с предыдущим.

Передача обучения с помощью Pre-Trained Inception V3

Inception v3 - третья версия. Он был разработан Google. Имеет 48 слоев. Сеть Inception вместо использования одной свертки одновременно использовала все 1x1, 3x3, 5x5 и MaxPool. Идея заключалась в том, что меньшее ядро ​​получит локальную информацию, а большее ядро ​​получит глобальную информацию. В нем есть еще один прием, называемый слоями узких мест, который резко сокращает количество вычислений.

Мы снова изменили базовую модель на Inception V3, а также на этап предварительной обработки.

Он имеет 2050 001 обучаемый параметр, такой же, как ResNet50, и 21 802 784 необучаемых параметра.

Этап компиляции и подгонки аналогичен описанному выше. Мы получаем точность 92,67% с данными проверки и точность 94,40% с данными тестирования. Что меньше, чем у ResNet50.

Перенос обучения с предварительно обученным начальным ResNet V2

Inception ResNet V2 был разработан Google. Они добавили пропуск подключений ResNet в сеть Inception. И это позволило создать более глубокую сеть из 164 слоев.

Я сделал аналогичные изменения, как указано выше.

Он имеет 1 538 001 обучаемых парам и 54 336 736 необучаемых парам.

Этап компиляции и подгонки аналогичен тому, что мы видели до сих пор. Мы получаем точность 95,33% с данными проверки и точность 96,42% с данными тестирования. Что до сих пор является лучшим.

Тестовые выходы

Все четыре модели трансферного обучения работают одинаково и довольно хорошо.

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

Последние мысли

Если вы видите, что мы сделали только пару вещей для модели: расширение данных, предварительную обработку, загрузили базовые модели и добавили несколько слоев вверху. И нам удалось добиться точности 96,30%. Это из-за трансферного обучения. Мы могли бы сделать еще несколько обучаемых слоев в базовой модели. Что могло бы улучшить точность.

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

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

использованная литература

  1. TensorFlow [https://www.tensorflow.org/]
  2. Набор данных: Джайн, Яшвардхан. 2019. Хот-дог-не-хот-дог.
    Версия 1. Лицензия CC0: Public Domain. Доступно по адресу: https://www.kaggle.com/yashvrdnjain/hotdognothotdog/metadata
  3. Примененные корни [https://www.appliedroots.com/]

Спасибо за чтение блога! Вы можете связаться со мной в моем профиле LinkedIn. Также 👏, если вам понравилось.