首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Dataset API的Tensorflow自定义估计:嵌入查找(feature_column) NMT任务

带有Dataset API的Tensorflow自定义估计:嵌入查找(feature_column) NMT任务
EN

Stack Overflow用户
提问于 2018-02-21 20:31:52
回答 4查看 1.4K关注 0票数 2

我的问题在本质上接近特征列嵌入查找,但是我无法评论那里给出的答案(没有足够的代表),我认为回答者要么不完全理解这个问题,要么答案不是被问到的。

目标

使用Dataset API输入数据的自定义估计器。任务是NMT (seq2seq)。

问题

估计器需要feature_columns作为服务的输入。我的NMT任务只有一个功能,输入的句子需要翻译(或者句子中的每个单词可能是一个特征?)因此,我不知道如何使用我的输入语句来构建一个feature_column (因此是一个embedding_column,最后是一个input_layer),这个特性可以被输入到一个RNN (它期望有一个embedding_lookup batch_size,max_seqence_len,embedding_dim),这最终将允许我为估计器服务。

背景

我试图利用自定义估计器来提供seq2seq样式的NMT实现。我需要能够通过tf服务为模型服务,这似乎是相对容易的估计。

然而,我遇到了一个路障‘如何’服务的模式。据我所知,我需要“feature_columns”作为模型的输入。

serving.md

显示您需要一个export_input_fn,它使用一个feature_spec,它需要一个feature_column(s)作为输入。然而,对于我的用例来说,这是有意义的,我没有很多(不同的)特性,相反,我有需要通过嵌入查找并作为特性使用的输入句子(每个单词都是一个特性).

因此,我知道我需要将输入输入到我的模型中,才能成为功能列。我输入的NMT只是batch_size,max_sequence_len的一个张量,其中充满了句子中单词的索引(例如batch_size=1 3、17、132、2、1、0、……每个索引都应该映射到嵌入向量)。通常情况下,我会通过

代码语言:javascript
复制
    embs = tf.get_variable('embedding', [vocab_size, embedding_dim])
    tf.nn.embedding_lookup(embs, inputs)

我很乐意这样做,我可以把它作为输入提供给RNN,其余的都是历史,而不是问题。

但是,这是我遇到问题的地方,我需要使用feature_columns (这样我就可以为模型服务)。我在开头提到的问题的答案显示了如何使用embedding_column,但是他建议嵌入应该将整个句子作为一个单独的特性来查找,但是传统上您会查找句子中的每个单词并得到它的嵌入。

类似地,https://www.damienpontifex.com/2018/01/02/using-tensorflow-feature-columns-in-your-custom-estimator-model/

展示了“如何在自定义估计器中实现一个特性列”,实际上,前面的代码是完全正确的(正如我所写的),一个tf.get_variable变成了一个tf.nn.embedding_lookup,但是他的'after‘代码同样只包含了一个特性(整个句子?)

我已经通过使用他们的代码并将batch_size,max_seq_len中的数据输入到batch_size,max_seq_len中,输出张量是batch_size,embedding_dim来验证这一点。

序列信息丢失了?还是只是简单地被压扁了?当我打印输出时,它的大小(?,embedding_dim)在哪里?通常是我的batch_size。

编辑:我已经验证了它的形状是batch_size,embedding_dim,它不仅仅是扁平的.所以序列信息丢失了

我猜它一定是把输入当作一个单一的输入特性(因此batch_size=1 ex 3,17,132,2,1,0,.每个索引映射到一个嵌入向量)将映射到不需要的单个特性,我们希望每个索引映射到一个嵌入,所需的输出是batch_size、max_seq_len、embedding_dim。

这听起来像是我所需要的,不是一个categorical_column_with_*,而是一个max_seq_len数量(在我的序列中每个单词是一个),这听起来是对的吗?每个字都是我的模型的一个特色,所以我倾向于这是正确的方法,但这也有问题。我正在使用Dataset API,因此在我的input_train_fn()中,我从一个文件中加载数据,然后使用tf.data.Dataset.from_tensor_slices(数据、标签)将数据拆分成张量,然后我可以使用tf.data.Dataset.from_tensor_slices将数据输入到估计值中。我不能迭代每批(Tesors是不可迭代的),所以我不能简单地为每个输入批次做100 feature_columns .

,有人知道如何做到这一点吗?,这种嵌入查找与简单的占位符或变量(以及在NLP任务中的一种常见方法)是非常简单的。但是,当我冒险进入Dataset API和Estimators时,我遇到的信息很少(这不是一个基本的例子)。

我承认我在理解上可能有差距,自定义估计器和dataset API对我来说是新的,有时很难找到关于它们的信息。所以你可以随时向我发送信息。

谢谢你阅读我的文章,希望能帮到我(我看到的其他人也问了一个类似的问题,但没有得到答案-- https://groups.google.com/a/tensorflow.org/forum/#!searchin/discuss/embeddings$20in$20custom$20estimator/discuss/U3vFQF_jeaY/EjgwRQ3RDQAJ,我为这个家伙感到难过,他的问题没有得到真正的回答(因为同样的原因,他的线程被劫持了……)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-23 19:18:07

因此,我最终完成这项工作的方式是,我使每个单词都成为一个输入特性,然后简单地进行wrd_2_idx转换,将其作为numerical_column中的一个特性传递,然后将这些列传递给input_layer。然后,在我的图形中,我使用这些特性并正常地查找嵌入。基本上是避开了embedding_column查找,因为我不知道如何使它以我想要的方式运行。这可能不是最佳的,但它的工作和火车..。

我将把这个作为公认的答案,并希望将来的某个时候我能找到一个更好的方法去做,或者其他人可以给我一个最好的方法来解决这个问题。

票数 0
EN

Stack Overflow用户

发布于 2018-02-22 05:44:18

如果我正确理解,您希望使用Estimator来构建SeqSeq模型。Problems-Solutions/text文件夹是启动这里的好地方。

要回答关于如何使用发送查找的问题,请举一个例子

代码语言:javascript
复制
vocab_table = lookup.index_table_from_file(vocabulary_file='data/vocab.csv', num_oov_buckets=1, default_value=-1)
text = features[commons.FEATURE_COL]
words = tf.string_split(text)
dense_words = tf.sparse_tensor_to_dense(words, default_value=commons.PAD_WORD)
word_ids = vocab_table.lookup(dense_words)

padding = tf.constant([[0, 0], [0, commons.MAX_DOCUMENT_LENGTH]])
# Pad all the word_ids entries to the maximum document length
word_ids_padded = tf.pad(word_ids, padding)
word_id_vector = tf.slice(word_ids_padded, [0, 0], [-1, commons.MAX_DOCUMENT_LENGTH])

word_id_vector = {commons.FEATURE_COL: word_id_vector}

bow_column = tf.feature_column.categorical_column_with_identity(commons.FEATURE_COL, num_buckets=params.N_WORDS)
bow_embedding_column = tf.feature_column.embedding_column(bow_column, dimension=50, combiner='sqrtn')
bow = tf.feature_column.input_layer(word_id_vector, feature_columns=[bow_embedding_column])
logits = tf.layers.dense(bow, 2, activation=None)

上面的代码可以用估计值model_fn包装。上面的回购包含以下代码。请看一下。

票数 0
EN

Stack Overflow用户

发布于 2019-02-21 16:42:55

我设法让这个工作..。RNN没有消耗嵌入的事实也使它偏离了轨道。

我所做的工作(在最简单的情况下):

代码语言:javascript
复制
#features[VALUE_FEATURE_NAME] is shape (?, 200), ie. 200 words per row
inputs = tf.contrib.layers.embed_sequence(
  features[VALUES_FEATURE_NAME], 3000, 5,
)

# create an LSTM cell of size 100
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(200)

# create the complete LSTM
_, final_states = tf.nn.dynamic_rnn(
    lstm_cell, inputs, dtype=tf.float32)
outputs = final_states.h 

所以我想答案就在动态rnn的tensorflow文档中。

创建由RNNCell单元指定的递归神经网络。 执行输入的完全动态展开。

因此,这里的展开意味着RNN使用批处理,time_steps,值作为输入。

凌驾

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48914953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档