Изменение состояний модели RNN с сохранением состояния Keras, слоев и методов после создания Оценщика - PullRequest
0 голосов
/ 11 января 2019

В чем преимущество использования tf.keras.estimator.model_to_estimator по сравнению с автономной моделью keras? Например, когда мы хотим обслуживать модель в реальном времени?

Давайте рассмотрим этот пример. У меня есть Keras RNN, модель stateful. Это означает, что когда для прогнозирования поступают живые данные, мне необходимо выполнить следующие шаги:

  1. Сброс состояния модели
  2. Установить состояния из нашего последнего прогноза для этого пользователя (если это старый пользователь)
  3. Запустите predict(x=x), а также сохраните состояния, рассчитанные для будущих прогнозов для этого пользователя.

В Керасе я делаю эти шаги, используя:

old_states = [state_h, state_c]
lstm_layer = model.get_layer('lstm')
lstm_layer.reset_states(states=old_states)
pred = model.predict(x=x)
new_states_to_save = [pred[1], pred[2]]

Однако, как можно сделать эту процедуру, используя оценщик? То есть на: tf.keras.estimator.model_to_estimator(model) объект?

Как получить доступ к отдельным слоям и как получить метод .reset_states()?

Модель

num_input = tf.keras.layers.Input(shape=(None, no_of_features), name='num_input', batch_size=1)
lstm, state_h, state_c = tf.keras.layers.LSTM(units=320,
                                            return_sequences=True,
                                            return_state=True,
                                            stateful=True,
                                            name='lstm')(num_input)

dense = tf.keras.layers.Dense(1, activation='sigmoid', name='main_output')(lstm_3)

model = tf.keras.models.Model(num_input, [dense, state_h, state_c])

Редактировать Оценочные слои enter image description here

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Несколько баллов о преимуществах tf.Estimator

В чем преимущество использования tf.keras.estimator.model_to_estimator по сравнению с автономной моделью keras? Например, когда мы хотим обслуживать модель в реальном времени?

Ну, я бы лучше добавил два цента вместо копирования документации:

  • Вы можете запускать модели на основе Estimator на локальном хосте или в распределенной многосерверной среде без изменения вашей модели. Кроме того, вы можете запускать модели на основе оценщика на процессорах, графических процессорах или TPU без перекодирования вашей модели.

Что ж, модели Keras могут работать на процессорах и графических процессорах "без перекодирования". Существует правда о распределенном обучении, если вам это нужно, может быть стоит пойти с tf.Estimator хлопотами. Более того, с приходом Tensorflow 2.0 я бы не стал так сильно рассчитывать на этот высокоуровневый API. Направление довольно ясное, и Tensorflow станет более ориентированным на Keras и PyTorch (с его tf.Eager высокоуровневым API, когда речь идет о втором фреймворке), tf.Estimator делает не совсем подходит под функциональный дизайн.

  • Оценщики упрощают совместное использование реализаций между разработчиками моделей.

Что я могу сказать, они не делают, просто посмотрите в Документы SavedModel . Используя tf.SavedModel, экспорт модели, созданной с помощью tf.Estimator, становится еще более увлекательным, просто чтобы вы поняли, насколько это «просто»:

feature_spec = {'foo': tf.FixedLenFeature(...),
                'bar': tf.VarLenFeature(...)}

def serving_input_receiver_fn():
  """An input receiver that expects a serialized tf.Example."""
  serialized_tf_example = tf.placeholder(dtype=tf.string,
                                         shape=[default_batch_size],
                                         name='input_example_tensor')
  receiver_tensors = {'examples': serialized_tf_example}
  features = tf.parse_example(serialized_tf_example, feature_spec)
  return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

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

  • Вы можете разработать современную модель с высокоуровневым интуитивно понятным кодом. Короче говоря, как правило, гораздо проще создавать модели с оценщиками, чем с низкоуровневыми API-интерфейсами TensorFlow.

Этот момент был рассмотрен, действительно, ts.Estimator более интуитивен, чем низкоуровневый Tensorflow, но я сомневаюсь, что это какой-то успех перед лицом tf.keras. Тем не менее, пропуская три различных режима, это бессмысленно функционально-ориентированный дизайн (+ все удовольствие от экспорта), я бы сказал, что это API среднего уровня (всегда хорошо иметь несколько API)

  • Оценщики сами построены на tf.keras.layers, что упрощает настройку.

Ну, это было tf.layers в 1,9 или 1,8, но это не рекомендуется, так что это когда дело доходит до хороших практик с Tensorflow в долгосрочной перспективе.

В целом: Я не особо увлекаюсь обслуживанием (не могу тратить свое время на следующий неинтуитивный код с именами, такими как tf.estimator.export.build_raw_serving_input_receiver_fn), но вам лучше избегать его, если возможно из-за плохого дизайна.

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

Доступ к отдельным слоям

Прежде всего: tf.Estimator не похоже на модели Keras!

Как получить доступ к отдельным слоям и как получить доступ к методу .reset_states ()?

Ну вот и начинается самое интересное. Вы должны получить свою модель в текущем сеансе (например, загрузка экспортирована tf.Estimator) и выполнить итерации по операциям на графике.

Схематически это выглядит примерно так:

with tf.Session() as session:
    # Of course, your tag can be different
    tf.saved_model.loader.load(session, 
                               tf.saved_model.tag_constants.SERVING, 
                               "/here/is/mymodel/exported/with/SavedModel")
    graph = tf.get_default_graph()
    # Here are all the layers of your tf.Estimator, sorted in the order they exist
    # At least they were two versions back
    operations = graph.get_operations()
    # https://www.tensorflow.org/api_docs/python/tf/contrib/framework/get_variables this should work...
    variables = tf.contrib.get_variables()

Что вы можете сделать с этими операциями? У них вполне читаемые имена, может быть, вы могли бы изменить их таким образом (и сбросить состояние rnn). Отметьте здесь после получения ваших опсов и переменных .

Хотя это далеко, так как я, к сожалению, не видел таких вариантов использования. Я думаю, что это как раз об этом, когда дело доходит до «упрощенной настройки».

Предсказания

Ну, немного проще (?), Вы просто загружаете график в сеанс после загрузки вашей модели, точно так же, как низкоуровневый Tensorflow:

output_names = "your_output_operation"
input_names = "your_input_operation"

with tf.Session() as session:

    # Of course, your tag can be different
    tf.saved_model.loader.load(session, 
                               tf.saved_model.tag_constants.SERVING, 
                               "/here/is/mymodel/exported/with/SavedModel")
    x = obtain_your_example_as_numpy_array()
    results = session.run(output_names, feed_dict={input_names: x})

Из того, что я помню, вы можете указать несколько выходных имен, это направление может быть жизнеспособным решением. Чтобы получить имена ввода и вывода, вы можете использовать SavedModel CLI или распечатать операции и получить те, которые определяют ввод. Обычно они называются как: input_1:0 (для объяснения соглашения об именах вы можете проверить this ) для ввода и predictions/Softmax:0 для выходов (если это мультиклассовая классификация). Имена выходных данных будут различаться в зависимости от спецификаций экспортированной модели, точного слоя и т. Д.

Надеюсь, этот пост поможет вам хоть немного

PS. Я думаю, что лучшее, что вы можете сделать, - это оставить tf.Estimator в покое, насколько мне известно, он непригоден для использования и выглядит как куча грязных хаков, собранных по кодам.

0 голосов
/ 16 января 2019

Как получить доступ к отдельным слоям и как получить доступ к методу .reset_states ()?

Оценщики сами по себе построены на tf.keras.layers, и именно так вы должны получить доступ к слоям.

API Estimator предоставляет высокоуровневый API поверх низкоуровневого базового API Tensorflow. Цель состоит в том, чтобы скрыть детали графиков и сеансов от конечного пользователя.


Почему существует tf.estimator?

  • Вы можете запускать модели на основе Estimator на локальном хосте или в распределенной многосерверной среде без изменения вашей модели. Кроме того, вы можете запускать модели на основе оценщика на процессорах, графических процессорах или TPU без перекодирования вашей модели.

  • Оценщики упрощают совместное использование реализаций между разработчиками моделей. Вы можете разработать современную модель с помощью интуитивно понятного кода высокого уровня. Короче говоря, как правило, гораздо проще создавать модели с оценщиками, чем с низкоуровневыми API TensorFlow.

  • Оценщики строят график для вас.

  • Оценщики обеспечивают безопасный распределенный цикл обучения, который контролирует, как и когда:

    • построение графика

    • инициализировать переменные

    • данные загрузки

    • обработка исключений

    • создание файлов контрольных точек и восстановление после сбоев

    • сохранение сводок для TensorBoard


Удобны Оценщик класса Детали.

...