Tensorflow 张量流RNN序列训练

Tensorflow 张量流RNN序列训练,tensorflow,Tensorflow,我正在迈出学习TF的第一步,但在训练RNN时遇到了一些困难 我的玩具问题是这样的:两层LSTM+密集层网络接收原始音频数据,应该测试声音中是否存在特定频率 因此,网络应1:1将浮点(音频数据序列)映射为浮点(预先选择的频率音量) 我已经在Keras上完成了这项工作,并看到了类似的TFLearn解决方案,但我希望以相对有效的方式在bare Tensorflow上实现这项功能 我所做的: lstm = rnn_cell.BasicLSTMCell(LSTM_SIZE,state_is_tuple=T

我正在迈出学习TF的第一步,但在训练RNN时遇到了一些困难

我的玩具问题是这样的:两层LSTM+密集层网络接收原始音频数据,应该测试声音中是否存在特定频率

因此,网络应1:1将浮点(音频数据序列)映射为浮点(预先选择的频率音量)

我已经在Keras上完成了这项工作,并看到了类似的TFLearn解决方案,但我希望以相对有效的方式在bare 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...
在训练过程中,我用(批次大小,序列长度,1)个批次进行了反馈,似乎损失收敛正确,但我不知道如何用训练过的网络进行预测

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

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

在测试过程中,是否需要动态\u rnn,或者仅用于在培训过程中展开BPTT?为什么dynamic\n返回所有反向传播步骤张量?这些是展开网络各层的输出,对吗?

经过一些研究:

如何让这个网络从Tensorflow返回一个序列 不必为每个示例返回python(提供一个序列和 预测相同大小的序列)

您可以使用状态保存

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)]
class Saver():
定义初始化(自):
self.d={}
def状态(自身、名称):
如果在self.d中没有名称:
返回tf.zero([1,LSTM_SIZE],tf.float32)
返回self.d[名称]
def保存状态(自身、名称、val):
self.d[name]=val
经过一些研究后返回tf.identity('save_state_name')#:

如何让这个网络从Tensorflow返回一个序列 不必为每个示例返回python(提供一个序列和 预测相同大小的序列)

您可以使用状态保存

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)]
class Saver():
定义初始化(自):
self.d={}
def状态(自身、名称):
如果在self.d中没有名称:
返回tf.zero([1,LSTM_SIZE],tf.float32)
返回self.d[名称]
def保存状态(自身、名称、val):
self.d[name]=val
返回tf.identity('save\u state\u name')#