gcloud ml-engine本地预测--text-instances失败,"无法解析"错误

时间:2017-09-07 11:22:54

标签: tensorflow gcloud google-cloud-ml-engine

我试图让张量流波士顿样本(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本地火车在本地和云端运行......" /" gcloud ml-engine工作提交培训......"。

  2. 我可以使用经过训练的模型运行estimator.predict(input_fn = predict_input_fn))并使用给定的boston_predict.csv集进行有意义的预测。

  3. 我可以使用" gcloud ml-engine模型在云中创建和修改模型......"和" gcloud ml-engine版本创建......"

  4. 但是

    1. 本地预测" gcloud ml-engine本地预测--model-dir = / export / Servo / XXX --text-instances boston_predict.csv"失败并出现" InvalidArgumentError(参见上面的回溯):无法解析示例输入< ..> (错误代码:2)。见下文的成绩单。它与无头的boston_predict.csv类似地失败。
    2. 我用" $ gcloud ml-engine local predict --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)]]
      <..>
      

1 个答案:

答案 0 :(得分:0)

可能有两个问题。

首先,看起来您正在导出的图表需要tf.Example protos作为输入,即其中有一个parse_example(...)op。波士顿样本似乎没有添加该操作,因此我怀疑这是您修改的一部分。

在显示input_fn所需的代码之前,我们需要讨论第二个问题:版本控制。估计器存在于tensorflow.contrib下的先前版本的TensorFlow中。但是,各个部分已经迁移到具有连续TensorFlow版本的tensorflow.estimator中,并且API已经移动了。

CloudML Engine目前(截至2017年9月7日)仅支持TF 1.0和1.2,因此我将提供适用于1.2的解决方案。这基于census sample。这是使用CSV数据所需的input_fn,尽管我通常建议导出独立于输入格式的模型:

# 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的列表传递给tf.contrib.learn.Experiment的构造函数。