gpt4 book ai didi

python - 与 Tensorflow 中的常规 LSTMCell 相比,使用 CudnnLSTM 训练时的不同结果

转载 作者:太空狗 更新时间:2023-10-29 21:09:13 24 4
gpt4 key购买 nike

我正在使用 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)

lstm = tf.contrib.cudnn_rnn.CudnnLSTM(1, self.num_hidden)
rnn_outputs, _ = lstm(my_inputs)

我正在经历显着的训练加速(超过 10 倍),但与此同时我的性能指标却下降了。使用 LSTMCell 时二元分类的 AUC 为 0.741,使用 CudnnLSTM 时为 0.705。我想知道我是否做错了什么,或者这两者之间的实现方式不同,这就是如何在继续使用 CudnnLSTM 的同时恢复我的性能的情况。

训练数据集有 15,337 个不同长度的序列(最多几百个元素),这些序列用零填充以在每批中保持相同的长度。所有代码都是相同的,包括 TF 数据集 API 管道和所有评估指标。我对每个版本都运行了几次,在所有情况下它都围绕这些值收敛。

此外,我几乎没有数据集可以插入到完全相同的模型中,但问题仍然存在于所有这些模型中。

tensorflow code for cudnn_rnn我找到一句话说:

Cudnn LSTM and GRU are mathematically different from their tf counterparts.

但是没有解释这些差异到底是什么...

最佳答案

看起来 tf.contrib.cudnn_rnn.CudnnLSTM 是时间主要的,所以应该为那些提供形状序列 (seq_len, batch_size, embedding_size) 而不是 (batch_size, seq_len, embedding_size),所以你必须转置它(我认为,当涉及到凌乱的 Tensorflow 文档时,你不能确定,但​​你可能想测试一下。如果有的话,请参见下面的链接你想检查一下)。

有关该主题的更多信息 here (还有另一个指向数学差异的链接),除了一件事似乎是错误的:不仅 GRU 是时间主要的,LSTM 也是(如 this issue 所指出的)。

我会建议反对使用tf.contrib,因为它更加困惑(并且最终将被排除在 Tensorflow 2.0 版本之外)并坚持使用 keras 如果可能(因为它将成为即将到来的 Tensorflow 2.0 的主要前端)或 tf.nn,因为它将成为 tf.Estimator< 的一部分 API(尽管 IMO 的可读性差得多)。

... 或者考虑使用 PyTorch 来省去麻烦,至少在文档中提供了输入形状(及其含义)。

关于python - 与 Tensorflow 中的常规 LSTMCell 相比,使用 CudnnLSTM 训练时的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54559111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com