Экспериментальный процесс

Абстрактный

В этой статье представлен экспериментальный процесс построения и обучения сверточной нейронной сети (CNN) для классификации изображений из набора данных CIFAR-10. Задача включает в себя использование преимуществ методов трансферного обучения с использованием предварительно обученных весов из приложений Keras, обученных на аналогичном наборе данных, таком как ImageNet. Этот подход включает в себя добавление пользовательских слоев поверх предварительно обученной модели и ее точную настройку для достижения высокой точности на похожем, но отличном наборе данных. В статье обсуждаются постановка задачи, использованные материалы и методы, полученные результаты и их последствия.

Введение

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

Стремительный прогресс в области машинного и глубокого обучения произвел революцию в области компьютерного зрения. В частности, классификация изображений достигла огромного прогресса с развитием сверточных нейронных сетей (CNN). Набор данных CIFAR-10, состоящий из 60 000 изображений размером 32x32 пикселя, разделенных на десять классов, представляет серьезную проблему для классификации из-за его разнообразного и сложного характера. Эта статья направлена ​​на решение этой проблемы с помощью методов трансферного обучения с использованием Keras, популярной библиотеки глубокого обучения Python.

Материалы и методы

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

Вот основные этапы нашего процесса (с кодом):

# Initial setup
from tensorflow import keras as K

# Load the pre-trained model with its weights from Keras applications.
base_model = K.applications.InceptionV3(
     include_top=False,
     weights="imagenet",
)
# Freeze base model
base_model.trainable = False

# Create input layer
inputs = K.Input(shape=(32, 32, 3))

# Resize images to match InceptionV3 input dimensions
resize = K.layers.Lambda(
  lambda image: tf.image.resize(image, (150, 150)))(inputs)

# Pass resized images to base model
inception = base_model(resize, training=False)

# Pooling layer
pool = K.layers.GlobalAveragePooling2D()(inception)

# Dropout layer for normalization
dropout = K.layers.Dropout(0.5)(pool)

# Flatten and 2 fully connected layers with batch normalization
flat = K.layers.Flatten()(dropout)
dense = K.layers.Dense(256, activation="relu")(flat)
batch = K.layers.BatchNormalization()(dense)
dropout2 = K.layers.Dropout(0.5)(batch)
dense2 = K.layers.Dense(128, activation="relu")(dropout2)
batch2 = K.layers.BatchNormalization()(dense2)
dropout3 = K.layers.Dropout(0.5)(batch2)

# Output layer
outputs = K.layers.Dense(10, activation="softmax")(dropout3)
# Create model
model = K.Model(inputs, outputs)

# Compile model
model.compile(
    optimizer=K.optimizers.Adam(),
    loss="categorical_crossentropy",
    metrics=["accuracy"],
)

# Train model
model.fit(
    X_train,
    Y_train,
    batch_size=32,
    epochs=10,
    validation_data=(X_valid, Y_valid),
)

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

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

# Unfreeze base model's layers
base_model.trainable = True

# Re-compile model with low learning rate
model.compile(
    optimizer=K.optimizers.Adam(learning_rate=1e-5),
    loss="categorical_crossentropy",
    metrics=["accuracy"],
)

# Train model
model.fit(
    X_train,
    Y_train,
    batch_size=32,
    epochs=10,
    validation_data=(X_valid, Y_valid),
)

Полученные результаты

После обучения модели с использованием предложенного нами подхода мы достигли точности проверки 85%. Стратегия трансфертного обучения в сочетании с тонкой настройкой предварительно обученной модели оказалась очень эффективной при извлечении соответствующих функций и фиксации основных закономерностей в наборе данных CIFAR-10. Результаты демонстрируют возможности использования предварительно обученных моделей для ускорения процесса обучения и достижения конкурентоспособных результатов.

Обсуждение

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

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

Вы можете ознакомиться с полным кодом и документацией по адресу:

https://github.com/blashernandez98/holbertonschool-machine_learning/tree/main/supervised_learning/transfer_learning