ЗАЧЕМ ВАМ ДООБУЧЕНИЕ: как повысить точность ML-модели

автор рубрика ,
ЗАЧЕМ ВАМ ДООБУЧЕНИЕ: как повысить точность ML-модели

В предыдущей статье мы говорили об одном из методов Transfer Learning — выделении признаков. Сегодня продолжим разговор о трансферном обучении и затронем ещё один метод использования предварительно обученных архитектур — Fine Tuning (дообучение). Читайте далее, как замораживать и размораживать блоки моделей TensorFlow, а также как повысить точность модели, дообучив последние слои для решения задачи распознавания образов.

Fine Tuning что это

В отличие от feature extraction, суть дообучения (Fine Tuning) заключается в размораживании последних слоев нейронной сети (Neural Net) и их обучении. Таким образом, корректируются слои, которые имеют наиболее абстрактные представления. Производя дообучение только нескольких слоев, мы уменьшаем риск переобучения (overfitting). И самое главное, это позволяет сделать текущую модель ещё более подходящей к нашей задаче.

Если верхние слои следует дообучить, то полносвязные слои нужно заменить на свои и тоже обучить. Процедура Fine tuning состоит в следующем:

  1. Заморозить все слои предварительно обученной модели.
  2. Добавить свои слои к обученной модели.
  3. Обучить добавленные слои.
  4. Разморозить несколько верхних слоев.
  5. Обучить эти слои и добавленную часть вместе.

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

conv_base.trainable = False
model = models.Sequential([
    conv_base,
    layers.Flatten(),
    layers.Dense(256, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=2e-5),
              metrics=['acc'])

model.fit(
    train_generator,
    steps_per_epoch=100,
    epochs=30,
    validation_steps=50,
    validation_data=valid_generator)

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

Размораживание заданных слоев

Вызовом метода conv_base.summary() можно узнать название всех слоев, а также количество параметров. Мы разморозим только последний блок под номером 5, который содержит 3 сверточных слоя и слой Pooling. Пример кода на Python для замораживания все блоков сверточной основы архитектуры VGG16, кроме 5-го:

conv_base.trainable = True

set_trainable = False
for layer in conv_base.layers:
    if layer.name == 'block5_conv1':
        set_trainable = True
    if set_trainable:
        layer.trainable = True
    else:
        layer.trainable = False

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

Теперь можем приступить к 5-му шагу и обучить размороженный блок с полносвязным классификатором. Мы выбрали оптимизатор RMSProp с очень маленькой скоростью обучения (learning rate), чтобы ограничить размах изменений. Большие изменения повредят обученные локальные представления. Пример кода на Python для компиляция и обучения модели TensorFlow:

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=2e-5),
              metrics=['acc'])

log_dir = "logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = TensorBoard(log_dir=log_dir, histogram_freq=1)

model.fit(
    train_generator,
    steps_per_epoch=100,
    epochs=30,
    validation_steps=50,
    validation_data=valid_generator, 
    callbacks=[tensorboard_callback])

Также мы добавили в качестве обратного вызова инструмент визуализации TensorBoard. Инициализации TensorBoard в ipynb-блокноте или в Google Colab выглядит так:

%load_ext tensorboard
%tensorboard --logdir logs
Графики TensorBoard после дообучения (Fine tuning)
Точность и функция потерь (синие линии — валидационная выборка)

Таким образом, точность модели Machine Learning достигла 93% на валидационной выборке. Это лучше, чем использование только одного метода выделения признаков, обсуждаемого в прошлой статье.

 

О том, как применять Fine tuninng на реальных моделях Machine Learning, а также как производить обучение моделей TensorFlow, вы узнаете на нашем специализированном курсе «VISI: Computer Vision» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.

Источники
  1. https://www.tensorflow.org/api_docs/python/tf/keras/applications
Комментировать