2016-10-20 37 views
1

我將queued reader應用於tensorflow seq2seq以避免將整個數據集讀入內存並預先處理它們。我沒有首先將數據集存入不同的存儲桶文件,以確保每個批次的存儲桶大小也需要很多時間。因此,來自隊列讀取器的每批數據可能包含不同桶大小的序列,這導致運行原始seq2seq模型失敗(它假定一批中的數據具有相同的桶大小,並且只選擇取決於桶的大小來執行一個子圖)在張量流seq2seq框架中,如何在一個批次中訓練不同桶尺寸的數據

我曾嘗試:

原實裏,子圖,多達桶,構建共享相同的參數。它們之間的唯一區別是在其RNN過程中應該採取的計算時間。 我改變了子圖的條件之一,當switch爲真,將計算該桶的bucket_loss並將其添加到loss_listswitch是假,什麼也不做,並添加tf.constant(0.0)loss_list。最後,我用total_loss = tf.reduce_sum(loss_list)來收集所有的損失和構建的梯度圖。另外,我在每一步都會輸入switches_list模型。 switches_list的大小與桶的大小相同,如果在該批次中有第i桶大小的數據,則switches_list中對應的第i個開關將爲True,否則爲False。

遇到的問題:

  1. 當反向傳播過程中,通過tf.cond(...) 節點去了,我被gradient.py有些稀疏張量 轉化警告,密密麻麻一個
  2. ,當我試圖獲取total_lossbucket_loss,我被告知:
ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable. 

請你幫幫我:

  • 我該如何解決上述兩個問題?
  • 我應該如何修改圖表以符合我的要求?
  • 在一批 批次中有什麼更好的想法來培訓不同桶尺寸的數據?
  • 任何更好的想法應用異步隊列閱讀器seq2seq 框架沒有首先整個數據集?

回答

0

我會(完全)扔掉水桶。去dynamic_rnn。這裏的想法是用填充符號來填充批次,該批次的數量與該批次的所有成員(通常只是相應批次中最長成員的大小)的等量長度相同。解決你所有的四個問題,但是,是的,重寫有些麻煩。(我不後悔可言雖然)

我這樣做,是非常特別的,以我的情況和數據的方式很多事情,從而共享是沒有意義的,但也許你想看看這個實現:Variable Sequence Lengths in TensorFlow

相關問題