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

Введение

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

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

Что такое трансферное обучение и зачем оно нам нужно?

Первый вопрос, который приходит на ум, — почему мы не можем обучать наши модели каждый раз? Зачем нам нужен этот тип обучения?

Проблема с обучением собственной модели:

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

Именно здесь в игру вступает использование предварительно обученной модели. Такие модели, как VGGNet, ResNet, Xception, очень эффективно обучаются на достаточно больших и размеченных данных и могут быть интегрированы в нашу задачу путем точной настройки под нашу конкретную задачу.

По словам Эндрю Нг, если не принимать во внимание обучение с учителем, трансферное обучение может стать следующим большим событием в области машинного обучения.

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

Не изобретайте велосипед, а создавайте автомобили.

Как это работает?

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

Чтобы использовать трансферное обучение, мы обычно выполняем следующие шаги:

1. Выберите предварительно обученную модель:

Первым шагом является выбор предварительно обученной модели, которая была обучена на большом наборе данных. К популярным предварительно обученным моделям относятся VGG, ResNet, Inception и MobileNet.

2. Удалите последние слои:

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

3. Добавьте новые слои:

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

4. Настройте модель:

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

Давайте разберем все, что мы узнали, на примере и посмотрим, как реализовать это в коде.

В приведенном ниже примере мы используем VGG-16, которая представляет собой предварительно обученную модель CNN, разработанную группой визуальной геометрии в Оксфордский университет. Он состоит из 16 сверточных слоев и 3 полносвязных слоев с более 138 миллионами параметров.

#Installing dependencies
import numpy as np
import pandas as pd
import tensorflow as tf
from keras.layers import Dense, Flatten, Dropout
from keras.models import Sequential
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.vgg16 import VGG16

В этом примере мы используем VGG-16 для создания классификатора собак и кошек, и я использовал для этого набор данных из kaggle. Вы можете проверить это здесь.

# Define paths to the train and validation datasets
train_path = '/content/train'
valid_path = '/content/test'

# Define image size, batch size, and number of classes
img_size = 224
batch_size = 32
num_classes = 2

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

# Define data generators for training and validation data
train_datagen = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(
    train_path,
    target_size=(img_size, img_size),
    batch_size=batch_size,
    class_mode='categorical')

valid_datagen = ImageDataGenerator(rescale=1./255)
valid_generator = valid_datagen.flow_from_directory(
    valid_path,
    target_size=(img_size, img_size),
    batch_size=batch_size,
    class_mode='categorical')

Теперь, когда мы закончили с битом данных, мы можем продолжить и загрузить модель VGG-16 с помощью функции VGG16 из Keras и заморозить ее слои до предотвратить их обучение. Затем мы добавляем пользовательский выходной слой поверх модели VGG16, используя класс Sequential из Keras.

# Load the VGG16 model and freeze its layers
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(img_size, img_size, 3))
for layer in base_model.layers:
    layer.trainable = False

# Add a custom output layer on top of the VGG16 model
model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

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

# Compile the model with an optimizer, loss function, and evaluation metric
model.compile(optimizer=Adam(lr=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])

# Train the model using the data generators
history = model.fit(train_generator, epochs=10, validation_data=valid_generator)

# Evaluate the model on the validation data
loss, accuracy = model.evaluate(valid_generator)
print(f'Validation loss: {loss}, validation accuracy: {accuracy}')

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

#accuracy plot

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'],color='red',label='train')
plt.plot(history.history['val_accuracy'],color='blue',label='validation')
plt.legend()
plt.show()

#Loss Plot

plt.plot(history.history['loss'],color='red',label='train')
plt.plot(history.history['val_loss'],color='blue',label='validation')
plt.legend()
plt.show()

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

Заключение

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

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

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

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

Заключительные мысли и заключительные комментарии

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

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