gcloud ml-engine локальное предсказание --text-instance завершается с ошибкой Could not parse error

Я пытаюсь создать образец бостона тензорного потока (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/tutorials/input_fn) работает над google cloudml, и мне кажется, что обучение прошло успешно, но я не могу понять последующие прогнозы.

  1. Я настроил код, чтобы он соответствовал tf.contrib.learn.Experiment и learn_runner.run (). Он работает как локально, так и в облаке с "gcloud ml-engine local train ..." / "gcloud ml-engine jobs submit training ...".

  2. Я могу с помощью обученной модели запустить Estimator.predict (input_fn = pred_input_fn)) и получить значимые прогнозы с заданным набором boston_predict.csv.

  3. Я могу создать и версию модели в облаке с помощью "gcloud ml-engine models create ..." и "gcloud ml-engine versions create ..."

Но

  1. Локальные предсказания по «gcloud ml-engine local pred --model-dir = / export / Servo / XXX --text-instance boston_predict.csv» не выполняются с ошибкой «InvalidArgumentError (см. Выше для трассировки): не удалось проанализировать ввод примера‹. .> (Код ошибки: 2). Транскрипт см. Ниже. Аналогично происходит сбой при использовании файла boston_predict.csv без заголовка.

Я нашел ожидаемый формат с помощью "$ gcloud ml-engine local pred --help", прочтите https://cloud.google.com/ml-engine/docs/how-tos/troubleshooting, но в целом не удалось найти отчеты о моей конкретной ошибке через Google или stackexhange.

Я новичок, так что я, вероятно, в чем-то ошибаюсь, но не могу этого заметить.

Любая помощь приветствуется,

:-)

yarc68000.

-------среда----------

(env1) $ gcloud --version
Google Cloud SDK 170.0.0
alpha 2017.03.24
beta 2017.03.24
bq 2.0.25
core 2017.09.01
datalab 20170818
gcloud 
gsutil 4.27

(env1) $ python --version
Python 2.7.13 :: Anaconda 4.3.1 (64-bit)

(env1) $ conda list | grep tensorflow
tensorflow                1.3.0                     <pip>
tensorflow-tensorboard    0.1.6                     <pip>

------------ выполнение и ошибка: boston_predict.csv ----------

$ gcloud ml-engine local predict --model-dir=<..>/export/Servo/1504780684 --text-instances 1709boston/boston_predict.csv
<..>
ERROR:root:Exception during running the graph: Could not parse example input, value: 'CRIM,ZN,INDUS,NOX,RM,AGE,DIS,TAX,PTRATIO'
[[Node: ParseExample/ParseExample = ParseExample[Ndense=9, Nsparse=0, Tdense=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], dense_shapes=[[1], [1], [1], [1], [1], [1], [1], [1], [1]], sparse_types=[], _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_Placeholder_0_0, ParseExample/ParseExample/names, ParseExample/ParseExample/dense_keys_0, ParseExample/ParseExample/dense_keys_1, ParseExample/ParseExample/dense_keys_2, ParseExample/ParseExample/dense_keys_3, ParseExample/ParseExample/dense_keys_4, ParseExample/ParseExample/dense_keys_5, ParseExample/ParseExample/dense_keys_6, ParseExample/ParseExample/dense_keys_7, ParseExample/ParseExample/dense_keys_8, ParseExample/Const, ParseExample/Const_1, ParseExample/Const_2, ParseExample/Const_3, ParseExample/Const_4, ParseExample/Const_5, ParseExample/Const_6, ParseExample/Const_7, ParseExample/Const_8)]]
<..>

------- выполнение и ошибка без заголовка boston_predict.csv ------

(здесь я пробую с boston_predict.csv с опущенной первой строкой)

$ gcloud ml-engine local predict --model-dir=<..>/export/Servo/1504780684 --text-instances 1709boston/boston_predict_headerless.csv
<..>
ERROR:root:Exception during running the graph: Could not parse example input, value: '0.03359,75.0,2.95,0.428,7.024,15.8,5.4011,252,18.3'
[[Node: ParseExample/ParseExample = ParseExample[Ndense=9, Nsparse=0, Tdense=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], dense_shapes=[[1], [1], [1], [1], [1], [1], [1], [1], [1]], sparse_types=[], _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_Placeholder_0_0, ParseExample/ParseExample/names, ParseExample/ParseExample/dense_keys_0, ParseExample/ParseExample/dense_keys_1, ParseExample/ParseExample/dense_keys_2, ParseExample/ParseExample/dense_keys_3, ParseExample/ParseExample/dense_keys_4, ParseExample/ParseExample/dense_keys_5, ParseExample/ParseExample/dense_keys_6, ParseExample/ParseExample/dense_keys_7, ParseExample/ParseExample/dense_keys_8, ParseExample/Const, ParseExample/Const_1, ParseExample/Const_2, ParseExample/Const_3, ParseExample/Const_4, ParseExample/Const_5, ParseExample/Const_6, ParseExample/Const_7, ParseExample/Const_8)]]
<..>

person yarc68000    schedule 07.09.2017    source источник
comment
Вы не против поделиться своим кодом?   -  person rhaertel80    schedule 07.09.2017
comment
Последующий вопрос: собираетесь ли вы использовать модель для онлайн-прогнозов? Если это так, я бы рекомендовал использовать JSON в качестве входных данных.   -  person rhaertel80    schedule 07.09.2017


Ответы (1)


Вероятно, есть две проблемы.

Во-первых, похоже, что экспортируемый вами график ожидает tf.Example protos в качестве входных данных, т.е. имеет в нем операцию parse_example (...). Образец Бостона, похоже, не добавляет эту операцию, поэтому я подозреваю, что это часть ваших изменений.

Прежде чем показывать код, который вы хотите использовать для input_fn, нам нужно поговорить о второй проблеме: управлении версиями. Оценщики существовали в предыдущих версиях TensorFlow в файле tensorflow.contrib. Однако различные части были перенесены в tenorflow.estimator с последовательными версиями TensorFlow, и API-интерфейсы менялись по мере их перемещения.

CloudML Engine в настоящее время (по состоянию на 7 сентября 2017 г.) поддерживает только TF 1.0 и 1.2, поэтому я предоставлю решение, которое работает с 1.2. Это основано на выборке переписи. Это input_fn, который вам нужен для использования данных CSV, хотя я обычно рекомендую экспортировать модели, которые не зависят от формата ввода:

# Provides the data types for the various columns.
FEATURE_DEFAULTS=[[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0], [0.0]]

def predict_input_fn(rows_string_tensor):
  # Takes a rank-1 tensor and converts it into rank-2 tensor
  # Example if the data is ['csv,line,1', 'csv,line,2', ..] to
  # [['csv,line,1'], ['csv,line,2']] which after parsing will result in a
  # tuple of tensors: [['csv'], ['csv']], [['line'], ['line']], [[1], [2]]
  row_columns = tf.expand_dims(rows_string_tensor, -1)
  columns = tf.decode_csv(row_columns, record_defaults=FEATURE_DEFAULTS)
  features = dict(zip(FEATURES, columns))

  return tf.contrib.learn.InputFnOps(features, None, {'csv_row': csv_row})

И вам понадобится такая экспортная стратегия:

saved_model_export_utils.make_export_strategy(
    predict_input_fn,
    exports_to_keep=1,
    default_output_alternative_key=None,
)

который вы передадите как список размером 1 конструктору _ 3_.

person rhaertel80    schedule 07.09.2017
comment
Большой. Это сработало. Я все еще пытаюсь понять, почему. Для обучения я использую tf.estimator.inputs.pandas_input_fn () (из бостонского образца), который работает для ввода. Более абстрактно проблема, с которой я столкнулся, заключается в том, что этот вызов создает заполнители, которые привязаны к этому конкретному фрейму данных pandas, и что для прогнозирования мне нужен другой заполнитель ввода, который не зависит от обучающего ввода? Если это вообще имело смысл ... Если у вас есть URL-адрес, который лучше учит меня этой части, я благодарен. - person yarc68000; 08.09.2017
comment
К сожалению, я не знаю подходящего места, чтобы получить эту информацию. Я сделал заметку, чтобы информация была включена в документацию, хотя для этого может потребоваться некоторое время. Короче говоря, архитектура TF требует, чтобы вы построили два совершенно разных графика для обучения и прогнозирования. tf.estimator скрывает большую часть этих деталей (если вы напишете собственный оценщик, вы заметите, что вам нужно иметь дело с аргументом mode при построении графика), за исключением одного: input_fn. Во время обучения ввод обычно поступает из файлов, проходит через очереди и т. Д. Во время прогнозирования он просто подается. - person rhaertel80; 08.09.2017