TensorFlow ValueError:无法为形状为 '(?, 64, 64, 3)' 的张量 u'Placeholder:0' 提供形状 (64, 64, 3) 的值

Posted

技术标签:

【中文标题】TensorFlow ValueError:无法为形状为 \'(?, 64, 64, 3)\' 的张量 u\'Placeholder:0\' 提供形状 (64, 64, 3) 的值【英文标题】:TensorFlow ValueError: Cannot feed value of shape (64, 64, 3) for Tensor u'Placeholder:0', which has shape '(?, 64, 64, 3)'TensorFlow ValueError:无法为形状为 '(?, 64, 64, 3)' 的张量 u'Placeholder:0' 提供形状 (64, 64, 3) 的值 【发布时间】:2019-02-01 02:29:30 【问题描述】:

我是 TensorFlow 和机器学习的新手。我正在尝试将两个对象分类为杯子和笔式驱动器(jpeg 图像)。我已经成功训练并导出了一个 model.ckpt。现在我正在尝试恢复保存的 model.ckpt 以进行预测。这是脚本:

import tensorflow as tf
import math
import numpy as np
from PIL import Image
from numpy import array


# image parameters
IMAGE_SIZE = 64
IMAGE_CHANNELS = 3
NUM_CLASSES = 2

def main():
    image = np.zeros((64, 64, 3))
    img = Image.open('./IMG_0849.JPG')

    img = img.resize((64, 64))
    image = array(img).reshape(64,64,3)

    k = int(math.ceil(IMAGE_SIZE / 2.0 / 2.0 / 2.0 / 2.0)) 
    # Store weights for our convolution and fully-connected layers
    with tf.name_scope('weights'):
        weights = 
            # 5x5 conv, 3 input channel, 32 outputs each
            'wc1': tf.Variable(tf.random_normal([5, 5, 1 * IMAGE_CHANNELS, 32])),
            # 5x5 conv, 32 inputs, 64 outputs
            'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
            # 5x5 conv, 64 inputs, 128 outputs
            'wc3': tf.Variable(tf.random_normal([5, 5, 64, 128])),
            # 5x5 conv, 128 inputs, 256 outputs
            'wc4': tf.Variable(tf.random_normal([5, 5, 128, 256])),
            # fully connected, k * k * 256 inputs, 1024 outputs
            'wd1': tf.Variable(tf.random_normal([k * k * 256, 1024])),
            # 1024 inputs, 2 class labels (prediction)
            'out': tf.Variable(tf.random_normal([1024, NUM_CLASSES]))
        

    # Store biases for our convolution and fully-connected layers
    with tf.name_scope('biases'):
        biases = 
            'bc1': tf.Variable(tf.random_normal([32])),
            'bc2': tf.Variable(tf.random_normal([64])),
            'bc3': tf.Variable(tf.random_normal([128])),
            'bc4': tf.Variable(tf.random_normal([256])),
            'bd1': tf.Variable(tf.random_normal([1024])),
            'out': tf.Variable(tf.random_normal([NUM_CLASSES]))
        

   saver = tf.train.Saver()
   with tf.Session() as sess:
       saver.restore(sess, "./model.ckpt")
       print "...Model Loaded..."   
       x_ = tf.placeholder(tf.float32, shape=[None, IMAGE_SIZE , IMAGE_SIZE , IMAGE_CHANNELS])
       y_ = tf.placeholder(tf.float32, shape=[None, NUM_CLASSES])
       keep_prob = tf.placeholder(tf.float32)

       init = tf.initialize_all_variables()

       sess.run(init)
       my_classification = sess.run(tf.argmax(y_, 1), feed_dict=x_:image)
       print 'Neural Network predicted', my_classification[0], "for your image"


if __name__ == '__main__':
     main()

当我运行上述脚本进行预测时,我收到以下错误:

ValueError: Cannot feed value of shape (64, 64, 3) for Tensor u'Placeholder:0', which has shape '(?, 64, 64, 3)' 

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

【问题讨论】:

【参考方案1】:

image 的形状为(64,64,3)

您的输入占位符_x 的形状为(?,64,64,3)

问题是您正在为占位符提供不同形状的值。

您必须为其提供值 (1,64,64,3) = 一批 1 张图片。

只需将您的 image 值重塑为大小为 1 的批次。

image = array(img).reshape(1,64,64,3)

P.S:输入占位符接受一批图像这一事实意味着您可以并行运行一批图像的预测。 您可以尝试读取多于 1 个图像(N 个图像),然后构建一批 N 个图像,使用形状为 (N,64,64,3) 的张量

【讨论】:

你的意思可能是image = array(img).reshape(1, 64, 64, 3) 您可能应该使用np.expand_dims(img, axis=0) 添加批处理维度 谢谢。 image = array(img).reshape(1, 64, 64, 3) 这行得通 尝试在脚本参数中使用 OR 参数。假设您的变量只接受 X 的输入。但您的变量是 Y。将其设为 X 或 Y。它至少使错误对我来说消失了。【参考方案2】:

Powder's 评论可能不会被发现,就像我错过了很多次一样,。因此,希望使其更加明显,我将重申他的观点。

有时使用image = array(img).reshape(a,b,c,d) 会重新调整,但根据经验,每次我尝试在操作中使用新维度时,我的内核都会崩溃。最安全的使用是

np.expand_dims(img, axis=0)

每次都能完美运行。我只是无法解释为什么。 This link 对其用法有很好的解释和示例。

【讨论】:

以上是关于TensorFlow ValueError:无法为形状为 '(?, 64, 64, 3)' 的张量 u'Placeholder:0' 提供形状 (64, 64, 3) 的值的主要内容,如果未能解决你的问题,请参考以下文章

“ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 numpy.ndarray)。在 TensorFlow CNN 中进行图像分类

TensorFlow ValueError:无法为形状为 '(?, 64, 64, 3)' 的张量 u'Placeholder:0' 提供形状 (64, 64, 3) 的值

TensorFlow ValueError:无法为形状为 '(?, 64, 64, 3)' 的张量 u'Placeholder:0' 提供形状 (64, 64, 3) 的值

如何修复Tensorflow中的“ValueError:操作数无法与形状(2592,)(4,)一起广播”?

Tensorflow 数据适配器错误:ValueError:无法找到可以处理输入的数据适配器

自定义 DataGenerator tensorflow 错误“ValueError:无法找到可以处理输入的数据适配器”