2016-11-04 73 views
15

我是TensorFlow和机器学习的新手。我试图分类两个对象一杯和一个pendrive(jpeg图像)。我已经训练并成功导出了一个model.ckpt。现在我正在尝试恢复保存的model.ckpt进行预测。下面是该脚本:TensorFlow ValueError:无法为Tensor u'Placeholder:0'提供形状(64,64,3)的形状'(?,64,64,3)'

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数组的形状?

回答

20

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

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

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

你必须喂它的值为(1, 64, 64, 3) =一批1张图片。

只需将您的image值重新设置为大小为1的批次。

​​

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

+1

可能您的意思是'image = array(img).reshape(1,64,64 ,3)'。 –

+0

您应该使用'np.expand_dims(img,axis = 0)'来添加批次维度 – powder

+0

谢谢。 image = array(img).reshape(1,64,64,3)这工作 – Pragyan93

相关问题