web-dev-qa-db-fra.com

Modes Keras VGG16 preprocess_input

J'utilise le modèle Keras VGG16 .

Je l'ai vu il y a une méthode preprocess_input à utiliser en conjonction avec le modèle VGG16 . Cette méthode semble appeler méthode preprocess_input dans imagenet_utils.py qui (selon le cas) appelle _ méthode preprocess_numpy_input dans imagenet_utils.py .

Le preprocess_input a un argument mode qui attend "caffe", "tf" ou "torch". Si j'utilise le modèle dans Keras avec le backend TensorFlow, dois-je absolument utiliser mode="tf"?

Si oui, est-ce parce que le modèle VGG16 chargé par Keras a été formé avec des images ayant subi le même prétraitement (c'est-à-dire changé la plage de l'image d'entrée de [0,255] à la plage d'entrée [-1,1])?

De plus, les images d'entrée pour le mode test doivent-elles également subir ce prétraitement? Je suis convaincu que la réponse à la dernière question est oui, mais je voudrais être rassuré.

Je m'attendrais à ce que François Chollet l'ait fait correctement, mais en regardant https://github.com/fchollet/deep-learning-models/blob/master/vgg16.py soit il est ou je suis mal d'utiliser mode="tf".

Informations mises à jour

@FalconUA m'a dirigé vers la section VGG à Oxford qui a une section Modèles avec des liens pour le modèle 16 couches. Les informations sur le preprocessing_inputmode argument tf mise à l'échelle de -1 à 1 et caffe soustraction de certaines valeurs moyennes est trouvée en suivant le lien dans les modèles Modèle 16 couches: page d'information . Dans la section Description, il est dit:

"Dans le document, le modèle est désigné comme la configuration D entraînée avec le scintillement de l'échelle. Les images d'entrée doivent être centrées sur zéro par soustraction moyenne de pixels (plutôt que d'image moyenne). À savoir, les valeurs BGR suivantes doivent être soustraites: [103.939, 116.779, 123.68]. "

8
user3731622

Le mode ici ne concerne pas le backend, mais plutôt sur quel framework le modèle a été formé et porté. Dans le - lien keras vers VGG16, il est précisé que:

Ces poids sont portés à partir de ceux publiés par VGG à Oxford

Les modèles VGG16 et VGG19 ont donc été formés à Caffe et portés sur TensorFlow, d'où mode == 'caffe' ici (plage de 0 à 255, puis extraire la moyenne [103.939, 116.779, 123.68]).

Les réseaux plus récents, comme MobileNet et ShuffleNet ont été formés sur TensorFlow, donc mode est 'tf' pour eux et les entrées sont centrées sur zéro dans la plage de -1 à 1.

9
FalconUA

D'après mon expérience dans la formation de VGG16 à Keras, les entrées doivent être comprises entre 0 et 255, en soustrayant la moyenne [103.939, 116.779, 123.68]. J'ai essayé le transfert d'apprentissage (geler le bas et empiler un classificateur sur le dessus) avec des entrées centrées depuis -1 à 1, et les résultats sont bien pires que 0..255 - [103.939, 116.779, 123.68].

4
Dmitrii

En essayant d'utiliser VGG16 moi-même récemment, j'ai eu des problèmes pour obtenir des résultats de descente en important simplement preprocess_input de vgg16 comme ceci:

from keras.applications.vgg16 import VGG16, preprocess_input

Ce faisant, preprocess_input par défaut est défini sur 'caffe' mode mais en regardant de plus près code keras vgg16 , j'ai remarqué que le nom des poids

" https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5 "

fait référence à tensorflow deux fois. Je pense que le mode de prétraitement devrait être 'tf'.

processed_img = preprocess_input(img, mode='tf')
0
Ioannis Nasios