我的问题本质上与Feature Columns Embedding lookup很接近,但是我无法评论那里给出的答案(没有足够的代表),我认为回答者要么没有完全理解问题,要么答案不完全是问。
目标
为使用 Dataset API 提供数据的自定义 Estimator 提供服务。任务是 NMT (seq2seq)。
问题
Estimator 需要 feature_columns 作为服务的输入。我的 NMT 任务只有一个特征,即要翻译的输入句子(或者可能句子中的每个单词都是一个特征?)。所以我不确定如何使用我的输入句子作为一个特征来构建一个 feature_column(以及一个 embedding_column,最后是一个 input_layer),这个特征可以被输入到一个 RNN(它需要一个 embedding_lookup [batch_size,max_seqence_len,embedding_dim]),最终将请允许我为估算员服务。
背景
我正在尝试使用自定义估计器来提供 seq2seq 样式的 NMT 实现。我需要能够通过 tf-serving 为模型提供服务,估计器似乎相对容易。
但是,我遇到了“如何”为模型服务的路障。据我所知,我需要“feature_columns”作为模型的输入。
表明您需要一个 export_input_fn ,它使用一个 feature_spec 需要一个 feature_column(s) 作为输入。这是有道理的,但是,对于我的用例,我没有一堆(不同的)特征,而是我有需要通过嵌入查找并用作特征的输入句子(其中每个单词都是一个特征)......
所以我知道我需要输入到我的模型中才能成为特征列。我对 NMT 的输入只是 [batch_size, max_sequence_len] 的张量,其中填充了句子中单词的索引(例如,对于 batch_size=1 [3, 17, 132, 2, 1, 0, ...]其中每个索引应该映射到一个嵌入向量)。通常我会通过
embs = tf.get_variable('embedding', [vocab_size, embedding_dim])
tf.nn.embedding_lookup(embs, inputs)
我会很高兴,我可以将它作为输入提供给 RNN,其余的都是历史,不是问题。
但是,这是我遇到问题的地方,我需要使用 feature_columns (这样我就可以为模型提供服务)。我在本文开头提到的问题给出的答案显示了如何使用 embedding_column,但他建议嵌入应该将整个句子作为一个单一特征查找,但传统上你会查找句子中的每个单词并得到它的嵌入。
显示“如何在自定义估计器中实现特征列”,实际上他的“之前”代码是完全正确的(正如我写的那样),一个 tf.get_variable 到一个 tf.nn.embedding_lookup,但他的“之后”代码,同样,只接受 1 个特征(整个句子?)。
我已经通过使用他们的代码并将 [batch_size, max_seq_len] 中的数据提供给 tf.feature_column.categorical_column_with_identity 来验证这一点,输出张量是 [batch_size, embedding_dim]
序列信息丢失?或者它只是变平了?当我打印输出时,它的大小(?,embedding_dim)在哪里?通常是我的 batch_size。
编辑:我已经验证了形状是 [batch_size, embedding_dim],它不只是扁平化......所以序列信息丢失了
我猜它必须将输入视为 1 个单个输入特征(因此 batch_size=1 ex [3, 17, 132, 2, 1, 0, ...] 其中每个索引映射到嵌入向量)将映射对于不想要的单个特征,我们希望每个索引映射到一个嵌入,并且所需的输出是 [batch_size, max_seq_len, embedding_dim]。
听起来我需要的不是一个 categorical_column_with_*,而是它们的 max_seq_len 数量(我序列中的每个单词 1 个),这听起来对吗?每个单词都是我模型的一个特征,所以我倾向于这是正确的方法,但这也有问题。我正在使用 Dataset API,所以在我的 input_train_fn() 中,我从文件中加载数据,然后使用 tf.data.Dataset.from_tensor_slices(data, labels) 将数据拆分为张量,然后我可以使用 dataset.batch( batch_size).make_one_shot_iterator().get_next() 输入我的估算器。我不能对每个批次进行迭代(Tesors 不可迭代)所以我不能简单地为每个输入批次制作 100 个 feature_columns ...
有谁知道如何做到这一点?这种嵌入查找对于简单的占位符或变量(以及 NLP 任务中的常用方法)来说是一件非常简单的事情。但是当我冒险使用 Dataset API 和 Estimators 时,我遇到了一个信息量很少的墙(这不是一个基本的例子)。
我承认我的理解可能存在差距,自定义估算器和数据集 API 对我来说是新事物,有时很难找到有关它们的信息。因此,请随时向我发送信息。
感谢您阅读我的文字墙并希望对我有所帮助(以及我见过的其他人提出类似的问题但没有得到答案https://groups.google.com/a/tensorflow.org/forum/#!searchin /discuss/embeddings $20in$20custom$20estimator/discuss/U3vFQF_jeaY/EjgwRQ3RDQAJ 我为这个家伙感到难过,他的问题没有得到真正的回答(出于与此处所述相同的原因,他的线程被劫持了......)。