Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Формат TF1 Hub

При запуске в 2018 году TensorFlow Hub предложил один тип ресурса: формат TF1 Hub для импорта в программы TensorFlow 1.

На этой странице объясняется, как использовать формат TF1 Hub в TF1 (или режим совместимости TF1 в TF2) с классом hub.Module и связанными API. (Типичное использование - создание tf.Graph , возможно, в Estimator TF1, путем объединения одной или нескольких моделей в формате TF1 Hub с tf.compat.layers или tf.layers ).

Пользователи TensorFlow 2 (вне режима совместимости с TF1) должны использовать новый API с hub.load() или hub.KerasLayer . Новый API загружает новый тип ресурса TF2 SavedModel, но также имеет ограниченную поддержку для загрузки формата TF1 Hub в TF2 .

Использование модели в формате TF1 Hub

Создание модели в формате TF1 Hub

Модель в формате TF1 Hub импортируется в программу hub.Module путем создания объекта hub.Module из строки с ее URL-адресом или путем к файловой системе, например:

 m = hub.Module("path/to/a/module_dir")
 

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

Модули кеширования

При создании модуля из URL-адреса содержимое модуля загружается и кэшируется во временный каталог локальной системы. Местоположение, где модули кэшируются, может быть переопределено с TFHUB_CACHE_DIR переменной среды TFHUB_CACHE_DIR . Подробности смотрите в разделе Кэширование .

Применение модуля

После создания экземпляр модуля m можно назвать ноль или более раз, как функцию Python, от тензорных входов до тензорных выходов:

 y = m(x)
 

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

Модули могут определять несколько именованных сигнатур , чтобы их можно было применять более чем одним способом (аналогично тому, как объекты Python имеют методы ). Документация модуля должна содержать описание доступных подписей. Вызов выше применяет подпись с именем "default" . Любая подпись может быть выбрана путем передачи ее имени в необязательный аргумент signature= .

Если у подписи есть несколько входов, они должны быть переданы как dict с ключами, определенными подписью. Аналогично, если подпись имеет несколько выходов, они могут быть извлечены как dict, передав as_dict=True под ключами, определенными подписью (ключ "default" для одиночного вывода, возвращаемого, если as_dict=False ). Таким образом, наиболее общая форма применения модуля выглядит следующим образом:

 outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]
 

Вызывающая сторона должна предоставить все входы, определенные подписью, но нет необходимости использовать все выходы модуля. TensorFlow будет запускать только те части модуля, которые заканчиваются как зависимости цели в tf.Session.run() . Действительно, издатели модулей могут выбрать различные выходные данные для расширенного использования (например, активации промежуточных уровней) вместе с основными выходными данными. Потребители модуля должны корректно обрабатывать дополнительные результаты.

Опробовать альтернативные модули

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

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

Создание нового модуля

Примечание о совместимости

Формат TF1 Hub ориентирован на TensorFlow 1. Он только частично поддерживается TF Hub в TensorFlow 2. Вместо этого рассмотрите возможность публикации в новом формате TF2 SavedModel .

Формат TF1 Hub похож на формат SavedModel TensorFlow 1 на синтаксическом уровне (те же имена файлов и протокольные сообщения), но семантически отличается, чтобы обеспечить возможность повторного использования модуля, его компоновки и повторного обучения (например, разное хранение инициализаторов ресурсов, разное тегирование условные обозначения для мета графов). Самый простой способ различить их на диске - это наличие или отсутствие файла tfhub_module.pb .

Основной подход

Чтобы определить новый модуль, издатель вызывает hub.create_module_spec() с функцией module_fn . Эта функция создает график, представляющий внутреннюю структуру модуля, используя tf.placeholder() для входных данных, предоставляемых вызывающей стороной. Затем он определяет сигнатуры, вызывая hub.add_signature(name, inputs, outputs) один или несколько раз.

Например:

 def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)
 

Результат hub.create_module_spec() можно использовать вместо пути для создания экземпляра объекта модуля в определенном графе TensorFlow. В этом случае контрольной точки нет, и экземпляр модуля будет использовать вместо нее инициализаторы переменных.

Любой экземпляр модуля может быть сериализован на диск с помощью метода export(path, session) . Экспорт модуля сериализует его определение вместе с текущим состоянием его переменных в session в переданный путь. Это можно использовать при первом экспорте модуля, а также при экспорте модуля с точной настройкой.

Для совместимости с оценщиками hub.LatestModuleExporter , hub.LatestModuleExporter экспортирует модули из последней контрольной точки, так же, как tf.estimator.LatestExporter экспортирует всю модель из последней контрольной точки.

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

Реальный пример

Взгляните на наш экспортер модуля встраивания текста для реального примера того, как создать модуль из общего формата встраивания текста.

Тонкая настройка

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

Для потребителей

Чтобы включить тонкую настройку, hub.Module(..., trainable=True) экземпляр модуля с помощью hub.Module(..., trainable=True) чтобы сделать его переменные обучаемыми, и импортируйте REGULARIZATION_LOSSES из REGULARIZATION_LOSSES . Если в модуле несколько вариантов графиков, обязательно выберите тот, который подходит для обучения. Обычно это теги {"train"} .

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

Для издателей

Чтобы упростить настройку для потребителей, обратите внимание на следующее:

  • Точная настройка требует регуляризации. Ваш модуль экспортируется с REGULARIZATION_LOSSES коллекции, которая является тем, что ставит ваш выбор tf.layers.dense(..., kernel_regularizer=...) и т.д. в то , что потребитель получает от tf.losses.get_regularization_losses() . Предпочитаю этот способ определения потерь регуляризации L1 / L2.

  • В модели издателя избегайте определения регуляризации L1 / L2 с помощью параметров l1_ и l2_regularization_strength в tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer и других проксимальных оптимизаторах. Они не экспортируются вместе с модулем, и настройка сильных сторон регуляризации может не подходить для потребителя. За исключением регуляризации L1 в широкой (то есть в разреженной линейной) или широкой и глубокой моделях, должна быть возможность использовать вместо этого отдельные потери регуляризации.

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