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

TensorFlow имеет множество библиотек, таких как Keras, TFLearn и Sonnet, которые упрощают обучение моделей, а не использование функций нижнего уровня. В то время как API Keras внедряется напрямую в TensorFlow, TensorFlow сам предоставляет некоторые конструкции более высокого уровня, а некоторые новые были введены в последней версии 1.3. (Щелкните здесь, чтобы увидеть сообщение о том, как API изменилось в TensorFlow 1.8)

В этом блоге мы рассмотрим пример использования некоторых из этих новых высокоуровневых конструкций, включая Оценщик, Эксперимент и Набор данных. Также стоит отметить, что вы можете использовать эксперимент и набор данных отдельно. Я предполагаю, что вы знакомы с основами TensorFlow; в противном случае TensorFlow предоставляет отличные уроки.

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

Оценщик

Класс Оценщик представляет модель, а также то, как эту модель следует обучать и оценивать. Мы можем создать оценщик следующим образом:

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

  • параметры должны представлять собой набор гиперпараметров модели. Это может быть словарь, но мы представим его в этом примере как объект HParams, который действует как namedtuple.
  • Конфигурация указывает, как проводятся обучение и оценка, а также где хранить результаты. Эта конфигурация будет представлена ​​объектом RunConfig, который сообщает все, что необходимо знать оценщику о среде, в которой будет выполняться модель.
  • функция модели - это функция Python, которая строит модель на основе входных данных. (Подробнее об этом позже)

Функция модели

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

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

EstimatorSpec принимает на себя Операции прогнозирования, потерь, обучения и оценки, поэтому он определяет полный граф модели, используемый для обучения, оценки и вывода. Поскольку EstimatorSpec просто принимает обычные операции TensorFlow, мы можем использовать такие фреймворки, как TF-Slim, для определения нашей модели.

Эксперимент

Класс Experiment определяет, как обучать модель, и прекрасно интегрируется с оценщиком. Мы можем создать эксперимент следующим образом:

Эксперимент принимает в качестве входных данных:

  • Оценщик (например, тот, который мы определили выше).
  • Данные обучения и оценки как первоклассная функция. Здесь используется та же концепция, что и описанная ранее функция модели. Передав функцию вместо операции, можно воссоздать входной граф при необходимости. Мы поговорим об этом позже.
  • Тренировочные и оценочные крючки. Эти хуки можно использовать для сохранения или отслеживания определенных вещей или для настройки определенных операций в Graph или Session. Например, мы будем передавать операции, чтобы помочь инициализировать загрузчики данных (опять же, подробнее позже).
  • Различные параметры, описывающие, как долго нужно тренироваться и когда оценивать.

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

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

Набор данных

Мы будем использовать класс Dataset и соответствующий Iterator для представления наших данных обучения и оценки, а также для создания источников данных, которые перебирают данные во время обучения. . В этом примере мы будем использовать данные MNIST, доступные в Tensorflow, и построим вокруг них оболочку набора данных. Например, мы представим входные данные для обучения как:

Вызов этого get_train_inputs вернет первоклассную функцию, которая создает операции загрузки данных в графе TensorFlow вместе с хуком для инициализации итератора.

Данные MNIST, используемые в этом примере, изначально представлены как массив Numpy. Мы создаем тензор заполнитель, в который вводятся данные; мы используем заполнитель, чтобы избежать копирования данных. Затем мы создаем срезанный набор данных с помощью from_tensor_slices. Мы позаботимся о том, чтобы этот набор данных работал в течение бесконечного количества эпох (эксперимент может позаботиться об ограничении количества эпох), и что данные перетасовываются и помещаются в пакеты необходимого размера.

Чтобы перебрать данные, нам нужно создать итератор из набора данных. Поскольку мы используем заполнитель, нам необходимо инициализировать заполнитель в соответствующем сеансе данными NumPy. Мы можем сделать это, создав инициализируемый итератор. Мы создадим настраиваемый объект IteratorInitializerHook для инициализации итератора при создании графа:

IteratorInitializerHook наследуется от SessionRunHook. Этот обработчик вызовет after_create_session, как только будет создан соответствующий сеанс, и инициализирует заполнитель с правильными данными. Этот хук возвращается нашей функцией get_train_inputs и передается объекту Experiment при создании.

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

Запуск кода

Теперь, когда мы все определили, мы можем запустить код с помощью следующей команды:

python mnist_estimator.py --model_dir ./mnist_training --data_dir ./mnist_data

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

Обучение будет выводить информацию, такую ​​как глобальный шаг, потери и точность с течением времени, на выходе терминала. Помимо этого, фреймворк Experiment and Estimator будет регистрировать определенную статистику для визуализации с помощью TensorBoard. Если мы запустим:

tensorboard --logdir='./mnist_training'

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

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

Примечания к средам оценки, эксперимента и набора данных

Полный пример

Вывод на обученной модели

После обучения модели мы можем запустить Estimator.predict, чтобы предсказать класс данного изображения. В следующем примере кода показано, как это сделать.