Java TensorFlow:Android中推理之间RNN的初始化状态

Java TensorFlow:Android中推理之间RNN的初始化状态,java,android,tensorflow,lstm,Java,Android,Tensorflow,Lstm,我们有一个运行在Android上的TensorFlow网络(graphdef),我注意到随着时间的推移,推断结果往往是相关的。也就是说,如果返回标签A,则往往会有一个随时间而来的A流,即使当输入数据切换到应生成B标签的数据时也是如此。最终,结果将切换到B,但似乎存在延迟,并表明RNN在推理调用之间是有状态的。我们的网络正在使用RNN/LSTM cellLSTM = tf.nn.rnn_cell.BasicLSTMCell(nHidden) cellsLSTM = tf.nn.rnn_c

我们有一个运行在Android上的TensorFlow网络(graphdef),我注意到随着时间的推移,推断结果往往是相关的。也就是说,如果返回标签A,则往往会有一个随时间而来的A流,即使当输入数据切换到应生成B标签的数据时也是如此。最终,结果将切换到B,但似乎存在延迟,并表明RNN在推理调用之间是有状态的。我们的网络正在使用RNN/LSTM

cellLSTM    = tf.nn.rnn_cell.BasicLSTMCell(nHidden)
cellsLSTM   = tf.nn.rnn_cell.MultiRNNCell([cellLSTM] * 2)
RNNout, RNNstates = tf.nn.rnn(cellsLSTM, Xin)
我想知道是否需要在推理调用之间重新初始化RNN状态。我将注意到TensorFlowEnferenceInterface.java接口中没有这样的方法。我认为可以将一个RNN单元初始化节点插入到可以使用节点值激活的图中(使用FillNodeInt或类似工具)

所以我的问题是:在Tensorflow中,RNN/LSTM的最佳实践是什么。一个人是否需要澄清推论之间的状态?如果是这样的话,人们是如何做到的

一个人是否需要澄清推论之间的状态

我认为这取决于RNN是如何培训的,以及您是如何使用它的。但是,我猜网络在重置状态和不重置状态的情况下都会工作得很好

怎么做

计算与初始状态关联的每个张量的初始化操作

一个人是否需要澄清推论之间的状态

我认为这取决于RNN是如何培训的,以及您是如何使用它的。但是,我猜网络在重置状态和不重置状态的情况下都会工作得很好

怎么做


计算与初始状态关联的每个张量的初始化操作

虽然我不能评论RNN状态初始化的一般实践,但下面是我们如何强制初始状态定义的。问题是,虽然批量大小确实是训练集的一个恒定参数,但它不是测试集的参数。测试集始终占数据语料库的20%,因此其大小随语料库的每次更改而不同。
解决方案是为batchsize创建一个新变量:

batch_size_T  = tf.shape(Xin)[0]
其中,
Xin
是大小[b x m x n]的输入张量,
b
是批量大小,
m x n
是训练帧的大小。Xin从
馈送目录馈送

初始状态可定义为:

initial_state = lstm_cells.zero_state(batch_size_T, tf.float32) 
最后,根据新的动态RNN定义RNN:

outputs, state = tf.nn.dynamic_rnn(cell=lstm_cells, inputs=Xin, dtype=tf.float32, initial_state=initial_state)

虽然我不能评论RNN状态初始化的一般实践,但下面是我们如何强制初始状态定义的。问题是,虽然批量大小确实是训练集的一个恒定参数,但它不是测试集的参数。测试集始终占数据语料库的20%,因此其大小随语料库的每次更改而不同。
解决方案是为batchsize创建一个新变量:

batch_size_T  = tf.shape(Xin)[0]
其中,
Xin
是大小[b x m x n]的输入张量,
b
是批量大小,
m x n
是训练帧的大小。Xin从
馈送目录馈送

初始状态可定义为:

initial_state = lstm_cells.zero_state(batch_size_T, tf.float32) 
最后,根据新的动态RNN定义RNN:

outputs, state = tf.nn.dynamic_rnn(cell=lstm_cells, inputs=Xin, dtype=tf.float32, initial_state=initial_state)

相反,RNN可以随着时间的推移将状态向前推进。未初始化时,如果使用训练会话中的随机帧序列进行训练,则它们在实际数据中往往不太可预测。因此,确保以零状态开始每个帧非常重要。我在TF发行版上看到一些评论,新的
dynamic\u rnn
实现会在每一帧自动将其状态初始化为零。然而,在我的例子中,我看到了异常,并希望保证初始化是图形的一部分。相反,RNN可以随着时间的推移将状态向前推进。未初始化时,如果使用训练会话中的随机帧序列进行训练,则它们在实际数据中往往不太可预测。因此,确保以零状态开始每个帧非常重要。我在TF发行版上看到一些评论,新的
dynamic\u rnn
实现会在每一帧自动将其状态初始化为零。然而,在我的例子中,我看到了异常情况,并希望保证初始化是图形的一部分。