Краткое руководство по бесценному инструменту глубокого обучения

Чтобы клонировать и выполнять упражнения, показанные в этой статье, просмотрите сопутствующую записную книжку на Kaggle.

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

Эксперимент

Обучение хорошей модели классификации изображений может быть особенно трудным, поэтому парадигма трансферного обучения обязательна для любого компетентного специалиста по глубокому обучению. В TensorFlow это проще всего сделать с помощью TensorFlow Hub. Чтобы увидеть, как модели трансферного обучения могут значительно ускорить ваш процесс обучения, мы построим две сверточные сети для классификации набора изображений; один с нуля, а другой с использованием упрощенной версии модели классификации изображений Начало 3, используемой для извлечения векторов признаков в качестве основы для нашего собственного классификатора изображений. Мы будем обучать каждую модель в течение 10 эпох и посмотрим, какая из них дает лучшие результаты. Для наших данных изображений мы будем использовать этот набор данных из Kaggle, содержащий помеченные изображения рыб.

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

Перед созданием наших моделей мы подготовим наши данные. Сначала нам нужно разделить наши данные на наборы для обучения и проверки. Для этого мы можем использовать библиотеку split-folders. Затем мы будем использовать класс ImageDataGenerator из пакета предварительной обработки в Keras для загрузки и применения преобразований, таких как масштабирование и увеличение, к нашим изображениям, не изменяя их на диске.

# Before running, make sure to pip install the split-folders package
import numpy as np 
import tensorflow as tf
import tensorflow_hub as hub # <--- To load our transfer learning model
from tensorflow.keras.preprocessing.image import ImageDataGeneratorimport splitfolders as sf

# Split the data 80/20 into training and validation sets. Save the split data in a folder called "fish".
sf.ratio("/a-large-scale-fish-dataset/NA_Fish_Dataset", ratio=(0.8, 0.2), output="fish", seed=42)

Далее мы настроим наши объекты ImageDataGenerator для загрузки и предварительной обработки наших прекрасных фотографий рыб. Мы используем отдельные генераторы для наших обучающих и проверочных данных, чтобы мы могли применять дополнение к нашему обучающему набору, оставляя наш проверочный набор нетронутым (кроме масштабирования для нормализации, конечно).

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=180,
    shear_range=0.3,
    width_shift_range=0.3,
    height_shift_range=0.3,
    zoom_range=0.3,
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode="nearest"
)
val_datagen = ImageDataGenerator(rescale=1./255)

# We then grab our data from their respective folders.
train_generator = train_datagen.flow_from_directory(
    "fish/train",
    target_size=(300, 300),
    class_mode="categorical"
)
val_generator = val_datagen.flow_from_directory(
    "fish/val",
    target_size=(300, 300),
    class_mode="categorical"
)

Создание моделей

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

control_model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(64, (3, 3), input_shape=(300, 300, 3)), 
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(128, (3, 3)), 
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(256, activation="relu"),
    tf.keras.layers.Dense(9, activation="softmax")
])
control_model.compile(
    optimizer="adam",
    loss="categorical_crossentropy",
    metrics=["acc"]
)
control_model.summary()

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

tl_model = tf.keras.Sequential([
    hub.KerasLayer("https://tfhub.dev/google/imagenet/inception_v3/feature_vector/5",
                   trainable=False),                 # Lock the layer from being updated during training  
    tf.keras.layers.Dense(256, activation="relu"),  # Same top layers as control
    tf.keras.layers.Dense(9, activation='softmax') 
])
tl_model.build([None, 300, 300, 3])
tl_model.compile(
    optimizer="adam",
    loss="categorical_crossentropy",
    metrics=["acc"]
)
tl_model.summary()

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

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

Теперь о моменте истины. Мы будем обучать каждую модель в течение 10 эпох и посмотрим, как каждая себя покажет.

control_model.fit(
    train_generator,
    epochs=10,
    validation_data=val_generator
)

Мы видим, что после 10 эпох наша контрольная модель едва достигает 20% точности проверки. Хотя на данном этапе не так уж много свидетельств переобучения, мы все еще намного ниже того, что большинство считает приемлемым уровнем точности. Давайте посмотрим, как работает наша экспериментальная модель.

tl_model.fit(
    train_generator,
    epochs=10,
    validation_data=val_generator
)

После всего лишь одной (!!) эпохи обучения наша модель трансферного обучения имеет почти вдвое большую точность проверки, чем точность, достигнутая нашей ручной моделью. Спустя всего 10 эпох новая модель имеет точность более 90% практически без признаков переобучения.

Вывод

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