ValueError: 无法为形状为(128, 28, 28)的值馈送到张量’Placeholder:0’,该张量的形状为'(?, 784)’

我是Tensorflow和机器学习的新手,正在尝试使用Tensorflow和我的自定义输入数据进行CNN实验。但我遇到了下面的错误。

数据或图像大小为28×28,共有15个标签。我不太理解这个脚本中的numpy重塑操作或错误。

非常感谢您的帮助。

enter image description here

import tensorflow as tfimport osimport skimage.dataimport numpy as npimport randomdef load_data(data_directory):    directories = [d for d in os.listdir(data_directory)                    if os.path.isdir(os.path.join(data_directory, d))]    labels = []    images = []    for d in directories:        label_directory = os.path.join(data_directory, d)        file_names = [os.path.join(label_directory, f)                       for f in os.listdir(label_directory)                       if f.endswith(".jpg")]        for f in file_names:            images.append(skimage.data.imread(f))            labels.append(d)        print(str(d)+' Completed')    return images, labelsROOT_PATH = "H:\Testing\TrainingData"train_data_directory = os.path.join(ROOT_PATH, "Training")test_data_directory = os.path.join(ROOT_PATH, "Testing")print('Loading Data...')images, labels = load_data(train_data_directory)print('Data has been Loaded')n_classes = 15training_examples = 10500test_examples = 4500batch_size = 128x = tf.placeholder('float', [None, 784])y = tf.placeholder('float')def conv2d(x, W):    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME')def maxpool2d(x):    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')def neural_network_model(x):    weights = {'W_Conv1':tf.Variable(tf.random_normal([5,5,1,32])),               'W_Conv2':tf.Variable(tf.random_normal([5,5,32,64])),               'W_FC':tf.Variable(tf.random_normal([7*7*64, 1024])),               'Output':tf.Variable(tf.random_normal([1024, n_classes]))}    biases = {'B_Conv1':tf.Variable(tf.random_normal([32])),               'B_Conv2':tf.Variable(tf.random_normal([64])),               'B_FC':tf.Variable(tf.random_normal([1024])),               'Output':tf.Variable(tf.random_normal([n_classes]))}       x = tf.reshape(x, shape=[-1,28,28,1])    conv1 = conv2d(x, weights['W_Conv1'])    conv1 = maxpool2d(conv1)    conv2 = conv2d(conv1, weights['W_Conv2'])    conv2 = maxpool2d(conv2)    fc = tf.reshape(conv2, [-1, 7*7*64])    fc = tf.nn.relu(tf.matmul(fc, weights['W_FC'])+biases['B_FC'])    output = tf.matmul(fc, weights['Output'])+biases['Output']    return outputdef next_batch(num, data, labels):    idx = np.arange(0 , len(data))    np.random.shuffle(idx)    idx = idx[:num]    data_shuffle = [data[ i] for i in idx]    labels_shuffle = [labels[ i] for i in idx]    return np.asarray(data_shuffle), np.asarray(labels_shuffle)def train_neural_network(x):    prediction = neural_network_model(x)    cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y) )    optimizer = tf.train.AdamOptimizer().minimize(cost)    hm_epochs = 10    with tf.Session() as sess:        # OLD:        #sess.run(tf.initialize_all_variables())        # NEW:        sess.run(tf.global_variables_initializer())        for epoch in range(hm_epochs):            epoch_loss = 0            for _ in range(int(training_examples/batch_size)):                epoch_x, epoch_y = next_batch(batch_size, images, labels)                _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})                epoch_loss += c            print('Epoch', epoch, 'completed out of',hm_epochs,'loss:',epoch_loss)        correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))        accuracy = tf.reduce_mean(tf.cast(correct, 'float'))        print('Accuracy:',accuracy.eval({x: images, y: labels}))print('Training Neural Network...')train_neural_network(x)

我哪里做错了?需要修复什么以及如何修复numpy数组的形状?


回答:

如果你仔细看,你会发现你有两个 x 占位符:

x = tf.placeholder('float', [None, 784])  # 全局...x = tf.reshape(x, shape=[-1,28,28,1])     # 在neural_network_model中

其中一个在函数作用域内,因此在train_neural_network中不可见,所以tensorflow使用了形状为[?, 784]的那个。你应该删除其中一个。

另外请注意,你的训练数据是三维的,即[batch_size, 28, 28],所以它不直接与任何这些占位符兼容。

要将其馈送到第一个x,请使用epoch_x.reshape([-1, 784])。对于第二个占位符(一旦你使其可见),请使用epoch_x.reshape([-1, 28, 28, 1])

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注