如何在tensorflow中处理大型(> 2GB)嵌入查找表?

时间:2017-10-12 15:03:04

标签: tensorflow deep-learning

当我使用预训练的单词向量进行LSTM分类时,我想知道如何处理在张量流中嵌入大于2gb的查找表。

为此,我尝试使用下面的代码嵌入查找表,

data = tf.nn.embedding_lookup(vector_array, input_data)

得到此值错误。

ValueError: Cannot create a tensor proto whose content is larger than 2GB

代码上的变量vector_array是numpy数组,它包含每个单词大约1400万个唯一标记和100维单词向量。

感谢您的帮助

3 个答案:

答案 0 :(得分:7)

您需要将其复制到tf变量。在StackOverflow中,这个问题有一个很好的答案: Using a pre-trained word embedding (word2vec or Glove) in TensorFlow

我就这样做了:

embedding_weights = tf.Variable(tf.constant(0.0, shape=[embedding_vocab_size, EMBEDDING_DIM]),trainable=False, name="embedding_weights") 
embedding_placeholder = tf.placeholder(tf.float32, [embedding_vocab_size, EMBEDDING_DIM])
embedding_init = embedding_weights.assign(embedding_placeholder)
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
sess.run(embedding_init, feed_dict={embedding_placeholder: embedding_matrix})

然后,您可以使用embedding_weights变量执行查找(记住存储字索引映射)

更新:不需要使用变量,但它允许您将其保存以备将来使用,这样您就不必再重新完成整个操作了(加载时我的笔记本电脑需要一段时间)大嵌入)。如果这不重要,您可以简单地使用像Niklas Schnelle建议的占位符

答案 1 :(得分:4)

对我而言,接受的答案似乎不起作用。虽然没有错误但结果很糟糕(与通过直接初始化的较小嵌入相比)并且我怀疑嵌入只是常量0,tf.Variable()被初始化为。

仅使用没有额外变量的占位符

self.Wembed = tf.placeholder(
    tf.float32, self.embeddings.shape,
    name='Wembed')

然后在每个session.run()上提供嵌入似乎可以正常工作。

答案 2 :(得分:0)

在TF 1.8中,使用带有较大嵌入的feed_dict太慢了,这可能是由于Niklas Schnelle提到的问题。

我最终得到了以下代码:

embeddings_ph = tf.placeholder(tf.float32, wordVectors.shape, name='wordEmbeddings_ph')
embeddings_var = tf.Variable(embeddings_ph, trainable=False, name='wordEmbeddings')
embeddings = tf.nn.embedding_lookup(embeddings_var,input_data)
.....
sess.run(tf.global_variables_initializer(), feed_dict={embeddings_ph:wordVectors})