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_input
mode
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]. "
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.
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]
.
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
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')