Tensorflow RNN序列训练

时间:2016-10-08 15:18:35

标签: tensorflow

我正在学习TF的第一步,并且在训练RNN时遇到一些麻烦。

我的玩具问题是这样的:两层LSTM +密集层网络提供原始音频数据,并应测试声音中是否存在某个频率。

所以网络应该将1到1的float(音频数据序列)映射到float(预选频率音量)

我已经将这个用于Keras并看到了类似的TFLearn解决方案,但我希望以相对有效的方式在裸Tensorflow上实现这一点。

我做了什么:

lstm = rnn_cell.BasicLSTMCell(LSTM_SIZE,state_is_tuple=True,forget_bias=1.0)
lstm = rnn_cell.DropoutWrapper(lstm)
stacked_lstm = rnn_cell.MultiRNNCell([lstm] * 2,state_is_tuple=True)
outputs, states = rnn.dynamic_rnn(stacked_lstm, in, dtype=tf.float32)
outputs = tf.transpose(outputs, [1, 0, 2])
last = tf.gather(outputs, int(outputs.get_shape()[0]) - 1)
network= tf.matmul(last, W) + b

# cost function, optimizer etc...

在培训过程中,我用(BATCH_SIZE,SEQUENCE_LEN,1)批次进行了这项补充,看起来损失正确,但我无法弄清楚如何用经过训练的网络进行预测。

我的(很多)问题: 如何让这个网络从Tensorflow直接返回一个序列而不返回每个样本的python(提供一个序列并预测相同大小的序列)?

如果我想一次预测一个样本并在python中迭代,那么正确的方法是什么?

测试期间是否需要dynamic_rnn,或者它仅用于在培训期间展开BPTT?为什么dynamic_rnn返回所有反向传播步骤?这些是展开网络的每一层的输出吗?

1 个答案:

答案 0 :(得分:0)

经过一番研究后

  

如何使此网络从Tensorflow直接返回序列   没有回到每个样本的python(提供一个序列和   预测相同大小的序列?)

你可以使用state_saving_rnn

std::vector<int> a(n);

一个问题是state_saving_rnn正在使用rnn()而不是dynamic_rnn()因此在编译时展开EVAL_SEQ_LEN步骤如果要输入长序列,可能需要使用dynamic_rnn重新实现state_saving_rnn

  

如果我想一次预测一个样本并在python中迭代,那么正确的方法是什么?

您可以使用dynamic_rnn并提供initial_state。这可能和state_saving_rnn一样有效。查看state_saving_rnn实现以供参考

  

测试期间是否需要dynamic_rnn,或者它仅用于在培训期间展开BPTT?为什么dynamic_rnn返回所有反向传播步骤?这些是展开网络的每一层的输出吗?

dynamic_rnn确实在运行时展开,类似于编译时间rnn()。我想它会返回你在其他地方分支图表的所有步骤 - 经过较少的时间步骤。在使用[一步输入*当前状态 - &gt;的网络中一个输出,新状态]如上所述,它在测试中不需要,但可用于训练截断时间反向传播