Как использовать tf.contrib.estimator.forward_features
Я пытаюсь использовать forward_features, чтобы получить ключи экземпляра для cloudml, но я всегда получаю ошибки, которые не знаю, как их исправить. Раздел предварительной обработки, в котором используется tf. Transform, является модификацией https://github.com/GoogleCloudPlatform/cloudml-samples/tree/master/reddit_tft где ключ экземпляра представляет собой строку, а все остальное представляет собой набор чисел с плавающей точкой.
def gzip_reader_fn():
return tf.TFRecordReader(options=tf.python_io.TFRecordOptions(
compression_type=tf.python_io.TFRecordCompressionType.GZIP))
def get_transformed_reader_input_fn(transformed_metadata,
transformed_data_paths,
batch_size,
mode):
"""Wrap the get input features function to provide the runtime arguments."""
return input_fn_maker.build_training_input_fn(
metadata=transformed_metadata,
file_pattern=(
transformed_data_paths[0] if len(transformed_data_paths) == 1
else transformed_data_paths),
training_batch_size=batch_size,
label_keys=[],
#feature_keys=FEATURE_COLUMNS,
#key_feature_name='example_id',
reader=gzip_reader_fn,
reader_num_threads=4,
queue_capacity=batch_size * 2,
randomize_input=(mode != tf.contrib.learn.ModeKeys.EVAL),
num_epochs=(1 if mode == tf.contrib.learn.ModeKeys.EVAL else None))
estimator = KMeansClustering(num_clusters=8,
initial_clusters=KMeansClustering.KMEANS_PLUS_PLUS_INIT,
kmeans_plus_plus_num_retries=32,
relative_tolerance=0.0001)
estimator = tf.contrib.estimator.forward_features(
estimator,
'example_id')
train_input_fn = get_transformed_reader_input_fn(
transformed_metadata, args.train_data_paths, args.batch_size,
tf.contrib.learn.ModeKeys.TRAIN)
estimator.train(input_fn=train_input_fn)
Если бы я должен был пройти в столбце ключей рядом с функциями обучения, то я получил бы ошибку Tensors in list passed to 'values' of 'ConcatV2' Op have types [float32, float32, string, float32, float32, float32, float32, float32, float32, f
loat32, float32, float32, float32, float32, float32, float32, float32, float32, float32, float32, float32, float32, float32, float32] that don't all match.
Однако, если бы я не передавал ключи экземпляра во время обучения, я получаю ошибку значения, говорящую, что ключ не существует в функциях. Кроме того, если бы я изменил имя ключевого столбца в разделе forward_features с 'example_id' на какое-то случайное имя, которое не является столбцом, то я все равно получаю первую ошибку вместо второй. Может ли кто-нибудь помочь мне разобраться в этом?
1 ответ
Пожалуйста, проверьте следующее:
(1) Функции пересылки работают только с TF.estimator. Убедитесь, что вы не используете contrib.learn.estimator. (обновление: вы используете класс, который наследуется от tf.estimator)
(2) Убедитесь, что ваша функция ввода читается в ключевой колонке. Таким образом, ключевой столбец должен быть частью вашего входного набора данных.
(3) В случае tf.transform #2 означает, что метаданные преобразования должны отражать схему ключа. Похоже, что сообщение об ошибке указывает на то, что схема определила его как число с плавающей точкой, и это на самом деле строка. Или что-то типа того.
(4) Убедитесь, что ключевой столбец НЕ используется вашей моделью. Таким образом, вы не должны создавать FeatureColumn с ним. Другими словами, модель будет просто проходить через ключ, который читается input_fn, предиктору.
(5) Если вы не видите ключ в выводе, посмотрите, поможет ли этот обходной путь:
По сути, forward_features изменяет график в памяти, но не экспортируемую подпись. Мой обходной путь исправляет это.