Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有数据集API的Tensorflow自定义估计器:嵌入查找(特征列)NMT任务_Tensorflow_Tensorflow Serving_Tensorflow Datasets_Tensorflow Estimator - Fatal编程技术网

带有数据集API的Tensorflow自定义估计器:嵌入查找(特征列)NMT任务

带有数据集API的Tensorflow自定义估计器:嵌入查找(特征列)NMT任务,tensorflow,tensorflow-serving,tensorflow-datasets,tensorflow-estimator,Tensorflow,Tensorflow Serving,Tensorflow Datasets,Tensorflow Estimator,我的问题本质上很接近,但是我无法对那里给出的答案发表评论(没有足够的代表性),我认为回答者要么没有完全理解问题,要么答案不完全是所问的 目标 为使用数据集API输入数据的自定义估计器提供服务。任务是NMT(seq2seq) 问题 估计器需要特征列作为服务的输入。我的NMT任务只有一个特征,即要翻译的输入句子(或者句子中的每个单词都是特征?)。因此,我不确定如何使用我的输入语句作为特征构建一个特征列(从而形成一个嵌入列,最后形成一个输入层),该特征可以输入到RNN中(需要嵌入查找[批量大小,最

我的问题本质上很接近,但是我无法对那里给出的答案发表评论(没有足够的代表性),我认为回答者要么没有完全理解问题,要么答案不完全是所问的


目标 为使用数据集API输入数据的自定义估计器提供服务。任务是NMT(seq2seq)


问题 估计器需要特征列作为服务的输入。我的NMT任务只有一个特征,即要翻译的输入句子(或者句子中的每个单词都是特征?)。因此,我不确定如何使用我的输入语句作为特征构建一个特征列(从而形成一个嵌入列,最后形成一个输入层),该特征可以输入到RNN中(需要嵌入查找[批量大小,最大顺序,嵌入深度]),这将最终允许我为估计器提供服务


背景 我正试图利用一个自定义估计器为seq2seq风格的NMT实现提供数据。我需要能够通过tf服务为模型提供服务,这似乎使估计器变得相对容易

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

显示您需要有一个export\u input\u fn,它使用需要一个feature\u列作为输入的feature\u spec。这是有道理的,但是,对于我的用例,我没有一堆(不同的)特征,相反,我有需要通过嵌入查找并用作特征的输入句子(其中每个单词都是特征)

因此,我知道我需要将输入到模型中的内容设置为特征列。我对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,其余的都是历史,不是问题

但是,这就是我要解决的问题,我需要使用功能列(以便为模型提供服务)。我在本文开头提到的问题的答案显示了如何使用Embedded_列,但他建议Embedded应该将整个句子作为一个单独的特征进行查找,但传统上,您会查找句子中的每个单词并获得其嵌入

同样地

显示了“如何在自定义估计器中实现一个特征列”,实际上他的“Before”代码是完全正确的(正如我所写的),一个tf.get_变量嵌入到tf.nn.embedded_查找中,但他的“after”代码同样只接受一个特征(整个句子?)

我已经通过使用他们的代码验证了这一点,并将[batch_size,max_seq_len]中的数据输入到tf.feature_column.Category_column_,带有_标识,输出张量为[batch_size,Embedded_dim]

序列信息丢失?还是只是被压扁了?打印输出时,其大小(?,嵌入尺寸)在哪里?通常是我的批量大小

编辑:我已经验证了形状是[批量大小,嵌入尺寸],它不仅仅是扁平的。。。所以序列信息丢失了

我猜它一定是将输入视为一个单一的输入特征(因此批次大小=1ex[3,17,132,2,1,0,…],其中每个索引映射到一个嵌入向量)映射到一个单独的特征,而这不是我们想要的,我们希望每个索引映射到一个嵌入,所需的输出是[batch\u size,max\u seq\u len,embedding\u dim]

这听起来像是我需要的,不是一个带*的分类列,而是它们的最大数量(我序列中的每个单词对应一个),这听起来对吗?每个单词都是我的模型的一个特征,所以我倾向于这是正确的方法,但这也有问题。我使用的是Dataset API,所以在我的输入中,我从一个文件中加载数据,然后使用tf.data.Dataset.from_tensor_切片(数据、标签)将数据拆分为张量,然后我可以使用Dataset.batch(batch_size)。生成一个快照迭代器()。我不能对每个批进行迭代(Tesors是不可迭代的),所以我不能简单地为每个输入批生成100个feature_列

有人知道怎么做吗?使用简单的占位符或变量(以及NLP任务中的常见方法),这种嵌入查找非常简单。但是,当我冒险使用数据集API和估计器时,我遇到了一堵几乎没有信息的墙(这不是一个基本的例子)

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


感谢您阅读我的文字墙,并希望能帮助我(和我见过的其他人问了一个类似的问题,但没有得到答案$20in$20custom$20estimator/Discussion/U3vFQF_-jeaY/EjgwRQ3RDQAJ我为这家伙感到难过,他的问题没有得到真正的回答(与这里概述的原因相同,他的线程被劫持了…).

如果我理解正确,您希望使用Estimator API构建一个seq-seq模型。一个好的开始,请查看问题解决方案/text文件夹

要回答您关于如何使用eMeding查找的问题,下面是一个示例

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)

上面的代码可以封装在估算器模型中。上面的repo包含了这段代码。请看一看。

所以我完成这项工作的方法是我把每个单词都作为一个输入特征,然后我只需进行wrd_2_idx转换,将其作为特征传递到一个数字列中(s,你有这些的max_seq_lens)然后将这些列传递给input_层。然后在我的图中,我使用这些特性并像普通一样查找嵌入。Basic
#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 
import tensorflow as tf
if __name__ == "__main__":
  #tf.enable_eager_execution()
  feature = {
      'aa': [['1', '2', '3'], 
             ['-1', '4', '-1'], 
             ['2', '-1', '-1'],
             ['4', '5', '6']]
  }

  aa_id = tf.contrib.feature_column.sequence_categorical_column_with_vocabulary_list(
      'aa', ['1', '2', '3', '4', '5']
    )
  seq_emb_matrix = tf.feature_column.embedding_column(aa_id, 2)
  seq_tensor, seq_length = tf.contrib.feature_column.sequence_input_layer(feature, [seq_emb_matrix])
  seq_tensor1, seq_length1 = tf.contrib.feature_column.sequence_input_layer(feature1, [seq_emb_matrix])
  seq_tensor2 = tf.squeeze(seq_tensor1)
  # print(tensor)
  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(tf.tables_initializer())
    a, a_len = sess.run([seq_tensor, seq_length])
    b, b_len = sess.run([seq_tensor1, seq_length1])
    print(a)
    print('a_len', a_len)
    print(a.shape)
    print('-'*50)
    print(b)
    print('b_len', b_len)
    print(b.shape)
    print(sess.run([seq_tensor2]))
[[[ 0.5333682  -0.39895234]
  [ 0.5335079   0.64998794]
  [-1.0432893  -0.8391434 ]]

 [[ 0.          0.        ]
  [-0.29623085 -0.17570129]
  [ 0.          0.        ]]

 [[ 0.5335079   0.64998794]
  [ 0.          0.        ]
  [ 0.          0.        ]]

 [[-0.29623085 -0.17570129]
  [ 0.7100604   0.9935588 ]
  [ 0.          0.        ]]]
('a_len', array([3, 3, 3, 3]))
(4, 3, 2)
--------------------------------------------------
[[[-0.24147142 -0.37740025]]

 [[-0.6222648   1.3862932 ]]

 [[ 1.2226609  -0.68292266]]]
('b_len', array([1, 1, 1]))
(3, 1, 2)
[array([[-0.24147142, -0.37740025],
       [-0.6222648 ,  1.3862932 ],
       [ 1.2226609 , -0.68292266]], dtype=float32)]