Существует этот 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)}
Может ли кто-нибудь осветить меня:
Мой load_transformfn_in_tf
не так?Если да, что делать?
Почему TFTransformOutput
ведет себя так, ожидая данные ранга 1 в этом случае?