Есть вопрос? Присоединяйтесь к сообществу на форуме TensorFlow. Посетите форум.

Формат TF1 Hub

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

На этой странице объясняется, как использовать формат концентратора TF1 в 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 в 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 переменной среды 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() зависимостями цели в 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) чтобы его переменные можно было обучать, и импортируйте TensorFlow 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 в широких (т.е. разреженных линейных) или широких и глубоких моделях, вместо этого должна быть возможность использовать индивидуальные потери регуляризации.

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