在 Tf.Estimator API 中重用嵌入变量进行推理
Reusing Embedding Variable For Inference in the Tf.Estimator API
在使用 seq2seq 架构的 NMT 中,在推理过程中,我们需要在训练阶段训练的嵌入变量作为 GreedyEmbeddingHelper 或 BeamSearchDecoder 的输入。
问题是,在使用 Estimator API 进行训练和推断的情况下,我们如何提取这个经过训练的嵌入变量以用于预测?
我根据下面的Whosebug想出了一个解决方案。对于预测阶段,您可以使用 tf.contrib.framework.load_variable 从经过训练和保存的 Tensorflow 模型中检索嵌入变量,如下所示:
if mode == tf.estimator.ModeKeys.PREDICT:
embeddings = tf.constant(tf.contrib.framework.load_variable('.','embed/embeddings'))
helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(embedding=embeddings,
start_tokens=tf.fill([batch_size], 1),end_token=0)
所以在我的例子中,我是 运行 包含保存模型的同一文件夹中的代码,我的变量名称是 'embed/embedding'。请注意,这仅适用于通过张量流模型训练的嵌入。否则,请参考上面链接的答案。
要使用估计器 API 查找变量名,您可以使用方法 get_variable_names() 获取图中保存的所有变量名的列表。
在使用 seq2seq 架构的 NMT 中,在推理过程中,我们需要在训练阶段训练的嵌入变量作为 GreedyEmbeddingHelper 或 BeamSearchDecoder 的输入。
问题是,在使用 Estimator API 进行训练和推断的情况下,我们如何提取这个经过训练的嵌入变量以用于预测?
我根据下面的Whosebug想出了一个解决方案
if mode == tf.estimator.ModeKeys.PREDICT:
embeddings = tf.constant(tf.contrib.framework.load_variable('.','embed/embeddings'))
helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(embedding=embeddings,
start_tokens=tf.fill([batch_size], 1),end_token=0)
所以在我的例子中,我是 运行 包含保存模型的同一文件夹中的代码,我的变量名称是 'embed/embedding'。请注意,这仅适用于通过张量流模型训练的嵌入。否则,请参考上面链接的答案。
要使用估计器 API 查找变量名,您可以使用方法 get_variable_names() 获取图中保存的所有变量名的列表。