TensorFlow ValueError:不能给张量u'占位符:0',它有形状(?)的形状(64,64,3)的值。、64、64、3)”

时间:2022-05-14 13:48:00

I am new to TensorFlow and machine learning. I am trying to classify two objects a cup and a pendrive (jpeg images). I have trained and exported a model.ckpt successfully. Now I am trying to restore the saved model.ckpt for prediction. Here is the script:

我是新手,机器学习的新手。我正在尝试将两个对象分类为一个杯子和一个pendrive (jpeg图像)。我已经培训并出口了一个模型。ckpt成功。现在我正在尝试恢复已保存的模型。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()

When I run the above script for prediction I get the following error:

当我运行上面的脚本进行预测时,我得到了以下错误:

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

What am I doing wrong? And how do I fix the shape of numpy array?

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

2 个解决方案

#1


24  

image has a shape of (64,64,3).

图像的形状是(64,64,3)。

Your input placeholder _x have a shape of (?, 64,64,3).

您的输入占位符_x有一个形状(?、64、64、3)。

The problem is that you're feeding the placeholder with a value of a different shape.

问题是你给占位符提供了一个不同形状的值。

You have to feed it with a value of (1, 64, 64, 3) = a batch of 1 image.

您必须为它提供一个值(1、64、64、3)=一批1个图像。

Just reshape your image value to a batch with size one.

只需将您的图像值调整为大小为1的批处理。

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

P.S: the fact that the input placeholder accepts a batch of images, means that you can run predicions for a batch of images in parallel. You can try to read more than 1 image (N images) and than build a batch of N image, using a tensor with shape (N, 64,64,3)

P。S:输入占位符接受一组图像,这意味着您可以并行地运行一批图像的前缀。您可以尝试读取超过1个图像(N个图像),并使用一个具有形状的张量(N, 64,64,3)来构建一个N个图像。

#2


1  

Powder's comment may go undetected like I missed it so many times,. So with the hope of making it more visible, I will re-iterate his point.

粉的评论可能没有被发现,就像我错过了很多次一样。因此,希望能让它变得更加明显,我将再次重申他的观点。

Sometimes using image = array(img).reshape(a,b,c,d) will reshape alright but from experience, my kernel crashes every time I try to use the new dimension in an operation. The safest to use is

有时使用image = array(img).重塑(a,b,c,d)将会重塑,但是从经验来看,每次我尝试在操作中使用新的维度时,内核都会崩溃。最安全的使用方法是。

np.expand_dims(img, axis=0)

np。expand_dims(img,轴= 0)

It works perfect every time. I just can't explain why. This link has a great explanation and examples regarding its usage.

每次都是完美的。我就是无法解释为什么。这个链接有一个很好的解释和例子关于它的用法。

#1


24  

image has a shape of (64,64,3).

图像的形状是(64,64,3)。

Your input placeholder _x have a shape of (?, 64,64,3).

您的输入占位符_x有一个形状(?、64、64、3)。

The problem is that you're feeding the placeholder with a value of a different shape.

问题是你给占位符提供了一个不同形状的值。

You have to feed it with a value of (1, 64, 64, 3) = a batch of 1 image.

您必须为它提供一个值(1、64、64、3)=一批1个图像。

Just reshape your image value to a batch with size one.

只需将您的图像值调整为大小为1的批处理。

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

P.S: the fact that the input placeholder accepts a batch of images, means that you can run predicions for a batch of images in parallel. You can try to read more than 1 image (N images) and than build a batch of N image, using a tensor with shape (N, 64,64,3)

P。S:输入占位符接受一组图像,这意味着您可以并行地运行一批图像的前缀。您可以尝试读取超过1个图像(N个图像),并使用一个具有形状的张量(N, 64,64,3)来构建一个N个图像。

#2


1  

Powder's comment may go undetected like I missed it so many times,. So with the hope of making it more visible, I will re-iterate his point.

粉的评论可能没有被发现,就像我错过了很多次一样。因此,希望能让它变得更加明显,我将再次重申他的观点。

Sometimes using image = array(img).reshape(a,b,c,d) will reshape alright but from experience, my kernel crashes every time I try to use the new dimension in an operation. The safest to use is

有时使用image = array(img).重塑(a,b,c,d)将会重塑,但是从经验来看,每次我尝试在操作中使用新的维度时,内核都会崩溃。最安全的使用方法是。

np.expand_dims(img, axis=0)

np。expand_dims(img,轴= 0)

It works perfect every time. I just can't explain why. This link has a great explanation and examples regarding its usage.

每次都是完美的。我就是无法解释为什么。这个链接有一个很好的解释和例子关于它的用法。