Google Cloud ML Engine + Tensorflow在input_fn()

时间:2017-08-13 14:15:45

标签: python tensorflow google-cloud-platform google-cloud-ml google-cloud-ml-engine

我想在输入函数中执行基本的预处理和标记化。我的数据包含在谷歌云存储桶位置(gs://)中的csv中,我无法修改。此外,我在ml-engine包中对输入文本执行任何修改,以便在服务时复制行为。

我的输入功能遵循以下基本结构:

filename_queue = tf.train.string_input_producer(filenames)
reader = tf.TextLineReader()
_, rows = reader.read_up_to(filename_queue, num_records=batch_size)
text, label = tf.decode_csv(rows, record_defaults = [[""],[""]])

# add logic to filter special characters
# add logic to make all words lowercase
words = tf.string_split(text) # splits based on white space

是否有任何选项可以避免事先对整个数据集执行此预处理?这个post表明tf.py_func()可以用于进行这些转换,但是他们认为“缺点是因为它没有保存在图表中,所以我无法恢复我保存的模型”所以我不是确信这将在服务时间有用。如果我正在定义我自己的tf.py_func()来进行预处理,并且我在上传到云的培训包中定义了我会遇到任何问题吗?我还没有考虑其他选择吗?

1 个答案:

答案 0 :(得分:1)

最佳做法是编写一个从training / eval input_fn和服务input_fn调用的函数。

例如:

def add_engineered(features):
  text = features['text']
  features['words'] = tf.string_split(text)
  return features

然后,在你的input_fn中,通过调用add_engineered来包装你返回的功能:

def input_fn():
  features = ...
  label = ...
  return add_engineered(features), label

并在您的serving_input fn中,确保通过调用add_engineered类似地包装返回的要素(而不是feature_placeholders):

def serving_input_fn():
    feature_placeholders = ...
    features = ...
    return tflearn.utils.input_fn_utils.InputFnOps(
      add_engineered(features),
      None,
      feature_placeholders
    )

您的模型会使用“字词”。但是,您在预测时的JSON输入只需要包含“文本”,即原始值。

这是一个完整的工作示例:

https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/courses/machine_learning/feateng/taxifare/trainer/model.py#L107