2017-04-01 73 views
1

我們有一個在Android上運行的工作TensorFlow網絡(graphdef),我注意到隨着時間推移的結果往往是相關的。這就是說,如果標籤A被返回,那麼即使當輸入數據切換到應該生成B標籤的數據時,它也往往是A的一串時間流。最終,結果將切換到B,但似乎有滯後,並表明RNN在推理調用之間是有狀態的。我們的網絡正在使用RNN/LSTM。TensorFlow:在Android中的推理之間初始化RNN的狀態

cellLSTM = tf.nn.rnn_cell.BasicLSTMCell(nHidden) 
cellsLSTM = tf.nn.rnn_cell.MultiRNNCell([cellLSTM] * 2) 
RNNout, RNNstates = tf.nn.rnn(cellsLSTM, Xin) 

我想知道是否需要在推理調用之間重新初始化RNN狀態。我會注意到在TensorFlowInferenceInterface.java接口中沒有這種方法可用。我想,可以將一個RNN單元初始化節點插入到可以用節點值激活的圖形中(使用FillNodeInt或類似的方法)。

所以我的問題是:在Tensorflow中RNN/LSTMs的最佳做法是什麼。是否需要在推理之間清除狀態?如果是這樣,一個人怎麼做?

回答

0

雖然我不能評論RNN狀態初始化的一般做法,但下面是我們如何設法強制初始狀態定義。問題是,雖然批量大小確實是訓練集的常量參數,但它不適用於測試集。測試集始終是數據語料庫的20%,因此每次對語料庫進行更改時其大小都不相同。
的解決方案是創建一個新的變量爲BATCHSIZE:

batch_size_T = tf.shape(Xin)[0] 

其中Xin是大小並[b×m的X n],其中b是批量大小和m x n是訓練幀的大小的輸入張量。辛從feed_dict餵食。

outputs, state = tf.nn.dynamic_rnn(cell=lstm_cells, inputs=Xin, dtype=tf.float32, initial_state=initial_state) 
0

是否需要在推理之間清除狀態?

我認爲這取決於如何訓練RNN以及如何使用它。但是,我猜想,無論是否重置狀態,網絡都可以很好地工作。

如何做到這一點?

評估與初始狀態相關的每個張量的初始化操作。

+0

相反,RNNs可以向前攜帶狀態:

initial_state = lstm_cells.zero_state(batch_size_T, tf.float32) 

最後,RNN在新的動態RNN來定義:如

初始狀態可以然後被定義隨着時間的推移未初始化時,如果使用培訓課程中的隨機系列幀進行訓練,則它們在實際數據中的可預測性往往較差。所以確保它以零狀態開始每一幀都很重要。我在TF Issue Board上看到一些評論,說明新的'dynamic_rnn'實現在每一幀自動初始化它的狀態爲零。但是,在我的情況下,我看到異常情況,並希望保證初始化作爲圖的一部分。 – Hephaestus