Я использую класс Keras ImageDataGenerator для загрузки, обучения и прогнозирования. Я пробовал решения здесь , но проблема все еще есть. Я не уверен, есть ли у меня такая же проблема, как упомянуто здесь . Я предполагаю, что мои y_pred
и y_test
неправильно сопоставлены друг с другом.
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, acc = model.evaluate_generator(validation_generator,
steps=math.ceil(validation_generator.samples / batch_size),
verbose=0,
workers=1)
y_pred = model.predict_generator(validation_generator2,
steps=math.ceil(validation_generator2.samples / batch_size),
verbose=0,
workers=1)
y_pred = np.argmax(y_pred, axis=-1)
y_test = validation_generator2.classes[validation_generator2.index_array]
print('loss: ', loss, 'accuracy: ', acc) # loss: 0.47286026436090467 accuracy: 0.864
print('accuracy_score: ', accuracy_score(y_test, y_pred)) # accuracy_score: 0.095
evaluate_generator
от Keras и accuracy_score
от scikit learn дают разную точность. И, конечно, это дало мне неверную матрицу путаницы, когда я использую confusion_matrix(y_test, y_pred)
из scikit learn. Какую ошибку я делаю? (под y_test
я имею в виду y_true
)
Обновление: чтобы показать, что y_test
и y_pred
противоречивы, я печатаю точность каждого класса.
cm = confusion_matrix(y_test, y_pred)
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
cm.diagonal()
acc_each_class = cm.diagonal()
print('accuracy of each class: \n')
for i in range(len(labels)):
print(labels[i], ' : ', acc_each_class[i])
print('\n')
'''
accuracy of each class:
cannoli : 0.085
dumplings : 0.065
edamame : 0.1
falafel : 0.125
french_fries : 0.12
grilled_cheese_sandwich : 0.13
hot_dog : 0.075
seaweed_salad : 0.085
tacos : 0.105
takoyaki : 0.135
Как видно, точность каждого класса слишком низкая.
Обновление 2: как я обучил модель, может помочь
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)