J'utilise Keras ImagedaTagenerator Classe pour charger, former et prédire. J'avais essayé les solutions ici , mais j'ai toujours le problème. Je ne suis pas sûr que j'ai le même problème que j'ai mentionné ici . Je suppose que mon y_pred code> et
y_test code> ne sont pas correctement mappés les uns sur les autres.
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical',
subset='training')
validation_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical',
subset='validation',
shuffle='False')
validation_generator2 = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical',
subset='validation',
shuffle='False')
loss = CategoricalCrossentropy()
model.compile(optimizer=SGD(lr=lr, momentum=momentum),
loss=loss,
metrics=['accuracy'])
history = model.fit_generator(train_generator,
steps_per_epoch = train_generator.samples // batch_size,
validation_data=validation_generator,
validation_steps=validation_generator.samples // batch_size,
epochs=epochs,
verbose=1,
callbacks=[csv_logger, checkpointer],
workers=12)
3 Réponses :
Ma première impression est que vous avez formé deux modèles différents. Beaucoup de modèles ont une sorte d'élément "aléatoire" en eux (comment initialiser les poids dans un réseau de neurones par exemple) qui entraîne automatiquement un classificateur légèrement différent.
La précision que vous indiquez a été faite par KERAS est pour le modèle "validation_generator", tandis que la précision Sklearn est sur "validation_generator2". Vous pouvez essayer ceci: (Veuillez noter que je n'ai pas essayé ce bloc de code)
Testé. le même problème
Tout d'abord, vous devriez utiliser le même générateur pour évaluer_generator et prédict_generator comme indiqué par SAN. p>
Deuxièmement, je pense que la précision entre Sklearn et Keras n'est pas exactement la même que celle indiquée dans le Sklearn Documentation Accuracy_score en cas de multiclasse est vraiment le score JACCARD. P>
Ce lien indique la différence: https://stats.stackexchange.com/questions/255465/accury-vs- Jaccard-for-multiclass-problème p>
La matrice de confusion est également fausse. Cela montre que le y_test et y_pred ne sont pas cohérents. La précision de Sklearn n'est pas importante pour moi.
C'est vrai, pouvez-vous également montrer comment vous entraînez votre modèle (surtout quelle perte que vous utilisez?)
J'ai édité la question et ajouté le code de formation. Je devrais mentionner que j'avais d'abord formé le modèle, l'a sauvé et le charger plus tard pour avoir fait de la prédiction.
Tandis que la formation était-elle la précision du Val était conforme à la précision de l'évaluation_generator? Je soupçonne que prédict_generator peut gâcher avec les étiquettes
Oui Oui, cela montre que la formation est effectuée correctement.
J'essaierais d'utiliser le même code que SAN spécifié (avec un seul générateur) et de le réinitialiser à l'aide de validation_generator.Reset (). Aussi, vous avez écrit shuffle = 'false', cela devrait être shuffle = false, comme «faux» dans Python est un char et sera considéré comme vrai.
Il suffit de réinitialiser le générateur de validation avant d'appeler modèle.predict_generator: