TensorFlow:如何使用具有可变输入长度的 CudnnLSTM(如 dynamic_rnn)?

Posted

技术标签:

【中文标题】TensorFlow:如何使用具有可变输入长度的 CudnnLSTM(如 dynamic_rnn)?【英文标题】:TensorFlow: How to use CudnnLSTM with variable input length (like dynamic_rnn)? 【发布时间】:2017-03-09 18:44:49 【问题描述】:

我想加快我的 LSTM 网络,但是因为我将它用于 OCR(其中序列具有可变长度),所以我不能使用普通的 LSTM 实现。这就是我使用“tf.nn.dynamic_rnn”的原因。

基于 tensorflow (https://github.com/tensorflow/tensorflow/blob/754048a0453a04a761e112ae5d99c149eb9910dd/tensorflow/contrib/cudnn_rnn/python/kernel_tests/cudnn_rnn_ops_benchmark.py#L77) 中的 RNN 基准,CUDNN 实现用于一次创建所有模型(它不像其他使用“tf.nn.rnn”结构)。我认为使用可变长度的 CUDNN 可能是不可能的,但也许有人成功了吗?

其次,这是使用“tf.nn.bidirectional_dynamic_rnn”,因为我想将 Bi-LSTM 用于 OCR。但这应该在实施第一部分后解决。

编辑:看起来“tf.contrib.cudnn_rnn.CudnnLSTM”内部有“双向”实现。所以唯一未知的是CUDNN可以与可变输入序列一起使用。

或者任何使用“CudnnLSTM”的工作示例都会有所帮助。

【问题讨论】:

在此处查看 CudnnLSTM 运算符的测试:github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/…。他们会帮助回答您的问题吗? 【参考方案1】:

刚刚找到这个:

tf.contrib.cudnn_rnn.CudnnLSTM 目前不支持具有不同长度序列的批次,因此这通常不是一个使用选项。

来源:http://returnn.readthedocs.io/en/latest/tf_lstm_benchmark.html

【讨论】:

【参考方案2】:

TensorFlow 很快将最终支持可变序列长度:https://github.com/tensorflow/tensorflow/blob/2f672ee9562a452f8dbfa259a8ccec56367e9b17/tensorflow/contrib/cudnn_rnn/python/layers/cudnn_rnn.py#L389

看起来它对于 1.13 来说太晚了,所以它可能只在 TensorFlow 1.14 上可用。

您现在可以通过安装tf-nightly-gpu 包并传递sequence_lengths=lengths 来试用它,其中lenghtstf.int32 张量,形状为[batch_size],包含批处理中每个序列的长度。

【讨论】:

以上是关于TensorFlow:如何使用具有可变输入长度的 CudnnLSTM(如 dynamic_rnn)?的主要内容,如果未能解决你的问题,请参考以下文章

在 TensorFlow 中处理可变长度文本

如何使用 TensorFlow 后端屏蔽 Keras 中的损失函数?

测试精度 0.5 TensorFlow RNN 可变长度字符串

Tensorflow 可变图像输入大小(自动编码器,放大...)

具有可变长度序列的 RNN/LSTM 库,无需分桶或填充

如何让这个 OCR 模型与可变长度示例一起工作?