ValueError:将形状转换为TensorShape时出错:尺寸-5必须>> = 0

时间:2018-04-26 18:25:05

标签: tensorflow

我不知道这个错误是如何产生的。我正在尝试将输入格式更改为RNN,并打印出原始版本(有效)和修改版本(崩溃)中的张量。

功能:

LABEL= Tensor("concat_1:0", shape=(?, 2), dtype=float32, device=/device:CPU:0) (?, 2)
inputs=Tensor("concat:0", shape=(?, 8), dtype=float32, device=/device:CPU:0)
x=[<tf.Tensor 'split:0' shape=(?, 1) dtype=float32>,
   <tf.Tensor 'split:1' shape=(?, 1) dtype=float32>,
   <tf.Tensor 'split:2' shape=(?, 1) dtype=float32>,
   <tf.Tensor 'split:3' shape=(?, 1) dtype=float32>,
   <tf.Tensor 'split:4' shape=(?, 1) dtype=float32>,
   <tf.Tensor 'split:5' shape=(?, 1) dtype=float32>,
   <tf.Tensor 'split:6' shape=(?, 1) dtype=float32>,
   <tf.Tensor 'split:7' shape=(?, 1) dtype=float32>]
last outputs=Tensor("rnn/rnn/basic_lstm_cell/mul_23:0", shape=(?, 3), dtype=float32)
PREDICTION Tensor("add:0", shape=(?, 2), dtype=float32) 
LOSS Tensor("mean_squared_error/value:0", shape=(), dtype=float32)

BROKEN:

X= 5 Tensor("Const:0", shape=(49, 10), dtype=float32, device=/device:CPU:0)
labels= Tensor("Const_5:0", shape=(49, 10), dtype=float32)
OUTPUTS Tensor("rnn/rnn/basic_lstm_cell/mul_14:0", shape=(49, 5), dtype=float32)
PREDICTIONS Tensor("add:0", shape=(49, 10), dtype=float32)
LABELS Tensor("Const_5:0", shape=(49, 10), dtype=float32)
LOSS Tensor("mean_squared_error/value:0", shape=(), dtype=float32)

以下是模型的代码,每个代码都相同:

lstm_cell = rnn.BasicLSTMCell(LSTM_SIZE, forget_bias=1.0)
outputs, _ = tf.nn.static_rnn(lstm_cell, x, dtype=tf.float32)
outputs = outputs[-1]
print('-->OUTPUTS', outputs)
weight = tf.Variable(tf.random_normal([LSTM_SIZE, N_OUTPUTS]))
bias = tf.Variable(tf.random_normal([N_OUTPUTS]))
predictions = tf.matmul(outputs, weight) + bias
print('-->PREDICTIONS', predictions)
print('-->LABELS', labels)
loss = tf.losses.mean_squared_error(labels, predictions)
print('-->LOSS', loss)
train_op = tf.contrib.layers.optimize_loss(loss=loss, global_step=tf.train.get_global_step(), learning_rate=0.01, optimizer="SGD")
eval_metric_ops = {"rmse": tf.metrics.root_mean_squared_error(labels, predictions)}

1 个答案:

答案 0 :(得分:0)

TL; DR :在投放之前使用x = tf.split( x, 10, axis = -1 )拆分x

<强> TS; WM

错误可能发生在tf.nn_static_rnn(),代码的第二行(如果您发布了错误行号,那可能会很好):

outputs, _ = tf.nn.static_rnn(lstm_cell, x, dtype=tf.float32)

“破损”版本尝试输入形状为(49,10)的张量,而工作版本正在输入一个8个张量的列表,形状为(?,1)。文档说:

  

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

在上一行中,您使用tf.contrib.rnn.BasicLSTMCell.__init__()定义lstm_cell(可能是因为您的代码中省略了导入行),其中num_units参数由{{1}填充(再次,从代码中省略):

LSTM_SIZE

所以你必须把你的鸭子连成一排。 lstm_cell = rnn.BasicLSTMCell(LSTM_SIZE, forget_bias=1.0) 必须是(batch_size,1)张量的列表,您可以使用tf.split()来实现:

x

我假设10是您尝试提供的数据的长度,只是基于您粘贴的输出。