J'aimerais disposer d'une image intégrée pour comprendre quelles sont les images que le réseau considère comme plus proches et quelles sont celles qui semblent être très différentes pour lui. Tout d'abord, j'ai voulu utiliser les callbacks de Tensorboard dans Keras, mais la documentation n'est pas assez claire pour moi, et je n'ai pas pu trouver d'exemples utiles pour le reproduire. Par conséquent, pour être sûr de comprendre ce que je fais, j'ai préféré faire l'intégration moi-même.
Pour ce faire, j'ai prévu de télécharger le modèle déjà entraîné sur mes données, d'enlever les dernières couches (dernier dropout et couche dense), et de prédire sur les images de validation pour obtenir les caractéristiques associées à chaque image. Ensuite, je ferais simplement une ACP sur ces caractéristiques et je tracerais les images en fonction de leurs trois premières valeurs de composantes principales.
Mais je pense que j'ai mal compris quelque chose, car lorsque j'enlève les dernières couches, les prédictions du modèle sont toujours de la taille du nombre de classes, mais pour moi, elles devraient être de la taille de la dernière couche, qui est de 128 dans mon cas.
Ci-dessous se trouve le code pour clarification (où j'ai juste mis les lignes qui semblent utiles pour répondre à la question, mais n'hésitez pas à demander plus de détails) :
#model creation
base_model = applications.inception_v3.InceptionV3(include_top=False,
weights='imagenet',
pooling='avg',
input_shape=(img_rows, img_cols, img_channel))
#Adding custom Layers
add_model = Sequential()
add_model.add(Dense(128, activation='relu',input_shape=base_model.output_shape[1:],
kernel_regularizer=regularizers.l2(0.001)))
add_model.add(Dropout(0.60))
add_model.add(Dense(2, activation='sigmoid'))
# creating the final model
model = Model(inputs=base_model.input, outputs=add_model(base_model.output))
J'ai ensuite entraîné le modèle sur un ensemble de données comportant deux classes, et j'ai utilisé le modèle et son poids pour produire des caractéristiques :
model = load_model(os.path.join(ROOT_DIR,'model_1','model_cervigrams_all.h5'))
#remove the last two layers
#remove dense_2
model.layers[-1].pop()
#remove dropout_1
model.layers[-1].pop()
model.summary() # last alyer output shape is : (None, 128), so the removal worked
#predict
model.predict(np.reshape(image,[1,image.shape[0],image.shape[1],3])) #output only two values
Où ai-je tort ? Avez-vous des recommandations à faire ?