2016-08-01 145 views
1

我想實現一個使用張量流進行關鍵字檢測的LSTM神經網絡。我給神經網絡提供了400ms的序列。然而,在訓練過程中,我不想讓LSTM在嘗試學習序列6時記住序列1。那麼如何在訓練期間重置LSTM的狀態。 outputs, state = rnn.rnn(cell, inputs, initial_state=self._initial_state)參數中的initial_state是否允許在整個批次饋入後重置LSTM的內存?當LSTM狀態重置

我試圖理解這個鏈接的實現:

https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py

+0

我不確定瞭解您的目標,但您可以在運行網絡時重置狀態。說'network = tf.rnn.rnn_cell.MultiRNNCell(...)',然後運行'network(input,current_state)'產生一個輸出和一個新的狀態。例如,您可以忽略這個新狀態並再次輸入'current_state'。 –

+0

是的,對不起,也許我不夠清楚。當我訓練LSTM網絡時,我給它提供了一個長度爲n_timesteps的列表([batch_size,39_MFCC])。我想知道如果我實現了狀態將每n_timesteps復位: 'multi_lstm = rnn_cell.MultiRNNCell([lstm_cell] * config.num_layers) init_state = multi_lstm.zero_state(batch_size,tf.float32) outputs,states = rnn.rnn(multi_lstm,tmp,dtype = tf.float32,initial_state = init_state)' – Chris

+0

除非明確地做,否則沒有理由重置狀態。我沒有看到代碼中的'n_timesteps' ---你會引用截斷的反向傳播嗎? –

回答

1

ptb_word_lm.pyself._initial_state在整個程序只設置一次:

self._initial_state = cell.zero_state(batch_size, data_type()) 

這意味着,它仍然是一個常數零向量。因此,展開LSTM的初始狀態始終爲零。批量饋送後,您無需顯式重置內存。

如果您想要手動更新LSTM的狀態/ self._initial_state,則需要將其定義爲變量而不是張量。有關更多信息,請參閱here的答案。

+0

如果這是真的,這是不是說,通過lstm(沒有訓練)兩次通過批次會產生相同的輸出? – npit

+1

@npit對於無狀態的LSTM,是的。 –