TensorFlow ValueError: No se puede alimentar el valor de la forma (64, 64, 3) para Tensor u’Placeholder: 0 ‘, que tiene la forma’ (?, 64, 64, 3) ‘

Soy nuevo en TensorFlow y aprendizaje automático. Estoy tratando de clasificar dos objetos una taza y un pendrive (imágenes jpeg). He entrenado y exportado un modelo. Ahora estoy tratando de restaurar el model.ckpt guardado para la predicción. Aquí está el guión:

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.restre(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() 

Cuando ejecuto el script anterior para la predicción, aparece el siguiente error:

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

¿Qué estoy haciendo mal? ¿Y cómo arreglo la forma de la matriz numpy?

image tiene una forma de (64,64,3) .

Su marcador de posición de entrada _x tiene una forma de (?, 64,64,3) .

El problema es que está alimentando al marcador de posición con un valor de una forma diferente.

Debe alimentarlo con un valor de (1, 64, 64, 3) = un lote de 1 imagen.

Solo remodela el valor de tu image a un lote con tamaño uno.

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

PD: el hecho de que el marcador de posición de entrada acepte un lote de imágenes, significa que puede ejecutar predicciones para un lote de imágenes en paralelo. Puede intentar leer más de 1 imagen (N imágenes) y luego construir un lote de N imágenes, utilizando un tensor con forma (N, 64,64,3)

El comentario de Powder puede pasar desapercibido como lo extrañé tantas veces. Entonces, con la esperanza de hacerlo más visible, reitero su punto.

A veces, usando image = array(img).reshape(a,b,c,d) cambiará de forma, pero por experiencia, mi kernel falla cada vez que bash usar la nueva dimensión en una operación. El más seguro de usar es

np.expand_dims (img, axis = 0)

Funciona perfecto cada vez. Simplemente no puedo explicar por qué. Este enlace tiene una gran explicación y ejemplos sobre su uso.