首页 文章

Tensorflow RNN序列训练

提问于
浏览
1

我正在学习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 回答

  • 0

    经过一番研究:

    如何让这个网络从Tensorflow返回一个序列,而不是为每个样本返回python(提供序列并预测相同大小的序列)?

    你可以使用state_saving_rnn

    class Saver():
    def __init__(self):
        self.d = {}
    def state(self, name):
        if not name in self.d:
            return tf.zeros([1,LSTM_SIZE],tf.float32)
        return self.d[name]
    def save_state(self, name, val):
        self.d[name] = val
        return tf.identity('save_state_name') #<-important for control_dependencies
    
    outputs, states = rnn.state_saving_rnn(stacked_lstm, inx, Saver(),
                                           ('lstmstate', 'lstmstate2', 'lstmstate3', 'lstmstate4'),sequence_length=[EVAL_SEQ_LEN])
    #4 states are for two layers of lstm each has hidden and CEC variables to restore
    network = [tf.matmul(outputs[-1], W) for i in xrange(EVAL_SEQ_LEN)]
    

    一个问题是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返回所有反向传播步骤?这些是展开网络的每一层的输出吗?

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

相关问题