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

1. Обзор

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

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

Эта лабораторная работа является второй частью серии «Керас в ТПУ». Вы можете делать их в следующем порядке или самостоятельно.

ca8cc21f6838eccc.png

Что вы узнаете

  • Чтобы создать свой собственный классификатор изображений Keras со слоем softmax и потерей перекрестной энтропии.
  • Обманывать 😈, используя трансферное обучение вместо построения собственных моделей.

Обратная связь

Если вы заметили что-то неладное в этой лаборатории кода, сообщите нам. Обратная связь может быть предоставлена ​​через вопросы GitHub [ ссылка обратной связи ].

2. Быстрый старт Google Colaboratory

Эта лабораторная работа использует Google Collaboratory и не требует никакой настройки с вашей стороны. Colaboratory — это онлайн-платформа для записных книжек для образовательных целей. Он предлагает бесплатное обучение процессорам, графическим процессорам и TPU.

688858c21e3beff2.png

Вы можете открыть этот образец блокнота и просмотреть пару ячеек, чтобы ознакомиться с Colaboratory.

c3df49e90e5a654f.png Welcome to Colab.ipynb

Выберите серверную часть TPU

8832c6208c99687d.png

В меню Colab выберите «Время выполнения» > «Изменить тип среды выполнения» , а затем выберите «TPU». В этой лаборатории по программированию вы будете использовать мощный TPU (тензорный процессор), поддерживающий аппаратное ускорение обучения. Подключение к среде выполнения произойдет автоматически при первом запуске, или вы можете использовать кнопку «Подключиться» в правом верхнем углу.

Исполнение ноутбука

76d05caa8b4db6da.png

Выполняйте ячейки по одной, щелкая ячейку и используя Shift-ENTER. Вы также можете запустить весь блокнот, выбрав «Среда выполнения» > «Выполнить все».

Оглавление

429f106990037ec4.png

Все тетради имеют оглавление. Открыть его можно с помощью черной стрелки слева.

Скрытые ячейки

edc3dba45d26f12a.png

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

Аутентификация

cdd4b41413100543.png

Colab может получить доступ к вашим частным корзинам облачного хранилища Google при условии, что вы пройдете аутентификацию с использованием авторизованной учетной записи. Приведенный выше фрагмент кода запустит процесс аутентификации.

3. [ИНФО] Классификатор нейронной сети 101

В двух словах

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

Для моделей, построенных как последовательность слоев, Keras предлагает Sequential API. Например, классификатор изображений, использующий три плотных слоя, можно записать в Keras как:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
    tf.keras.layers.Dense(500, activation="relu"),
    tf.keras.layers.Dense(50, activation="relu"),
    tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])

# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy']) # % of correct answers

# train the model
model.fit(dataset, ... )

688858c21e3beff2.png

Плотная нейронная сеть

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

c21bae6dade487bc.png

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

Нейроны, активации, RELU

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

644f4213a4ee70e5.png

Самая популярная функция активации называется RELU для выпрямленных линейных единиц. Это очень простая функция, как вы можете видеть на графике выше.

Активация Софтмакс

Сеть выше заканчивается слоем из 5 нейронов, поскольку мы классифицируем цветы по 5 категориям (роза, тюльпан, одуванчик, ромашка, подсолнух). Нейроны в промежуточных слоях активируются с помощью классической функции активации RELU. Однако на последнем слое мы хотим вычислить числа от 0 до 1, представляющие вероятность того, что этот цветок будет розой, тюльпаном и так далее. Для этого мы будем использовать функцию активации под названием «softmax».

Применение softmax к вектору осуществляется путем взятия экспоненты каждого элемента и последующей нормализации вектора, обычно с использованием нормы L1 (суммы абсолютных значений), так что сумма значений равна 1 и может интерпретироваться как вероятности.

ef0d98c0952c262d.pngd51252f75894479e.gif

Перекрестная энтропийная потеря

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

Подойдет любое расстояние, но для задач классификации наиболее эффективным является так называемое «перекрестное энтропийное расстояние». Мы назовем это нашей функцией ошибки или «потери»:

7bdf8753d20617fb.png

Градиентный спуск

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

Перекрестная энтропия — это функция весов, смещений, пикселей обучающего изображения и его известного класса.

Если мы вычислим частные производные перекрестной энтропии относительно всех весов и всех смещений, мы получим «градиент», рассчитанный для данного изображения, метки и текущего значения весов и смещений. Помните, что у нас могут быть миллионы весов и смещений, поэтому вычисление градиента кажется большой работой. К счастью, Tensorflow делает это за нас. Математическое свойство градиента заключается в том, что он направлен «вверх». Поскольку мы хотим пойти туда, где перекрестная энтропия низкая, мы идем в противоположном направлении. Мы обновляем веса и смещения на долю градиента. Затем мы делаем то же самое снова и снова, используя следующие партии обучающих изображений и меток в цикле обучения. Будем надеяться, что это приведет к тому, что перекрестная энтропия будет минимальной, хотя ничто не гарантирует, что этот минимум уникален.

градиентный спуск2.png

Мини-пакетирование и импульс

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

Этот метод, иногда называемый «стохастическим градиентным спуском», имеет еще одно, более прагматичное преимущество: работа с пакетами также означает работу с матрицами большего размера, и их обычно легче оптимизировать на графических процессорах и TPU.

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

52e824fe4716c4a0.png

Иллюстрация: седловая точка. Градиент равен 0, но не является минимальным во всех направлениях. (Атрибуция изображения Wikimedia: Никогуаро — собственная работа, CC BY 3.0 )

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

Глоссарий

пакет или мини-пакет : обучение всегда выполняется на пакетах обучающих данных и меток. Это помогает алгоритму сходиться. «Пакетное» измерение обычно является первым измерением тензоров данных. Например, тензор формы [100, 192, 192, 3] содержит 100 изображений размером 192x192 пикселей с тремя значениями на пиксель (RGB).

перекрестная энтропийная потеря : специальная функция потерь, часто используемая в классификаторах.

плотный слой : слой нейронов, где каждый нейрон связан со всеми нейронами предыдущего слоя.

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

метки : другое название «классов» или правильных ответов в задаче контролируемой классификации.

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

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

loss : функция ошибок, сравнивающая выходные данные нейронной сети с правильными ответами.

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

горячее кодирование : класс 3 из 5 кодируется как вектор из 5 элементов, все нули, кроме третьего, который равен 1.

relu : выпрямленная линейная единица. Популярная функция активации нейронов.

sigmoid : еще одна функция активации, которая раньше была популярна и до сих пор полезна в особых случаях.

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

тензор : «Тензор» похож на матрицу, но с произвольным числом измерений. Одномерный тензор — это вектор. Двумерный тензор является матрицей. И тогда у вас могут быть тензоры с 3, 4, 5 или более измерениями.

4. Передача обучения

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

Но мы также можем пойти и коротким путем! Для скачивания доступны полностью обученные сверточные нейронные сети. Можно отколоть их последний слой, классификационную головку softmax, и заменить на свой. Все обученные веса и смещения остаются такими же, вы только переобучаете добавленный слой softmax. Этот метод называется трансферным обучением, и, что удивительно, он работает до тех пор, пока набор данных, на котором предварительно обучается нейронная сеть, «достаточно близок» к вашему.

Практический

Откройте следующую записную книжку, заполните ячейки (Shift-ENTER) и следуйте инструкциям везде, где вы видите надпись «ТРЕБУЕТСЯ РАБОТА».

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

Дополнительная информация

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

b8fc1efd2001f072.png

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

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

В Keras вы можете создать экземпляр предварительно обученной модели из коллекции tf.keras.applications.* . MobileNet V2, например, представляет собой очень хорошую сверточную архитектуру, сохраняющую разумные размеры. Выбрав include_top=False , вы получите предварительно обученную модель без финального слоя softmax, чтобы вы могли добавить свой собственный:

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False

model = tf.keras.Sequential([
    pretrained_model,
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(5, activation='softmax')
])

Также обратите внимание на настройку pretrained_model.trainable = False . Он замораживает веса и смещения предварительно обученной модели, чтобы вы могли тренировать только свой слой softmax. Обычно это требует относительно небольшого количества весов и может быть выполнено быстро и без необходимости использования очень большого набора данных. Однако если у вас много данных, трансферное обучение может работать еще лучше с pretrained_model.trainable = True . Предварительно обученные веса обеспечивают отличные начальные значения, и их все равно можно корректировать в процессе обучения, чтобы лучше соответствовать вашей проблеме.

Наконец, обратите внимание на слой Flatten() , вставленный перед плотным слоем softmax. Плотные слои работают с плоскими векторами данных, но мы не знаем, возвращает ли это предварительно обученная модель. Вот почему нам нужно сгладить. В следующей главе, когда мы углубимся в сверточные архитектуры, мы объясним формат данных, возвращаемых сверточными слоями.

При таком подходе вы должны получить точность около 75%.

Решение

Вот блокнот с решением. Вы можете использовать его, если застряли.

c3df49e90e5a654f.png Keras Flowers transfer learning (solution).ipynb

Что мы рассмотрели

  • 🤔 Как написать классификатор в Керасе
  • 🤓 настроен с последним слоем softmax и потерей перекрестной энтропии
  • 😈 Перенос обучения
  • 🤔 Обучение вашей первой модели
  • 🧐 Следим за его потерей и точностью во время тренировки

Пожалуйста, найдите время и прокрутите этот контрольный список в уме.

5. Поздравляем!

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

ТПУ на практике

TPU и графические процессоры доступны на платформе Cloud AI :

Наконец, мы любим обратную связь. Пожалуйста, сообщите нам, если вы заметили в этой лаборатории что-то не так или считаете, что ее следует улучшить. Обратная связь может быть предоставлена ​​через вопросы GitHub [ ссылка обратной связи ].

HR.png

Мартин Гёрнер ID small.jpg
Автор: Мартин Гёрнер
Твиттер: @martin_gorner

логотип тензорного потока.jpg
www.tensorflow.org