TensorFlow BoW编码器服务函数实现及模型导出相关问题咨询
关于文本分类模型serving_input_fn的实现说明
你说得对,serving_input_fn和train_input_fn/eval_input_fn确实共享很多预处理逻辑(比如文本分词、转词索引、padding/truncation这些步骤),但它们的核心目标不一样,不能直接完全照搬,得针对服务场景做调整。下面给你拆解具体的实现要点:
一、核心差异:train/eval vs serving
- train_input_fn/eval_input_fn:面向批量的训练/评估数据,通常从文件、TFRecord或数据库读取数据,处理的是预准备好的数据集,输出是模型训练用的(特征张量, 标签张量)对。
- serving_input_fn:面向实时请求的输入,需要接收用户传来的原始文本(比如HTTP请求里的字符串),把它转换成模型能接受的特征张量格式,不需要处理标签,最终要返回
ServingInputReceiver对象让TensorFlow Serving识别输入输出接口。
二、必须补全的词汇表保存逻辑
你代码里的注释提到的“保存词汇表”是关键步骤,因为文本转词索引依赖训练时生成的词汇表,服务时必须用同一个词汇表才能保证索引对应正确。实现方式可以这样:
训练时保存词汇表
假设你训练时生成了词汇表列表(比如从训练数据统计得到):
# 训练过程中生成的词汇表列表,包含PAD、UNK等特殊符号 vocab_list = ["<PAD>", "<UNK>", "hello", "world", ...] # 保存到文件,每行一个词 with open("vocab.txt", "w") as f: for word in vocab_list: f.write(word + "\n") # 或者用TensorFlow原生API保存 tf.io.write_file("vocab.txt", "\n".join(vocab_list))
服务时加载词汇表
在serving_input_fn里加载这个词汇表,创建索引映射表,要和训练时的预处理逻辑完全对齐:
def serving_input_fn(): # 定义接收用户输入的placeholder,支持批量请求(shape=[None]) input_text = tf.compat.v1.placeholder(tf.string, shape=[None], name="input_text") # 加载训练时保存的词汇表,创建索引映射表 vocab_table = tf.lookup.StaticVocabularyTable( tf.lookup.TextFileInitializer( "vocab.txt", key_dtype=tf.string, key_index=tf.lookup.TextFileIndex.WHOLE_LINE, value_dtype=tf.int64, value_index=tf.lookup.TextFileIndex.LINE_NUMBER ), num_oov_buckets=1 # 处理未登录词,和训练时的配置一致 ) # 文本预处理:完全复用训练时的逻辑(分词、转索引、padding/truncation) # 示例用TensorFlow原生分词,如果你训练时用了Tokenizer,要加载训练时保存的配置 # 比如训练时保存:tokenizer.to_json("tokenizer.json"),服务时加载复用 tokens = tf.strings.split(input_text) token_indices = vocab_table.lookup(tokens) # 截断/填充到训练时设定的固定序列长度 padded_indices = tf.keras.preprocessing.sequence.pad_sequences( token_indices, maxlen=MAX_SEQ_LENGTH, padding='post', truncating='post' ) # 构造特征字典,要和模型的输入特征名完全匹配 features = {"input_ids": padded_indices} # 返回ServingInputReceiver,关联原始输入和处理后的特征张量 return tf.estimator.export.ServingInputReceiver(features, {"input_text": input_text})
三、调整export_strategies导出可服务模型
之前你设置了export_strategies=None,这会导致训练完成后不会导出可用于部署的模型包。现在需要修改Experiment配置,添加导出策略:
# 创建导出策略,指定serving_input_fn export_strategy = tf.estimator.LatestExporter( "text_classifier_export", serving_input_fn=serving_input_fn, exports_to_keep=5 # 保留最近的5个模型版本 ) # 重新配置Experiment experiment = tf.contrib.learn.Experiment( estimator=your_text_classifier_estimator, train_input_fn=train_input_fn, eval_input_fn=eval_input_fn, export_strategies=[export_strategy], # 其他原有配置... )
这样训练完成后,TensorFlow会自动导出模型到指定目录,你就可以用TensorFlow Serving部署这个模型,接收文本请求并返回预测结果了。
内容的提问来源于stack exchange,提问作者psu
相关产品推荐
相关产品推荐

