0

我創建了一個TensorFlow圖形,它有兩部分:編碼器和解碼器;解碼器之後是優化。編碼器和解碼器都是遞歸神經網絡,其登記分別依賴於可變長度輸入和目標序列。換句話說,如果輸入序列有5個元素,目標序列有6個元素,則編碼器必須有5個註冊,並且解碼器必須有6個註冊。不過,我覺得我可以通過創建圖表上面兩個變量做到這一點:帶可變迭代部分的TensorFlow圖形

len_input = 1 
len_target = 1 

,並在圖中有代碼:

graph = tf.Graph() 
with graph.as_default(): 
... 
    # Encoder 
    for t in range(len_input): 
     ... 

    # Decoder 
    for t in range(len_target): 
     ... 

然後當我運行一個會議上,我會相應地更新它們:

with sess = tf.Session(graph=graph): 
tf.initialize_all_variables().run() 
for step in range(num_batches): 
    input = en_data.pop() 
    len_input = input.shape[1] 
    target = fr_data.pop() 
    len_target = target.shape[1] 

但是,這並不能產生預期的結果。相反,該圖只會將編碼器和解碼器註冊一次,就像圖形首次編譯時一樣。

在你告訴我可以在多次登記中保存張量之前,在我的情況下,問題是丟失函數取決於解碼器的輸出,這取決於編碼器的輸出。換句話說,優化器優化了編碼器和解碼器中的所有權重,這意味着它們都需要在一個圖中。如果我要在整個註冊過程中保存值張量,我需要爲編碼器和解碼器創建兩個單獨的圖表,因爲這兩個註冊的數量不必相同。

我非常難以忍受這一點。起初,我想有一個佔位符,我可以提供編碼器和解碼器的註冊數量,但佔位符本身是一個張量,因此不能用於for循環中的range函數。我不知道我能做什麼。有什麼建議麼?提前致謝! :)

回答

1

TensorFlow支持使用圖中的控制流構造來動態展開循環。而不是使用一個Python for循環來定義迭代的,你可以使用下面的接口,讓你定義你的循環體作爲一個Python對象或功能之一:

  • 如果您的編碼器和解碼器匹配TensorFlow的tf.nn.rnn_cell.RNNCell接口,您可以使用tf.nn.dynamic_rnn()來定義具有不同時間步數的RNN。參數sequence_length允許您將批次中每個序列的長度指定爲tf.Tensor,並且TensorFlow將執行該單元格的適當次數。

  • 如果將循環體更簡單地表示爲Python函數,則可以使用tf.while_loop()tf.scan()高階函數來定義循環。

+0

太棒了。我會嘗試'tf.while_loop'並讓你知道它是怎麼回事,但這似乎是正確的答案。 –