我創建了一個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
函數。我不知道我能做什麼。有什麼建議麼?提前致謝! :)
太棒了。我會嘗試'tf.while_loop'並讓你知道它是怎麼回事,但這似乎是正確的答案。 –