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

shi*_*nys 8 deep-learning tensorflow

当我使用预训练的单词向量进行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维单词向量.

谢谢你的帮助

ltt*_*ltt 7

您需要将其复制到tf变量.StackOverflow中对这个问题有一个很好的答案: 在TensorFlow中使用预先训练的单词嵌入(word2vec或Glove)

我就这样做了:

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})
Run Code Online (Sandbox Code Playgroud)

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

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


Nik*_*lle 4

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

仅使用占位符,无需额外变量

self.Wembed = tf.placeholder(
    tf.float32, self.embeddings.shape,
    name='Wembed')
Run Code Online (Sandbox Code Playgroud)

然后在图表的每个 session.run() 上提供嵌入似乎是有效的。