Облачный движок Google: входные данные не в формате JSON - PullRequest
0 голосов
/ 24 августа 2018

Я использую Google Cloud ML Engine для онлайн-прогнозирования.Я написал код API Tensorflow Estimator, который ссылался на репозиторий tf-estimator-tutorials.Для онлайн-прогнозирования нам нужно экспортировать модель в файл прото-буфера (.pb).Чтобы служить функцией ввода для модели, я написал следующий код в функции serve_input_fn().

SERVING_HEADER = ['renancy','freq','monetary']
SERVING_HEADER_DEFAULTS = [[0.0],[0.0],[0.0]]

#shape=(?,), dtype=string
rows_string_tensor = tf.placeholder(dtype=tf.string,
                                    shape=[None],
                                    name="csv_rows")

#feeding rows_string_tensor value in the dictionary
receive_tensor = {'csv_rows':rows_string_tensor}

#shape=(?,1), dtype=string
row_columns = tf.expand_dims(rows_string_tensor, -1)

#<tf.Tensor 'DecodeCSV:0' shape=(?,1) dtype=float32>,<tf.Tensor 'DecodeCSV:1' shape=(?,1) dtype=float32>
#<tf.Tensor 'DecodeCSV:2' shape=(?,1) dtype=float32>
columns = tf.decode_csv(row_columns, record_defaults=SERVING_HEADER_DEFAULTS)

#<tf.Tensor 'Expand_dims_1:0' shape=(?,1,1) dtype=float32>,<tf.Tensor 'Expand_dims_2:0' shape=(?,1,1) dtype=float32>
#<tf.Tensor 'Expand_dims_3:0' shape=(?,1,1) dtype=float32>
columns = [tf.expand_dims(tensor, -1) for tensor in columns]

#{"renancy":<tf.Tensor 'Expand_dims_1:0' shape=(?,1,1) dtype=float32>,
#"freq":<tf.Tensor 'Expand_dims_2:0' shape=(?,1,1) dtype=float32> 
#"monetary":<tf.Tensor 'Expand_dims_1:0' shape=(?,1,1) dtype=float32>}
features = dict(zip(SERVING_HEADER, columns))


#InputFnOps(features=None, labels=None, default_inputs={'csv_rows':<tf.Tensor 'csv_rows:0' shape=(?,) dtype=string>})
return tf.contrib.learn.InputFnOps(
    process_features(features),
    None,
    receive_tensor
)

Я развернул модель в облаке ML.Теперь я должен сделать онлайн-прогнозирование. Для этого gcloud ml-engine predict --model-dir=<model_name> --version <version> --json-instances=test.json --project <project_name>

Когда я запускаю указанную выше команду, она показывает следующую ошибку

{"error": "Prediction fail:Ошибка во время выполнения модели: AbortionError (code = StatusCode.INVALID_ARGUMENT, details = \ "NodeDef упоминает, что attr 'select_cols' отсутствует в выводе Op :; attr = OUT_TYPE: список (тип), min = 1, разрешено = [DT_FLOAT, DT_DOUBLE, DT_INT32, DT_INT64, DT_STRING]; attr = field_delim: string, default = \ ", \"; attr = use_quote_delim: bool, default = true; attr = na_value: string, default = \ "\">; NodeDef: DecodeCSV = DecodeCSV [OUT_TYPE = [DT_FLOAT, DT_FLOAT, DT_FLOAT], _output_shapes = [[?, 1], [?, 1], [?, 1]], field_delim = \ ", \", na_value = \ "\", select_cols = [], use_quote_delim = true, _device = \ "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0 \"] (ExpandDims, DecodeCSV / record_defaults_0, DecodeCSV / record_defaults_0, DecodeCSV / record_defaults_0). (Проверьте, есть ливаш двоичный файл, интерпретирующий GraphDef, соответствует вашему двоичному файлу, генерирующему GraphDef.). \ n \ t [[Узел: DecodeCSV = DecodeCSV [OUT_TYPE = [DT_FLOAT, DT_FLOAT, DT_FLOAT], _output_shapes = [[?, 1], [?, 1], [?, 1]], field_delim = \ ", \", na_value = \ "\", select_cols = [], use_quote_delim = true, _device = \ "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0 \"] (ExpandDims, DecodeCSV / record_de ... TRUNCATED \ ")"}

Я знаю, tf.contrib.learn.InputFnOps устарела, но все еще из любопытства. Интересно, есть ли способ сделать прогноз?Мои test.json данные выглядят так

       {"csv_rows":"7.0,8.0,7.0"}
       {"csv_rows":"5.0,6.0,4.0"}

Я обучил модель, используя эти данные Набор данных поезда .

1 Ответ

0 голосов
/ 25 августа 2018

Ваш test.json должен иметь ровно один экземпляр на строку. В вашем коде вы читаете csv_rows как строку и декодируете ее как CSV, так что именно этого ожидает ваш код в test.json:

{"csv_rows":"7.0,8.0,7.0"}
{"csv_rows":"5.0,6.0,4.0"}

Если вы хотите предоставить:

{"renancy":"9.0","freq":"3.0","monetary":"5.0"}
{"renancy":"5.0","freq":"6.0","monetary":"4.0"}

Затем ваш код обслуживания должен измениться на:

def serving_input_fn():
    feature_placeholders = {
        'renancy': tf.placeholder(tf.float32, [None]),
        'freq': tf.placeholder(tf.float32, [None]),
        'monetary': tf.placeholder(tf.float32, [None])
    }
    features = features_placeholders
    return tf.estimator.export.ServingInputReceiver(features, feature_placeholders)
...