我想在输入函数中执行基本的预处理和标记化。我的数据包含在谷歌云存储桶位置(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()来进行预处理,并且我在上传到云的培训包中定义了我会遇到任何问题吗?我还没有考虑其他选择吗?
答案 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输入只需要包含“文本”,即原始值。
这是一个完整的工作示例: