2016-08-01 83 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,是的。 –