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

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

Трансферное обучение может:

  • Может обучать модель с меньшим набором данных,
  • Улучшает обобщение,
  • Ускоряет обучение.

Обучение модели с использованием трансферного обучения может занять от 40 минут до 1 часа (в зависимости от набора обучающих данных) процессорного времени на обычном ноутбуке по сравнению с часами графического процессора, если он построен с нуля.

В этом руководстве мы будем использовать предварительно обученную модель inception-v3 для создания классификатора пород собак, который будет обучен на стандартном наборе данных о породах собак (набор данных содержит изображения 120 различных пород со всего мира, всего 20580 изображений)

Объяснение модели inception-v3 не входит в задачу этой статьи, если интересно, вы можете прочитать о ней здесь.

Прочитать статью о создании

Мы будем использовать сценарий переобучения (это часть примера примера тензорного потока) для переобучения модели.

Что такое retrain.py

Скрипт retrain используется для переобучения модели (модели по умолчанию inceptionv3 или мобильной сети и т. д.) с вашим собственным набором обучающих данных. По умолчанию он использует векторы признаков, вычисленные исходной моделью v3.

Некоторые из важных параметров, которые можно использовать для настройки модели:

1. - image_dir: путь к отмеченным изображениям. Так будет выглядеть каталог изображений. Имена папок здесь важны, поскольку они используются в качестве меток для каждого изображения внутри них (хотя имя файла изображения не имеет значения)

2. - output_graph: путь для сохранения вывода, т.е. обученного графа. По умолчанию они сохраняются в каталоге tmp в корневой папке.

3. - intermediate_output_graphs_dir: путь для сохранения промежуточных графиков

4. - Intermediate_store_frequency: количество шагов для хранения промежуточного графа.

5. - output_labels: путь для хранения метки выхода (в этом случае метки будут названиями породы)

6. - summaries_dir: используется для визуализации графиков и гистограмм с использованием тензорной доски. Tensorboard - это инструмент для визуализации графиков обучения, обучения и показателей ошибок.

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

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

8. - Learning_rate: скорость обучения модели. Значение по умолчанию - 0,01. Подразумевается, что уменьшение скорости увеличит время, затрачиваемое на тренировочный процесс.

9. - testing_percentage: какая часть обучающего набора будет использоваться в качестве тестового набора.

10. - validation_percentage: какая часть обучающего набора будет использоваться в качестве набора проверки.

11. - eval_step_interval: интервал, в котором оценивается результат обучения

12. - train_batch_size: количество изображений для тренировки в заданной точке. по умолчанию - 100, но это можно изменить в зависимости от вычислительной мощности.

13. - test_batch_size: количество изображений для тестирования в данный момент времени

14. - validation_batch_size: не требует пояснений

15. - bottleneck_dir: каталог для хранения значений узких мест. Мы рассмотрим узкие места позже в этом посте.

16. - final_tensor_name: это имя последнего выходного слоя на графике.

17. - tfhub_module: какой модуль тензорного потока использовать. по умолчанию он использует начальную модель v3, но ее можно изменить в зависимости от варианта использования.

18. - saved_model_dir: каталог для сохранения обученной модели.

Некоторые из параметров, таких как (- random_brightness и т. Д.), Которые здесь не упоминались, в основном используются для настройки набора обучающих данных для обучения модели в различных сценариях, таких как изображение с меньшей яркостью или обрезанное изображение.

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

1. Creates a list of training images (this uses the test and validation % flag ie how much part of training dataset to be used as test set and validation set)
2. Uses TensorFlow hub to fetch the pre-trained model. By default it uses the inception v3 model features to train the model. 
3. After fetching the pre-trained model, it adds a new layer which is used for training on the new dataset.
4. Applies distortion to the images if any (ie if rotation, or background flag has been set)
5. Calculates bottleneck values for each image layer and caches them. (bottleneck has been explained in detail below)
6. Feeds the bottleneck values to the session and starts the training step.
7. Runs evaluation on validation and test set, and saves the model

Звучит просто, не правда ли?

Мы столкнулись с некоторыми новыми терминами TensorFlow hub и узким местом, давайте проверим, что они означают

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

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

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

# run the retrain script and pass the training image directory. For simplicity, we will not be using other parameters as of now.
python retrain.py --image_dir Images

После завершения (что может занять примерно 40–45 минут в зависимости от устройства, используемого для обучения), повторно обученная модель будет сохранена в указанном каталоге (по умолчанию \ tmp). На этом шаге создается обученная модель, которую можно использовать для классификации изображений (в нашем случае - породы собак).

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

Вы знаете, к какой породе относится собака? Нет ? Тогда спросим модель?

# test the model on a given image
# label_image is a simple script to load the image, and to read the tensor from the given file (https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py)
python label_image.py \
--graph=output_graph.pb \
--labels=output_labels.txt \
--input_layer=Placeholder \
--output_layer=final_result \
--image=dog.jpg

Wohooo !! Вы быстро создали классификатор пород собак :)

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

Пример Github для справки

Когда использовать трансферное обучение?

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

Почему низкая точность?

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

Ссылки

Https://www.tensorflow.org/hub/
https://www.tensorflow.org/hub/tutorials/image_retraining
https://arxiv.org/abs/ 1512.00567

Первоначально опубликовано на www.anirudhramanan.com 23 сентября 2018 г.