Использование keras.layers.Add () в последовательной модели - PullRequest
2 голосов
/ 21 марта 2019

Используя уровни вероятности TF 2.0 и TFP, я построил модель keras.sequential.Я хотел бы экспортировать его для обслуживания с помощью TensorFlow Serving, и Я бы хотел включить в предварительную обработку шаги предварительной и последующей обработки.

Мои этапы предварительной обработки довольно просты - заполнить NA явными значениями, кодировать несколько строк как плавающие, нормализовать входные данные и денормализовать выходные данные.Для обучения я делал предварительную / постобработку с пандами и numpy.

Я знаю, что могу экспортировать веса моей модели Keras, обернуть архитектуру модели keras.sequential в большой граф TensorFlow, использовать низкоуровневые операции, такие как tf.math.subtract(inputs, vector_of_feature_means), для выполнения операций до / пост-обработки, определить tf.placeholders для моих входов и выходов, и сделать исправным, но я чувствую, что должен быть более чистый способ сделать это .

Можно ли использовать keras.layers.Add() и keras.layers.Multiply() в модели keras.sequence для явных шагов предварительной обработки, или есть какой-то более стандартный способ сделать это?

1 Ответ

0 голосов
/ 02 мая 2019

Стандартный и эффективный способ сделать это, как я понимаю, использовать Tensorflow Transform.По сути это не означает, что мы должны использовать весь конвейер TFX, если нам нужно использовать TF Transform.TF-преобразование также можно использовать в качестве автономного.

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

  1. Устраняет перекос при обучении
  2. Устраняет необходимость наличия кода в системе обслуживания, что улучшает задержку.

Пример кода для преобразования TF приведен ниже:

Код для импорта всех зависимостей:

try:
  import tensorflow_transform as tft
  import apache_beam as beam
except ImportError:
  print('Installing TensorFlow Transform.  This will take a minute, ignore the warnings')
  !pip install -q tensorflow_transform
  print('Installing Apache Beam.  This will take a minute, ignore the warnings')
  !pip install -q apache_beam
  import tensorflow_transform as tft
  import apache_beam as beam

import tensorflow as tf
import tensorflow_transform.beam as tft_beam
from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import dataset_schema

Ниже упоминается функция предварительной обработки, гдемы упоминаем все преобразования.На данный момент TF Transform не предоставляет прямой API для вменения пропущенных значений.Таким образом, только для этого мы должны написать собственный код для этого с использованием низкоуровневых API.

def preprocessing_fn(inputs):
  """Preprocess input columns into transformed columns."""
  # Since we are modifying some features and leaving others unchanged, we
  # start by setting `outputs` to a copy of `inputs.
  outputs = inputs.copy()

  # Scale numeric columns to have range [0, 1].
  for key in NUMERIC_FEATURE_KEYS:
    outputs[key] = tft.scale_to_0_1(outputs[key])

  for key in OPTIONAL_NUMERIC_FEATURE_KEYS:
    # This is a SparseTensor because it is optional. Here we fill in a default
    # value when it is missing.
    dense = tf.sparse_to_dense(outputs[key].indices,
                               [outputs[key].dense_shape[0], 1],
                               outputs[key].values, default_value=0.)
    # Reshaping from a batch of vectors of size 1 to a batch to scalars.
    dense = tf.squeeze(dense, axis=1)
    outputs[key] = tft.scale_to_0_1(dense)

  # For all categorical columns except the label column, we generate a
  # vocabulary but do not modify the feature.  This vocabulary is instead
  # used in the trainer, by means of a feature column, to convert the feature
  # from a string to an integer id.
  for key in CATEGORICAL_FEATURE_KEYS:
    tft.vocabulary(inputs[key], vocab_filename=key)

  # For the label column we provide the mapping from string to index.
  table = tf.contrib.lookup.index_table_from_tensor(['>50K', '<=50K'])
  outputs[LABEL_KEY] = table.lookup(outputs[LABEL_KEY])

  return outputs

Вы можете обратиться по нижеприведенной ссылке для получения подробной информации и Учебника по TF Transform.

https://www.tensorflow.org/tfx/transform/get_started

https://www.tensorflow.org/tfx/tutorials/transform/census

...