ValueError:无法为形状为“ z”的张量“ y”提供形状为“ x”的值

时间:2019-05-03 15:05:53

标签: python numpy tensorflow neural-network reshape

一个完整的菜鸟,试图运行代码。问题是我的形状尺寸不一致。有谁知道应该更改哪些变量的尺寸?

在为x和y赋值之后,我尝试立即更改x或y的尺寸,但仍然出现错误

np.expand_dims(x, axis=1)

主要方法:

def main():

  #tf.reset.default.graph()
  sess = tf.Session()

  x = tf.placeholder(tf.float32, shape=[None, HEIGHT, WIDTH], name="input")
  y = tf.placeholder(tf.float32, shape=[None, NUM_LABELS], name="labels")
  dropout = tf.placeholder(tf.float32, name="dropout")
  np.expand_dims(input, axis=1)

  logits = get_model(x, dropout)

  with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y), name=None)
    tf.summary.scalar('loss', loss)

  with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(LEARNING_RATE).minimize(loss)

  with tf.name_scope('accuracy'):
    predicted = tf.argmax(logits, 1)
    truth = tf.argmax(y, 1)
    correct_prediction = tf.equal(predicted, truth)
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    confusion_matrix = tf.confusion_matrix(truth, predicted, num_classes=NUM_LABELS)
    tf.summary.scalar('accuracy', accuracy)

  summ = tf.summary.merge_all()
  saver = tf.train.Saver()
  sess.run(tf.global_variables_initializer())
  writer = tf.summary.FileWriter(LOGDIR)
  writer.add_graph(sess.graph)
  test_writer = tf.summary.FileWriter(TEST_LOGDIR)

  print('Starting training\n')
  batch = get_batch(BATCH_SIZE, PATH_TRAIN)

  start_time = time.time()
  for i in range(1, ITERATIONS + 1):
    X, Y = next(batch)
    if i % EVAL_EVERY == 0:
      [train_accuracy, train_loss, s] = sess.run([accuracy, loss, summ], feed_dict={x: X, y: Y, dropout:0.5}, acc_and_loss = [i, train_loss, train_accuracy * 100])
      print('Iteration # {}. Train Loss: {:.2f}. Train Acc: {:.0f}%'.format(*acc_and_loss))
      writer.add_summary(s, i)
    if i % (EVAL_EVERY * 20) == 0:
      train_confusion_matrix = sess.run([accuracy, sum], feed_dict={x: X, y: Y, dropout:1.0})
      header = LABEL_TO_INDEX_MAP.keys()
      df = pd.DataFrame(np.reshape(train_confusion_matrix, (NUM_LABELS, NUM_LABELS)), index=i)
      print('\nConfusion Matrix:\n {}\n'.format(df))
      saver.save(sess, os.path.join(LOGDIR, "model.ckpt"), i)

    sess.run(train_step, feed_dict={x: X, y: Y, dropout:0.5})

  print('\nTotal training time {:0f} seconds\n'.format(time.time() - start_time))
  batch = get_batch(BATCH_SIZE, PATH_TEST)
  total_accuracy = 0
  for i in range(ITERATIONS_TEST):
    X, Y = next(batch, PATH_TEST)
    test_accuracy, s = sess.run([accuracy, summ], feed_dict={x: X, y: Y, dropout:1.0})
    print('Iteration # {}. Test Accuracy {:.0f}%'.format(i+1, test_accuracy * 100))
    total_accuracy += (test_accuracy / ITERATIONS_TEST)
    test_writer.add_summary(s, i)

  print('\nFinal Test Accuracy: {:.0f}%').format(total_accuracy * 100)

if __name__ == '__main__':
    init(PATH_TRAIN)
    main()

我得到的结果:

ValueError: Cannot feed value of shape (100,) for Tensor 'input_19:0', which has shape '(?, 20, 44)'

1 个答案:

答案 0 :(得分:1)

似乎在抱怨将形状为(100,)的X馈入需要具有形状(任何20、44)的x中。该变量的名称为错误中注明的“输入”。

xy是张量流占位符,而不是numpy数组,并且它们的形状不会以这种方式更改。它告诉tensorflow期望指定形状的一些numpy数组(在您的情况下,可能是XY)。由于形状不匹配,您可能使用了错误的数据,因此简单地重塑X可能会给您带来错误的结果。

您将必须弄清楚XY的形状是什么,以及20x44数据应来自数据集的何处(或者是否不需要20x44数据) ,它应该有什么要求。)