2017-04-01 41 views
1

我们有一个在Android上运行的工作TensorFlow网络(graphdef),我注意到随着时间推移的结果往往是相关的。这就是说,如果标签A被返回,那么即使当输入数据切换到应该生成B标签的数据时,它也往往是A的一串时间流。最终,结果将切换到B,但似乎有滞后,并表明RNN在推理调用之间是有状态的。我们的网络正在使用RNN/LSTM。TensorFlow:在Android中的推理之间初始化RNN的状态

cellLSTM = tf.nn.rnn_cell.BasicLSTMCell(nHidden) 
cellsLSTM = tf.nn.rnn_cell.MultiRNNCell([cellLSTM] * 2) 
RNNout, RNNstates = tf.nn.rnn(cellsLSTM, Xin) 

我想知道是否需要在推理调用之间重新初始化RNN状态。我会注意到在TensorFlowInferenceInterface.java接口中没有这种方法可用。我想,可以将一个RNN单元初始化节点插入到可以用节点值激活的图形中(使用FillNodeInt或类似的方法)。

所以我的问题是:在Tensorflow中RNN/LSTMs的最佳做法是什么。是否需要在推理之间清除状态?如果是这样,一个人怎么做?

回答

0

虽然我不能评论RNN状态初始化的一般做法,但下面是我们如何设法强制初始状态定义。问题是,虽然批量大小确实是训练集的常量参数,但它不适用于测试集。测试集始终是数据语料库的20%,因此每次对语料库进行更改时其大小都不相同。
的解决方案是创建一个新的变量为BATCHSIZE:

batch_size_T = tf.shape(Xin)[0] 

其中Xin是大小并[b×m的X n],其中b是批量大小和m x n是训练帧的大小的输入张量。辛从feed_dict喂食。

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

是否需要在推理之间清除状态?

我认为这取决于如何训练RNN以及如何使用它。但是,我猜想,无论是否重置状态,网络都可以很好地工作。

如何做到这一点?

评估与初始状态相关的每个张量的初始化操作。

+0

相反,RNNs可以向前携带状态:

initial_state = lstm_cells.zero_state(batch_size_T, tf.float32) 

最后,RNN在新的动态RNN来定义:如

初始状态可以然后被定义随着时间的推移未初始化时,如果使用培训课程中的随机系列帧进行训练,则它们在实际数据中的可预测性往往较差。所以确保它以零状态开始每一帧都很重要。我在TF Issue Board上看到一些评论,说明新的'dynamic_rnn'实现在每一帧自动初始化它的状态为零。但是,在我的情况下,我看到异常情况,并希望保证初始化作为图的一部分。 – Hephaestus