【发布时间】:2019-01-30 22:00:29
【问题描述】:
我正在使用 Google Cloud ML Engine 进行在线预测。我编写了从 tf-estimator-tutorials 存储库中引用的 Tensorflow Estimator API 代码。要进行在线预测,我们需要将模型导出到 proto 缓冲区文件 (.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": "预测失败:模型执行期间出错:AbortionError(code=StatusCode.INVALID_ARGUMENT, details=\"NodeDef 提到 attr 'select_cols' 不在 Op 输出中:; attr=OUT_TYPE:list(type),min=1, allowed=[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 [[Node: DecodeCSV = DecodeCSV[OUT_TYPE=[DT_FLOAT, DT_FLOAT, DT_FLOAT], _output_shapes= [[?,1], [?,1], [?,1]], field_delim=\",\", na_value=\"\", select_cols=[], use_quote_deli m=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"}
我已经使用此数据Train dataset 训练了模型。
【问题讨论】:
标签: python tensorflow google-cloud-platform google-cloud-ml