tf.nn.dynamic_rnn 中的排名错误

Posted

技术标签:

【中文标题】tf.nn.dynamic_rnn 中的排名错误【英文标题】:Rank error in tf.nn.dynamic_rnn 【发布时间】:2017-11-24 05:25:19 【问题描述】:

我正在尝试构建 CNN + RNN 模型,但出现以下错误。 任何帮助将不胜感激。

fc2 的形状为 (?,4096)

cell = tf.contrib.rnn.BasicLSTMCell(self.rnn_hidden_units)
stack = tf.contrib.rnn.MultiRNNCell([cell]*self.rnn_layers)
initial_state = cell.zero_state(self.batch_size, tf.float32)
initial_state = tf.identity(initial_state, name='initial_state')
outputs, _ = tf.nn.dynamic_rnn(stack, fc2,dtype=tf.float32)

文件“rcnn.py”,第 182 行,在模型中 输出,_ = tf.nn.dynamic_rnn(stack, [fc2],dtype=tf.float32) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn.py”,第 574 行,位于 dynamic_rnn dtype=dtype) _dynamic_rnn_loop 中的文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn.py”,第 637 行 对于 flat_input 中的 input_) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn.py”,第 637 行,在 对于 flat_input 中的 input_) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py”,第 649 行,在 with_rank_at_least raise ValueError("形状 %s 的排名必须至少为 %d" % (self, rank)) ValueError: Shape (4096, ?) 的排名必须至少为 3

【问题讨论】:

错误似乎很明显,tf.nn.dynamic_rnn 需要一个 3 维张量作为输入(即排名 3),但 fc2 只有两个维度。 fc2 的形状应该类似于 (<batch_size>, <max_time>, <num_features>)(或者 (<max_time>, <batch_size>, <num_features>) 如果你通过 time_major=True)。 @jdehesa 我正在拍摄一张图像(用于 ocr )并将其通过 CNN 并随后将其连接到全连接层,因此形状 fc2(?,4096) ,还有其他方法吗这样做呢? 没关系,那么“时间”维度是什么?如果您只有一个图像(即一批示例,我假设每个示例包含一个图像),您希望 RNN 迭代的维度是多少?像素,有点像 PixelRNN? @jdehesa 我正在关注这篇论文:arxiv.org/pdf/1603.03101.pdf。他们提到了一种架构,在该架构中,他们从 Image 中提取的特征执行字符级语言建模。如果您能提出如何实施的建议,那将非常有帮助。 对不起,我对那些模型了解不多...对于角色级别的建模,我认为可能类似于堆叠 N 个卷积结果的副本并将其输入到 RNN,然后每个 K 向量输出将是每个字母的概率,但我不太确定...... 【参考方案1】:

从他的评论中复制@jdehesa 的答案以获得更好的可见性:

错误似乎很明显,tf.nn.dynamic_rnn 期望输入一个 3 维张量(即等级 3),但 fc2 只有两个维度。 fc2 的形状应该类似于 (<batch_size>, <max_time>, <num_features>) (或 (<max_time>, <batch_size>, <num_features>) 如果您通过 time_major=True

【讨论】:

【参考方案2】:

tf.nn.dynamic_rnn 的默认输入维度为 3(Batchsize、sequence_length、num_features)。由于您的 num_features 为 1,您可以使用

扩展您的 fc_seq
fc2 = tf.expand_dims(fc2, axis = 2)

然后使用上面的代码。

【讨论】:

很好,谢谢你的提示。对我来说,这是向 2D 数据添加批量维度所缺少的部分。

以上是关于tf.nn.dynamic_rnn 中的排名错误的主要内容,如果未能解决你的问题,请参考以下文章

tf.contrib.rnn.static_rnn与tf.nn.dynamic_rnn区别

深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expa

在 Dynamic_RNN 中使用可变序列长度时是不是应该进行丢失屏蔽

deep_learning_Function_LSTM_dynamic_rnn

tf.nn.rnn_cell.MultiRNNCell

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