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

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

Итак, в этой статье я собираюсь реализовать классификацию CNN, используя tf_flowers из наборов данных TensorFlow, которые содержат 3670 изображений цветов в 5 различных категориях / классах. Мы увидим результат с предварительно обученными моделями намного лучше, чем с моделью CNN, которую мы обучили с нуля. Вот мои шаги:

1. загрузить и разделить наборы данных

2. Предварительная обработка изображений: CNN ожидает 224 * 224 изображения.

3. Загрузите модель Xception, предварительно обученную в ImageNet, и добавьте наши слои поверх предварительно обученных слоев.

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

5. Обучите / подогнайте модель: освободите все слои и обучите модель.

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

Здесь мы напрямую загрузим набор данных о цветах.

data, info = tfds.load("tf_flowers", as_supervised=True, with_info=True)
class_names = info.features["label"].names

У нас 5 сортов: [«одуванчик», «ромашка», «тюльпаны», «подсолнухи», «розы»].

Существует еще один полезный метод загрузки набора данных, если вы уже загрузили все изображения на свой ноутбук и отсортировали по подкаталогам и папкам по классам. Это будет полезно: keras.preprocessing.image.ImageDataGenerator ().

Разделить наши данные

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

tfds.load (‘tf_flowers’, split = ’train [10%: 15%]’, as_supervised = True)

Проверьте наши изображения

использование plt.show () для отображения изображений

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

CNN ожидает изображения с размером 224 * 224, поэтому мы должны предварительно обработать изображения. Нам также необходимо убедиться, что изображения следуют за входом Xception, поэтому мы используем методы Keras для обработки изображений. Если мы хотим увеличить изображения, мы также можем добавить сюда.

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

Теперь набор данных должен выглядеть так:

‹DatasetV1 Формы адаптера: ((Нет, 224, 224, 3), (Нет,)), типы: (tf.float32, tf.int64)›

Загрузите модель Xception, предварительно обученную в ImageNet, и добавьте наши слои поверх предварительно обученных слоев.

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

Здесь мы будем использовать модель Xception и установить «include_top = False», что позволяет нам добавлять наши слои поверх нее.

Мы добавляем наш глобальный средний уровень объединения и плотный выходной слой. Вот наша модель.

Первый этап: заблокируйте повторно используемые слои и подогнайте под модель

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

Теперь мы исправили повторно используемые слои и обучили наши верхние слои, установив «layer.trainable = False» на предварительно обученных слоях.

Вот что мы получили после этого пробега.

Epoch 1/5 29/29 [==============================] - 7s 242ms/step - loss: 2.5048 - accuracy: 0.6732 - val_loss: 2.1063 - val_accuracy: 0.7978 
Epoch 2/5 29/29 [==============================] - 5s 177ms/step - loss: 0.7831 - accuracy: 0.8834 - val_loss: 1.4425 - val_accuracy: 0.8251 
Epoch 3/5 29/29 [==============================] - 5s 175ms/step - loss: 0.2744 - accuracy: 0.9455 - val_loss: 1.5176 - val_accuracy: 0.8251 
Epoch 4/5 29/29 [==============================] - 5s 177ms/step - loss: 0.1209 - accuracy: 0.9673 - val_loss: 1.4471 - val_accuracy: 0.8033 Epoch 
5/5 29/29 [==============================] - 5s 178ms/step - loss: 0.0339 - accuracy: 0.9858 - val_loss: 1.4433 - val_accuracy: 0.8142

Затем мы освободим все слои для обучения и соответствия нашей модели.

Обучение нашей модели

Только запустив 5 эпох, мы получим следующий результат (0,89), что неплохо!

Epoch 1/5 29/29 [==============================] - 24s 823ms/step - loss: 0.4753 - accuracy: 0.8442 - val_loss: 1.1546 - val_accuracy: 0.8142 
Epoch 2/5 29/29 [==============================] - 22s 770ms/step - loss: 0.1064 - accuracy: 0.9651 - val_loss: 1.0553 - val_accuracy: 0.7869 
Epoch 3/5 29/29 [==============================] - 22s 771ms/step - loss: 0.0508 - accuracy: 0.9913 - val_loss: 0.4336 - val_accuracy: 0.8579 
Epoch 4/5 29/29 [==============================] - 22s 775ms/step - loss: 0.0184 - accuracy: 0.9967 - val_loss: 0.3591 - val_accuracy: 0.8798 
Epoch 5/5 29/29 [==============================] - 23s 777ms/step - loss: 0.0040 - accuracy: 0.9989 - val_loss: 0.3783 - val_accuracy: 0.8907

Без предварительно обученной модели нет трансферного обучения

Здесь мы также компилируем другую модель CNN без предварительно обученной модели.

Некоторые примечания для модели CNN здесь:

  1. 128 фильтров с размером ядра 2 * 2, шаг по умолчанию 1,1
  2. padding = «same», что означает, что размер / размеры вывода будут такими же, как ширина / высота ввода. Если установить его на «действительный», то заполнение нулями не будет, и некоторые строки и столбцы могут быть проигнорированы, что означает, что выходные размеры могут отличаться.
  3. Слои MaxPool2D: здесь мы указываем только 2, что означает размер pool_size = (2,2). Другие параметры по умолчанию: stridesis 1 * 1, padding = «valid».
  4. После сверточных слоев мы сглаживаем данные для ввода полносвязных слоев.
  5. Между плотными слоями мы добавляем коэффициент отсева на 0,5, что помогает решить проблему переобучения. (Но у нас все равно не может быть хорошего результата. Lol)

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

Epoch 1/40 29/29 [==============================] - 18s 610ms/step - loss: 2.2107 - accuracy: 0.2135 - val_loss: 1.6265 - val_accuracy: 0.2240 
Epoch 2/40 29/29 [==============================] - 17s 584ms/step - loss: 1.6482 - accuracy: 0.2810 - val_loss: 1.6282 - val_accuracy: 0.1967 
Epoch 3/40 29/29 [==============================] - 17s 571ms/step - loss: 1.5853 - accuracy: 0.3072 - val_loss: 1.6552 - val_accuracy: 0.1858 
Epoch 4/40 29/29 [==============================] - 17s 571ms/step - loss: 1.5047 - accuracy: 0.3301 - val_loss: 1.6727 - val_accuracy: 0.1530 
Epoch 5/40 29/29 [==============================] - 17s 578ms/step - loss: 1.4380 - accuracy: 0.3758 - val_loss: 1.7385 - val_accuracy: 0.2732 
Epoch 6/40 29/29 [==============================] - 17s 582ms/step - loss: 1.4039 - accuracy: 0.3769 - val_loss: 1.7463 - val_accuracy: 0.2732 
Epoch 7/40 29/29 [==============================] - 17s 580ms/step - loss: 1.3911 - accuracy: 0.3889 - val_loss: 1.6277 - val_accuracy: 0.1585 
Epoch 8/40 29/29 [==============================] - 17s 573ms/step - loss: 1.3336 - accuracy: 0.4357 - val_loss: 1.6387 - val_accuracy: 0.2732 
Epoch 9/40 29/29 [==============================] - 17s 577ms/step - loss: 1.3396 - accuracy: 0.4379 - val_loss: 1.7892 - val_accuracy: 0.2951 
Epoch 10/40 29/29 [==============================] - 17s 575ms/step - loss: 1.2900 - accuracy: 0.4488 - val_loss: 1.6484 - val_accuracy: 0.2732 
........
Epoch 31/40 29/29 [==============================] - 17s 573ms/step - loss: 0.9901 - accuracy: 0.6024 - val_loss: 2.0589 - val_accuracy: 0.4098 
Epoch 32/40 29/29 [==============================] - 17s 573ms/step - loss: 1.1296 - accuracy: 0.5153 - val_loss: 1.2954 - val_accuracy: 0.4481 
Epoch 33/40 29/29 [==============================] - 17s 574ms/step - loss: 0.9791 - accuracy: 0.5828 - val_loss: 1.0817 - val_accuracy: 0.5464 
Epoch 34/40 29/29 [==============================] - 17s 571ms/step - loss: 1.0512 - accuracy: 0.5577 - val_loss: 1.2549 - val_accuracy: 0.5246 
Epoch 35/40 29/29 [==============================] - 17s 573ms/step - loss: 0.9123 - accuracy: 0.6013 - val_loss: 1.1762 - val_accuracy: 0.5246 
Epoch 36/40 29/29 [==============================] - 17s 572ms/step - loss: 0.9523 - accuracy: 0.6231 - val_loss: 1.6186 - val_accuracy: 0.3169 
Epoch 37/40 29/29 [==============================] - 17s 572ms/step - loss: 0.9119 - accuracy: 0.6198 - val_loss: 1.1367 - val_accuracy: 0.5519 
Epoch 38/40 29/29 [==============================] - 17s 571ms/step - loss: 0.8403 - accuracy: 0.6438 - val_loss: 1.0139 - val_accuracy: 0.5246 
Epoch 39/40 29/29 [==============================] - 17s 571ms/step - loss: 0.8214 - accuracy: 0.6569 - val_loss: 1.0151 - val_accuracy: 0.5902 Epoch 40/40 29/29 [==============================] - 17s 573ms/step - loss: 0.7865 - accuracy: 0.6852 - val_loss: 1.1292 - val_accuracy: 0.590

Ссылка:

Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем, 2-е издание



Предыдущая статья: Обработка данных для машинного обучения с TensorFlow