当我使用预训练的单词向量进行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维单词向量。
感谢您的帮助
答案 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})