我想加速我的LSTM网络,但是当我将它用于OCR(序列具有可变长度)时,我不能使用普通的LSTM实现。这就是我使用“tf.nn.dynamic_rnn”的原因。
基于张量流中的RNN基准(https://github.com/tensorflow/tensorflow/blob/754048a0453a04a761e112ae5d99c149eb9910dd/tensorflow/contrib/cudnn_rnn/python/kernel_tests/cudnn_rnn_ops_benchmark.py#L77),CUDNN实现用于一次创建所有模型(它不像其他模型那样使用“tf.nn.rnn”结构)。我假设可能不可能使用可变长度的CUDNN,但也许任何人都成功了吗?
其次,这是使用“tf.nn.bidirectional_dynamic_rnn”,因为我想将Bi-LSTM用于OCR。但这应该在实施第一部分后解决。
编辑:看起来“tf.contrib.cudnn_rnn.CudnnLSTM”里面有“双向”实现。所以唯一未知的是CUDNN可以与变量输入序列一起使用。
或许任何使用'CudnnLSTM'的工作示例都会有所帮助。
答案 0 :(得分:6)
刚刚发现:
tf.contrib.cudnn_rnn.CudnnLSTM目前不支持具有不同长度序列的批次,因此通常不能使用此选项。
来源:http://returnn.readthedocs.io/en/latest/tf_lstm_benchmark.html
答案 1 :(得分:1)
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
来进行尝试,其中lenghts
是tf.int32
的张量,其形状为[batch_size]
,其中包含长度批次中每个序列的数量。