我正在 Python 中使用 Tensorflow 训练 LSTM 网络,并希望切换到 tf.contrib.cudnn_rnn.CudnnLSTM 以加快训练速度。我所做的被替换
cells = tf.nn.rnn_cell.LSTMCell(self.num_hidden)
initial_state = cells.zero_state(self.batch_size, tf.float32)
rnn_outputs, _ = tf.nn.dynamic_rnn(cells, my_inputs, initial_state = initial_state)
with
lstm = tf.contrib.cudnn_rnn.CudnnLSTM(1, self.num_hidden)
rnn_outputs, _ = lstm(my_inputs)
我的训练速度显着提升(超过 10 倍),但同时我的性能指标却下降了。使用 LSTMCell 时,二元分类的 AUC 为 0.741,使用 CudnnLSTM 时,二元分类的 AUC 为 0.705。我想知道我是否做错了什么,或者这两者之间的实现存在差异,这就是如何在继续使用 CudnnLSTM 的同时恢复性能的情况。
训练数据集有 15,337 个不同长度的序列(最多几百个元素),这些序列用零填充,以便在每个批次中具有相同的长度。所有代码都是相同的,包括 TF 数据集 API 管道和所有评估指标。我运行了每个版本几次,并且在所有情况下它都收敛于这些值。
此外,我几乎没有可以插入完全相同模型的数据集,并且所有这些数据集都存在问题。
In the cudnn_rnn 的张量流代码我找到一句话说:
Cudnn LSTM 和 GRU 在数学上不同于它们的 tf
同行。
但没有解释这些差异到底是什么......