Je suis nouveau dans TensorFlow et l'apprentissage automatique. J'essaie de classer deux objets, une tasse et une clé USB (images JPEG). J'ai formé et exporté un model.ckpt avec succès. Maintenant j'essaye 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 __== '__main__':
main()
Lorsque j'exécute le script de prédiction ci-dessus, le message d'erreur suivant s'affiche:
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 mal? Et comment puis-je corriger la forme du tableau numpy?
image
a la forme de (64,64,3)
.
Votre espace réservé d'entrée _x
a la forme (?, 64,64,3)
.
Le problème est que vous fournissez à l'espace réservé une valeur de forme différente.
Vous devez l'alimenter avec une valeur de (1, 64, 64, 3)
= un lot de 1 image.
Modifiez simplement votre valeur image
en un lot de taille un.
image = array(img).reshape(1, 64,64,3)
P.S: le fait que l’espace réservé à l’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 de créer un lot de N images en utilisant un tenseur de forme (N, 64,64,3)
Le commentaire de Powder peut ne pas être détecté comme si je l'avais manqué tant de fois. Donc, dans l’espoir de le rendre plus visible, je vais répéter ce qu’il a dit.
Parfois, l’utilisation de image = array(img).reshape(a,b,c,d)
remodèle correctement, mais par expérience, mon noyau 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)
Cela fonctionne parfaitement à chaque fois. Je ne peux pas expliquer pourquoi. Ce lien a une bonne explication et des exemples concernant son utilisation.