Абстрактный

В этом блоге я собираюсь рассказать, как я использовал метод трансферного обучения, чтобы получить val_acc ≥ 0,88 с набором данных Cifar10, используя в качестве основы моей модели предварительно обученную модель плотноNet169 из приложения Keras с использованием весов, полученных в ImageNet. соревнование.

Введение

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

Таким образом, проблема, которую нужно решить здесь, заключается в том, чтобы получить val_acc ≥ 0,88 с использованием модели, но эта модель должна использовать технику трансферного обучения. Вот почему мы собираемся использовать одну из этих предварительных_моделей https://keras.io/api/applications/ Keras, в этом случае мы собираемся использовать DenseNet169, настроенную с весами модели, обученной с помощью ImageNet. набор данных, как только мы получим pre_model, мы должны выяснить, как мы можем реализовать это знание, чтобы создать новую модель, которая поможет нам классифицировать набор данных Cifar10, получив val_acc ≥ 0,88.

давайте посмотрим, как работает трансферное обучение.

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

Чтобы понять, как реализовать перенос обучения, мне необходимо иметь Знания:

  • Глубокие нейронные сети, сверточные нейронные сети.
  • слои, функции активации, веса, смещения, инициализаторы.
  • как обучать, компилировать, создавать модели в Keras.
  • Оптимизаторы по мере снижения скорости обучения, Adam, RMSprop, Momentum, batch_normalization, Mini_batch.
  • Регуляризаторы, такие как Dropout, ранняя остановка, L2, увеличение данных.

Материалы, которые мне пришлось использовать:

  • Керас, Тензорфлоу, Питон.
  • Гугл Колаб.

Различные тесты и методы, которые я использовал для этой задачи:

  1. Используйте выходные данные pre_model (прогноз) в качестве входных данных для новой модели.
  2. Fine Tuning - Заморозить всю pre_model.
  3. Обучить всю pre_model

Результаты

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

Итак, первое, что нужно сделать, это вызвать набор данных Cifar10.

Предварительный процесс cifar10

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

для методов 2, 3 и 4 мы используем только эту часть

В этом коде мы не используем часть изменения размера или pre_model, потому что она будет включена в новую модель.

Метод 1, вывод pre_model в качестве входных данных для новой модели

В этом методе мы собираемся использовать предсказание плотности сети169 с набором данных Cifar10, и эти выходные данные будут входными данными для новой модели, поэтому первым шагом является запуск предварительной обработки и получение xp_train, yp_train, xp_test и yp_train.

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

Итак, как только мы достигнем базовой структуры, мы должны увидеть, как ведет себя эта базовая структура, и если этого недостаточно, мы должны использовать эту структуру в качестве отправной точки, поэтому отсюда мы начнем тестировать разные вещи по порядку. для достижения 0,88 в val_acc.

Итак, мы собираемся начать с базовой структуры, но без изменения размера, просто с Cifar10 в том виде, в каком он есть.

Код находится здесь https://colab.research.google.com/drive/1tgoLCAKQSLAKkEZbIdg-2f03mG2JadkN?usp=sharing

Способ 2, обучение с полной заморозкой pre_model (тонкая настройка)

для методов 2 и 3 мы объединим pre_model внутри новой модели.

для методов 2, 3 и 4 мы объединим pre_model внутри новой модели.

Основными линиями здесь являются:

Эти линии будут разницей между методами 2, 3 и 4, в каждом методе мы будем реплицировать структуры, чтобы увидеть производительность алгоритмов.

вот код https://colab.research.google.com/drive/1TT9Ta2mmw9pyZYpRmhgRpH0ncn1ieGmF?usp=sharing

Метод 3, обучение с полностью обучаемой моделью pre_model

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

https://colab.research.google.com/drive/1S245SYHXVNOUWbLbPzmmE7qvFFYNf7-7?usp=sharing

Способ 4, половина pre_model замораживается, а другая обучается (индивидуальная настройка)

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

https://colab.research.google.com/drive/1DYUeYOQN8omzaju7uNH56uA6QMoEDbe6?usp=sharing

Обсуждение

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

  • Полностью обучаемый, вы можете подумать, что это не метод TF, но вы используете не случайную инициализацию весов, вы используете веса и смещение, обученные с набором данных ImageNet, в качестве отправной точки. Обучение этой модели заняло 4 часа.
  • Модель Freeze использует статические знания, поэтому вы можете использовать всю модель без обучения и использовать веса и смещения ImageNet для решения вашей новой задачи. Обучение этой модели заняло 35 минут.
  • Половина модели, вы используете только половину заморозки, а другая часть будет обновляться, пока происходит обучение. Обучение этой модели заняло 3 часа 25 минут.
  • Мне больше всего нравилось использовать предсказание pre_model, потому что обучение моей новой модели было намного быстрее, чем другие методы, потому что нужно было вызывать только мою новую модель, а не всю модель внутри pre_model. Обучение этой модели заняло 8 минут.

Выводы

  • в зависимости от информации, используемой для построения модели, для обучения модели потребуется большой или короткий период времени, это напрямую зависело от количества операций, которые модель будет выполнять во время обучения.
  • Метод Prediction быстрее, но потребляет много оперативной памяти.
  • Существуют разные методы TF, поэтому идея состоит в том, чтобы использовать знания из модели для решения другой задачи, поэтому вы можете использовать всю модель, половину, четверть, обучать ее, замораживать, использовать. предсказание.
  • Batch_normalization был одним из лучших оптимизаторов, конечно, он не работает для каждой модели, например, в пользовательском методе batch_normalization снижает производительность модели, между тем, для других методов этот оптимизатор был ключом к получению офигенности. Результаты.
  • Важно иметь опыт работы с оптимизаторами и регуляризаторами, потому что некоторые из них могут улучшить производительность конкретной модели, но в других моделях они могут ухудшить модель. например, есть такие случаи, как пользовательский метод, где вывод без какого-либо оптимизатора может иметь лучшую производительность.
  • Вы должны реализовать различные тесты, проверить различные структуры и методы, чтобы получить желаемую модель.

Цитированная литература и видео