2017-10-12 97 views
4

當我使用預先訓練的單詞向量做LSTM分類時,我想知道如何處理tensorflow中大於2gb的嵌入查找表。如何在張量流中處理大型(> 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的陣列,它包含約14萬個獨特的標記和對每個字100個尺寸字向量。

感謝您的幫助

回答

2

對我來說,接受的答案似乎並不奏效。雖然沒有錯誤,但結果是糟糕的(與通過直接初始化的較小嵌入相比),並且我懷疑嵌入是tf.Variable()初始化的常量。

使用只是一個佔位符沒有額外的變量

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

,然後在每session.run()圖的餵養嵌入但似乎工作。

+0

對不起,聽到它不適合你。當我嘗試時,我使用交互式會話檢查了個人權重,他們絕對不是全0。此外,我僅僅在Stackoverflow上引用了超過93個upvotes的回答,這是由Google員工提供的,所以不確定哪裏出了問題 - 也許在我的代碼或你的代碼中存在一些錯字。你當然可以做你所建議的,而不是使用變量,但我認爲你不能使張量持續這種方式。我保存我的變量,以便將來不必運行這個耗費內存的進程 - 我只是恢復已保存的變量。 – ltt

6

您需要將其複製到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建議的佔位符

相關問題