46 votes

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

Je suis novice en matière de TensorFlow et d'apprentissage automatique. J'essaie de classifier deux objets, une tasse et un disque dur (images jpeg). J'ai entraîné et exporté un modèle.ckpt avec succès. Maintenant, j'essaie de restaurer le model.ckpt sauvegardé pour la prédiction. Voici le script :

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

Lorsque j'exécute le script ci-dessus pour la prédiction, j'obtiens l'erreur suivante :

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

Qu'est-ce que je fais de mal ? Et comment puis-je corriger la forme du tableau numpy ?

48voto

nessuno Points 12786

image a une forme de (64,64,3) .

Votre espace de saisie _x ont une forme de (?, 64,64,3) .

Le problème est que vous alimentez le placeholder avec une valeur d'une forme différente.

Vous devez l'alimenter avec une valeur de (1, 64, 64, 3) = un lot de 1 image.

Il suffit de remodeler votre image à un lot de taille 1.

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

P.S : le fait que le paramètre d'entrée accepte un lot d'images, signifie que vous pouvez exécuter des prédictions pour un lot d'images en parallèle. Vous pouvez essayer de lire plus d'une image (N images) et ensuite construire un lot de N images, en utilisant un tenseur de forme (N, 64,64,3)

5voto

rocksyne Points 310

La poudre Le commentaire peut passer inaperçu, comme je l'ai fait tant de fois. Donc, dans l'espoir de le rendre plus visible, je vais réitérer son point de vue.

Parfois, en utilisant image = array(img).reshape(a,b,c,d) va bien remodeler mais par expérience, mon noyau se plante à chaque fois que j'essaie d'utiliser la nouvelle dimension dans une opération. Le plus sûr à utiliser est

np.expand_dims(img, axis=0)

Ça marche parfaitement à chaque fois. Je ne peux pas expliquer pourquoi. Ce lien contient une excellente explication et des exemples concernant son utilisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X