【问题标题】:Tensorflow LSTM throws ValueError: Shape () must have rank at least 2Tensorflow LSTM 抛出 ValueError: Shape () must have rank at least 2
【发布时间】:2018-06-01 08:24:44
【问题描述】:

尝试运行时,抛出如下异常(ValueError)

ValueError: Shape () must have rank at least 2

这是针对以下行抛出的:

states_series, current_state = tf.contrib.rnn.static_rnn(cell, inputs_series, init_state)

这里定义了cell

cell = tf.contrib.rnn.BasicLSTMCell(state_size, state_is_tuple=True)

查看RNNTesor_shape 的规则,我可以看出这是某种张量维度形状问题。据我所知,它没有将BasicLSTMCell 视为 2 级矩阵?

完全错误:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/glennhealy/PycharmProjects/firstRNNTest/LSTM-RNN.py
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
  return f(*args, **kwds)
Traceback (most recent call last):
  File "/Users/glennhealy/PycharmProjects/firstRNNTest/LSTM-RNN.py", line 42, in <module>
    states_series, current_state = tf.contrib.rnn.static_rnn(cell, inputs_series, init_state)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py", line 1181, in static_rnn
    input_shape = first_input.get_shape().with_rank_at_least(2)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/tensor_shape.py", line 670, in with_rank_at_least
    raise ValueError("Shape %s must have rank at least %d" % (self, rank))
ValueError: Shape () must have rank at least 2

Process finished with exit code 1

代码:

state_size = 4
cell = tf.contrib.rnn.BasicLSTMCell(state_size, state_is_tuple=True)
states_series, current_state = tf.contrib.rnn.static_rnn(cell, inputs_series, init_state)

张量流 1.2.1 蟒蛇 3.6 数字化

更新更多信息:

考虑到@Maxim 给出的建议,我可以看到问题出在我的input_series 上,这导致了形状问题,但是,我似乎无法理解他的建议。

更多信息可以帮助解决问题,看看我是否能理解如何解决这个问题:

以下内容会替代我的 BatchY 和 BatchX 占位符吗??

X = tf.placeholder(dtype=tf.float32, shape=[None, n_steps, n_inputs])
X_seqs = tf.unstack(tf.transpose(X, perm=[1, 0, 2]))
basic_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=n_neurons)
output_seqs, states = tf.nn.static_rnn(basic_cell, X_seqs,         dtype=tf.float32)

那么,我是否必须对以下内容进行更改以反映以下内容的语法?

batchX_placeholder = tf.placeholder(tf.int32, [batch_size,      truncated_backprop_length])
batchY_placeholder = tf.placeholder(tf.float32, [batch_size,    truncated_backprop_length])

#unpacking the columns:
labels_series = tf.unstack(batchY_placeholder, axis=1)
inputs_series = tf.split(1, truncated_backprop_length, batchX_placeholder)

#Forward pass
cell = tf.contrib.rnn.BasicLSTMCell(state_size, state_is_tuple=True)
states_series, current_state = tf.contrib.rnn.static_rnn(cell, inputs_series, init_state)

losses = [tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels) for logits, labels in zip(logits_series,labels_series)]
total_loss = tf.reduce_mean(losses)

【问题讨论】:

  • 会不会是 input_series? inputs_series = tf.split(1, truncated_backprop_length, batchX_placeholder) labels_series = tf.unstack(batchY_placeholder, axis=1)

标签: python tensorflow neural-network lstm recurrent-neural-network


【解决方案1】:

是的,问题出在inputs_series。根据错误,它是一个形状为()的张量,即只是一个数字。

来自tf.nn.static_rnn 文档:

inputs:长度为 T 的输入列表,每个输入的形状为 [batch_size, input_size] 的张量,或此类元素的嵌套元组。

在大多数情况下,您希望 inputs[seq_length, None, input_size],其中:

  • seq_length 是序列长度,或 LSTM 单元的数量。
  • None 代表批量大小(任意)。
  • input_size 是每个单元格的特征数。

因此,请确保您的占位符(以及由此转换而来的 inputs_series)具有适当的形状。示例:

X = tf.placeholder(dtype=tf.float32, shape=[None, n_steps, n_inputs])
X_seqs = tf.unstack(tf.transpose(X, perm=[1, 0, 2]))
basic_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=n_neurons)
output_seqs, states = tf.nn.static_rnn(basic_cell, X_seqs, dtype=tf.float32)

更新:

这是分割张量的错误方法:

# WRONG!
inputs_series = tf.split(1, truncated_backprop_length, batchX_placeholder)

你应该这样做(注意参数的顺序):

inputs_series = tf.split(batchX_placeholder, truncated_backprop_length, axis=1)

【讨论】:

  • 那么,您是说我需要修改 Input_Series 以反映您的示例?鉴于,X = tf.placeholder(dtype=tf.float32, shape=[None, n_steps, n_inputs]) X_seqs = tf.unstack(tf.transpose(X, perm=[1, 0, 2])) 基本上是输入系列,不是吗?以下行基本上是我的单元格声明? output_seqs, states = tf.nn.static_rnn(basic_cell, X_seqs, dtype=tf.float32)
  • 所以,我的占位符已经定义为 batchY 和 batchX batchX_placeholder = tf.placeholder(tf.int32, [batch_size, truncated_backprop_length]) batchY_placeholder = tf.placeholder(tf.float32, [batch_size, truncated_backprop_length]) 然后我的列解包 labels_series = tf.unstack(batchY_placeholder, axis=1) inputs_series = tf.split(1, truncated_backprop_length, batchX_placeholder) 前向传递 cell = tf.contrib.rnn.BasicLSTMCell(state_size, state_is_tuple=True) states_series, current_state = tf.contrib.rnn.static_rnn(cell, inputs_series, init_state)
  • @Glennismade 请更新您的问题。从 cmets 读取代码真的很难
  • 抱歉,用新信息更新了问题。干杯
  • @Maim,天哪,谢谢。我是个白痴。哈哈欢呼。这似乎解决了这个问题。我还有一些其他的事情要解决,但这让我发疯了。非常感谢。
猜你喜欢
  • 2018-10-20
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2017-02-04
  • 2019-07-15
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多