Повторно использовать тензор потока transformfn, используя simple_example.py - PullRequest
0 голосов
/ 06 июня 2019

Существует этот simple_example.py , который преобразует данные, используя tensorflow_transform, внутри Beam .

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import pprint
import tempfile

# GOOGLE-INITIALIZATION

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


    def main():
      def preprocessing_fn(inputs):
        """Preprocess input columns into transformed columns."""
        x = inputs['x']
        y = inputs['y']
        s = inputs['s']
        x_centered = x - tft.mean(x)
        y_normalized = tft.scale_to_0_1(y)
        s_integerized = tft.compute_and_apply_vocabulary(s)
        x_centered_times_y_normalized = (x_centered * y_normalized)
        return {
            'x_centered': x_centered,
            'y_normalized': y_normalized,
            'x_centered_times_y_normalized': x_centered_times_y_normalized,
            's_integerized': s_integerized
        }

      raw_data = [
          {'x': 1, 'y': 1, 's': 'hello'},
          {'x': 2, 'y': 2, 's': 'world'},
          {'x': 3, 'y': 3, 's': 'hello'}
      ]

      raw_data_metadata = dataset_metadata.DatasetMetadata(
          dataset_schema.from_feature_spec({
              's': tf.io.FixedLenFeature([], tf.string),
              'y': tf.io.FixedLenFeature([], tf.float32),
              'x': tf.io.FixedLenFeature([], tf.float32),
          }))

      with tft_beam.Context(temp_dir=tempfile.mkdtemp()):
        transformed_dataset, transform_fn = (  # pylint: disable=unused-variable
            (raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
                preprocessing_fn))

      transformed_data, transformed_metadata = transformed_dataset  # pylint: disable=unused-variable

      # Save transform_fn, to be reused later
      transform_fn | 'transform_fn' >> tft_beam.WriteTransformFn("transform_fn/")

      pprint.pprint(transformed_data)

Обратите внимание, что форма всех 3-х элементов [], скаляр, ранг 0.

Вывод transformed_data:

[{u's_integerized': 0,
  u'x_centered': -1.0,
  u'x_centered_times_y_normalized': -0.0,
  u'y_normalized': 0.0},
 {u's_integerized': 1,
  u'x_centered': 0.0,
  u'x_centered_times_y_normalized': 0.0,
  u'y_normalized': 0.5},
 {u's_integerized': 0,
  u'x_centered': 1.0,
  u'x_centered_times_y_normalized': 1.0,
  u'y_normalized': 1.0}]

Мы хотим повторно использовать transform_fn в тензорном потоке , чтобы применить его к каждому элементу:

def load_transformfn_in_tf():
    raw_data = [
        {'x': 10, 'y': 11, 's': 'hello'},
        {'x': 20, 'y': 22, 's': 'world'},
    ]

    features = {
        "s": tf.placeholder(shape=[], dtype=tf.string),
        "y": tf.placeholder(shape=[], dtype=tf.float32),
        "x": tf.placeholder(shape=[], dtype=tf.float32),
    }

    tf_transform_output = tft.TFTransformOutput('./transform_fn/')
    transformed_features = tf_transform_output.transform_raw_features(features)

    with tf.Session() as sess:
        sess.run(tf.tables_initializer())

        for raw_data_ex in raw_data:
            feed_dict = {
                features["s"]: raw_data_ex["s"],
                features["y"]: raw_data_ex["y"],
                features["x"]: raw_data_ex["x"]
            }
            pprint.pprint(sess.run(transformed_features, feed_dict=feed_dict))

Обратите внимание, я использую одну и ту же форму [] с рангом 0.

А затем выдает ошибку:

ValueError: Node 'transform/transform/inputs/inputs/y_copy' has an _output_shapes attribute inconsistent with the GraphDef for output #0: Shapes must be equal rank, but are 0 and 1

Чтобы этот пример работал, я изменил форму данных на [None], ранг вектора 1:

raw_data = [
    {'x': [10], 'y': [11], 's': ['hello']},
    {'x': [20], 'y': [22], 's': ['world']},
]

features = {
    "s": tf.placeholder(shape=[None], dtype=tf.string),
    "y": tf.placeholder(shape=[None], dtype=tf.float32),
    "x": tf.placeholder(shape=[None], dtype=tf.float32),
}

Где вывод имеет, ожидаемая векторная форма [1].

{u's_integerized': array([0]),
 u'x_centered': array([8.], dtype=float32),
 u'x_centered_times_y_normalized': array([40.], dtype=float32),
 u'y_normalized': array([5.], dtype=float32)}
{u's_integerized': array([1]),
 u'x_centered': array([18.], dtype=float32),
 u'x_centered_times_y_normalized': array([189.], dtype=float32),
 u'y_normalized': array([10.5], dtype=float32)}

Может ли кто-нибудь осветить меня:

  1. Мой load_transformfn_in_tf не так?Если да, что делать?

  2. Почему TFTransformOutput ведет себя так, ожидая данные ранга 1 в этом случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...