【问题标题】:Google Cloud ML Engine + Tensorflow perform preprocessing/tokenization in input_fn()Google Cloud ML Engine + Tensorflow 在 input_fn() 中执行预处理/标记化
【发布时间】:2017-08-14 17:00:34
【问题描述】:

我想在我的输入函数中执行基本的预处理和标记化。我的数据包含在我无法修改的谷歌云存储桶位置 (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() 来进行预处理,并且它是在我上传到云的培训师包中定义的,我会遇到任何问题吗?有没有我没有考虑的其他选择?

【问题讨论】:

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


    【解决方案1】:

    最佳做法是编写一个函数,您可以从训练/评估 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 类似地包装返回的功能(不是功能占位符):

    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

    【讨论】:

    • 嗨 Lak - 感谢您的详细回复!我理解 input_fn 中包含的内容,但我特意寻找有关最好方法的建议,而不仅仅是应用 tf.string_split()。在 tf.string_split 之前,我想让所有字符小写,并且我还想从原始文本中去除特殊字符(如 * 或 ! 可能附加到单词的末尾)所以“这是一个句子*代币化!”应该在 string_split() 之前转换为“这是一个要标记的句子”。 py_func() 是唯一的选择吗?这会导致服务时出现问题吗?
    • 除了Lak的回答,我想回答一下关于tf.py_func的部分:它不序列化和反序列化,所以不能用于服务。
    • 在 add_engineered 方法中,您不仅限于 tensorflow 函数。您可以调用任何 python 函数,但需要注意的是,不是 tensorflow 函数可能涉及在 c++ 和 python 之间传递的数据,从而导致效率低下。核心 python 函数很简单,但依赖外部模块的函数在部署应用时需要更改配置。
    猜你喜欢
    • 2018-03-24
    • 2019-05-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多