ValueError: Невозможно передать значение формы 'x' для тензора 'y', имеющего форму 'z - PullRequest
0 голосов
/ 03 мая 2019

Здесь полный новичок, пытающийся запустить код. Проблема в том, что размеры моих фигур не совпадают. Кто-нибудь знает, какие размеры переменных должны быть изменены?

Я пытался изменить размеры 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 Ответ

1 голос
/ 05 мая 2019

Кажется, что вы жалуетесь на подачу X, которая имеет форму (100,) в x, которая должна иметь форму (что угодно, 20, 44).Эта переменная имеет имя «input», отмеченное в ошибке.

x и y являются заполнителями тензорного потока, а не массивами-пустышками, и их форма таким образом не изменяется.Это говорит тензорному потоку, что он должен ожидать несколько массивов (в вашем случае, возможно, X и Y) в указанной форме.Поскольку формы не совпадают, возможно, вы используете неправильные данные, поэтому простое изменение формы X может привести к неверным результатам.

Вам придется выяснить, что на самом деле представляют собой формы X и Y.и откуда данные 20x44 должны поступать из вашего набора данных (или, если они не должны требовать данных 20x44, чего они должны требовать).

...