我正在学习TF的第一步,并且在训练RNN时遇到一些麻烦 .
我的玩具问题是这样的:两层LSTM密集层网络提供原始音频数据,并应测试声音中是否存在某个频率 .
所以网络应该1到1映射浮点(音频数据序列)浮点(预选频率音量)
我已经在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 回答
经过一番研究:
你可以使用state_saving_rnn
一个问题是state_saving_rnn正在使用rnn()而不是dynamic_rnn()因此在编译时展开EVAL_SEQ_LEN步骤如果要输入长序列,可能需要使用dynamic_rnn重新实现state_saving_rnn
你可以使用dynamic_rnn并提供initial_state . 这可能和state_saving_rnn一样有效 . 查看state_saving_rnn实现以供参考
与编译时间rnn()类似,dynamic_rnn确实在运行时展开 . 我猜它会返回你在其他地方分支图表的所有步骤 - 经过较少的时间步骤 . 在使用[一次性输入*当前状态 - >一个输出,新状态]的网络中,如上所述,在测试中不需要它,但可用于训练截断时间反向传播