Python 在tensorflow中使用LSTM RNN进行分类,值错误:形状(1、10、5)必须具有等级2

Python 在tensorflow中使用LSTM RNN进行分类,值错误:形状(1、10、5)必须具有等级2,python,tensorflow,deep-learning,recurrent-neural-network,lstm,Python,Tensorflow,Deep Learning,Recurrent Neural Network,Lstm,我试图在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]] 为了使其适合l

我试图在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输入,我首先将其转换为张量,然后对其进行重塑(批量大小、序列长度、输入维度)-

对于输出,我将在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)
到目前为止,我已经编写了代码,但在培训步骤中出现了错误。这与输入形状有关吗?这是回溯---

回溯(最近一次呼叫最后一次):

文件“/home/raisa/PycharmProjects/RNN_test1/test3.py”,第66行,在
预测=tf.nn.softmax(tf.matmul(输出,权重)+偏差)
matmul中的文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/ops/math_ops.py”,第1036行
名称=名称)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/ops/gen\u math\u ops.py”,第911行,in\u mat\u mul
转置b=转置b,名称=名称)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/ops/op_def_library.py”,第655行,在apply_op
op_def=op_def)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/framework/ops.py”,第2156行,在create_op中
为输出设置形状(ret)
文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py”,第1612行,用于输出的集合形状
形状=形状函数(op)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/ops/common_shapes.py”,第81行,matmul_形状
a_shape=op.inputs[0]。使用_秩(2)获取_shape()
文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_-shape.py”,第625行,带_-rank
raise VALUERROR(“形状%s必须具有秩%d”%(自身,秩))
ValueError:形状(1、10、5)必须具有等级2

查看您的代码,rnn输出的维度应该是
批量大小x1 x num\u隐藏
,而w的维度是
批量大小x1个num\u类x1
,但是您希望这两个维度的乘积是
批量大小x1个num\u类


您可以尝试一下
output=tf.reformate(output[batch\u size,num\u hidden])
weight=tf.Variable(tf.random\u normal([num\u hidden,num\u classes])
并告诉我这是怎么回事吗?

如果您使用的是tf>=1.0,您可以利用这个库和添加一个完全连接的层到RNN的输出。比如:

# Network definition.
cell = tf.contrib.rnn.LSTMCell(num_hidden)
cell = tf.contrib.rnn.OutputProjectionWrapper(cell, num_classes)  # adds an output FC layer for you
output, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32)

# Training.
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=output, labels=targets)
cross_entropy = tf.reduce_sum(cross_entropy)
optimizer = tf.train.AdamOptimizer()
minimize = optimizer.minimize(cross_entropy)
注意:我正在使用
softmax\u cross\u entropy\u和
而不是使用您的
预测
op手动计算交叉熵。它应该更高效、更健壮


OutputProjectionWrapper
基本上做了相同的事情,但它可能有助于缓解一些头痛问题。

感谢您的回复。我仍然不太确定RNN输出的形状应该是什么。我试着按照你的建议,将其重塑为[batch_size,num_hidden],将权重重塑为[num_hidden,num_classes],但我得到了一个错误,即,`ValueError:Dimensions 10和5不兼容`现在RNN输出的形状为
张量(“重塑_1:0”,形状=(5,10),dtype=float32)
但权重矩阵的形状为
张量(“Shape:0”,Shape=(2,),dtype=int32)
因此,当您将权重矩阵初始化为
eight=tf.Variable(tf.random\u normal([num\u hidden,num\u classes])时,它具有该形状。
  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
# Network definition.
cell = tf.contrib.rnn.LSTMCell(num_hidden)
cell = tf.contrib.rnn.OutputProjectionWrapper(cell, num_classes)  # adds an output FC layer for you
output, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32)

# Training.
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=output, labels=targets)
cross_entropy = tf.reduce_sum(cross_entropy)
optimizer = tf.train.AdamOptimizer()
minimize = optimizer.minimize(cross_entropy)