Skip to main content
 首页 » 编程设计

python之在 tensorflow 中使用 LSTM RNN 进行分类,ValueError : Shape (1, 10, 5) 必须具有等级 2

2024年08月22日29zfyouxi

我正在尝试在 tensorflow 中设计一个简单的 lstm。我想将一系列数据分为 1 到 10 类。

我有 10 个时间戳 和数据 X。我现在只采用一个序列,所以我的批量大小 = 1。 在每个时期,都会生成一个新序列。例如 X 是一个像这样的 numpy 数组-

X [[ 2.52413028  2.49449348  2.46520466  2.43625973  2.40765466  2.37938545 
     2.35144815  2.32383888  2.29655379  2.26958905]] 

为了使其适用于 lstm 输入,我首先将其转换为张量,然后对其进行整形(batch_size、sequence_lenght、输入维度)-

X= np.array([amplitude * np.exp(-t / tau)]) 
print 'X', X 
 
#Sorting out the input 
train_input = X 
train_input = tf.convert_to_tensor(train_input) 
train_input = tf.reshape(train_input,[1,10,1]) 
print 'ti', train_input 

对于输出,我在 1 到 10 的类别范围内生成一个单热编码标签。

#------------sorting out the output 
train_output= [int(math.ceil(tau/resolution))] 
train_output= one_hot(train_output, num_labels=10) 
print 'label', train_output 
 
train_output = tf.convert_to_tensor(train_output) 
 
>>label [[ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.]] 

然后我为 tensorflow 图创建了占位符,制作了 lstm 单元并给出了权重和偏差-

data = tf.placeholder(tf.float32, shape= [batch_size,len(t),1]) 
target = tf.placeholder(tf.float32, shape = [batch_size, num_classes]) 
 
cell = tf.nn.rnn_cell.LSTMCell(num_hidden) 
output, state = rnn.dynamic_rnn(cell, data, dtype=tf.float32) 
 
weight = tf.Variable(tf.random_normal([batch_size, num_classes, 1])), 
bias = tf.Variable(tf.random_normal([num_classes])) 
 
#training 
prediction = tf.nn.softmax(tf.matmul(output,weight) + bias) 
cross_entropy = -tf.reduce_sum(target * tf.log(prediction)) 
optimizer = tf.train.AdamOptimizer() 
minimize = optimizer.minimize(cross_entropy) 

到目前为止,我已经编写了代码,但在训练步骤出现了错误。这与输入形状有关吗?这是回溯---

追溯(最近的调用最后):

  File "/home/raisa/PycharmProjects/RNN_test1/test3.py", line 66, in <module> 
prediction = tf.nn.softmax(tf.matmul(output,weight) + bias) 
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 1036, in matmul 
name=name) 
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 911, in _mat_mul 
transpose_b=transpose_b, name=name) 
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 655, in apply_op 
op_def=op_def) 
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2156, in create_op 
set_shapes_for_outputs(ret) 
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1612, in set_shapes_for_outputs 
shapes = shape_func(op) 
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/common_shapes.py", line 81, in matmul_shape 
a_shape = op.inputs[0].get_shape().with_rank(2) 
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 625, in with_rank 
raise ValueError("Shape %s must have rank %d" % (self, rank)) 
ValueError: Shape (1, 10, 5) must have rank 2 

请您参考如下方法:

看看你的代码,你的 rnn 输出应该有一个维度 batch_size x 1 x num_hidden 而你的 w 有维度 batch_size x num_classes x 1 但是你想要乘法这两个是 batcH_size x num_classes。

你能试试 output = tf.reshape(output, [batch_size, num_hidden]) 和 weight = tf.Variable(tf.random_normal([num_hidden, num_classes])) 让我知道进展如何?