2017-07-11 1 views
3

J'essaye de créer un exemple en utilisant le Keras construit dans la dernière version de TensorFlow de Google. Cet exemple devrait être capable de classer une image classique d'un éléphant. Le code ressemble à ceci:TensorFlow 1.2.1 et InceptionV3 pour classer une image

# Import a few libraries for use later 
from PIL import Image as IMG 

from tensorflow.contrib.keras.python.keras.preprocessing import image 
from tensorflow.contrib.keras.python.keras.applications.inception_v3 import InceptionV3 
from tensorflow.contrib.keras.python.keras.applications.inception_v3 import preprocess_input, decode_predictions 


# Get a copy of the Inception model 
print('Loading Inception V3...\n') 
model = InceptionV3(weights='imagenet', include_top=True) 
print ('Inception V3 loaded\n') 

# Read the elephant JPG 
elephant_img = IMG.open('elephant.jpg') 

# Convert the elephant to an array 
elephant = image.img_to_array(elephant_img) 
elephant = preprocess_input(elephant) 

elephant_preds = model.predict(elephant) 

print ('Predictions: ', decode_predictions(elephant_preds)) 

Malheureusement, je me fais une erreur en essayant d'évaluer le modèle avec model.predict:

ValueError: Error when checking : expected input_1 to have 4 dimensions, but got array with shape (299, 299, 3) 

Ce code est tiré et basé sur the excellent example coremltools-keras-inception et sera élargi plus quand il est compris.

+0

Pourriez-vous partager tout le retraçage? –

+0

Je peux le jeter en référence si vous voulez encore mais la réponse explique ce qui s'est passé et j'ai mentionné exactement quelle ligne a échoué. –

+0

Je vois maintenant que vous avez posté une réponse, bon travail, ignorez mon dernier :) –

Répondre

2

En fait, j'ai trouvé la réponse. Même si la documentation indique que si la couche supérieure est incluse, la forme du vecteur d'entrée est toujours définie pour prendre un lot d'images. Ainsi, nous devons ajouter ceci avant la ligne de code pour la prédiction:

elephant = numpy.expand_dims(elephant, axis=0) 

Ensuite, le tenseur est dans la bonne forme et tout fonctionne correctement. Je suis toujours incertain pourquoi la documentation indique que le vecteur d'entrée devrait être (3x299x299) ou (299x299x3) quand il veut clairement 4 dimensions.

Soyez prudent!

3

La raison pour laquelle cette erreur est survenue est que le modèle attend toujours le lot d'exemples - pas un seul exemple. Cela diverge d'une compréhension commune des modèles en tant que fonctions mathématiques de leurs intrants. Les raisons pour lesquelles le modèle attend des lots sont:

  1. Les modèles sont conçus pour fonctionner plus rapidement sur des lots afin d'accélérer l'entraînement.
  2. Il existe des algorithmes qui prennent en compte la nature de lot de l'entrée (par exemple, Batch Normalization ou GAN).

donc quatre dimensions vient d'une première dimension qui est un échantillon/lotdimension et - les 3 dimensions sont l'image obscurcit.