我已经用keras训练了CNN的模型(多类分类),现在我想在我的测试图像集上评估这个模型。
除了准确性、精确性和召回率之外,评估我的模型有哪些可能的选择?我知道如何从自定义脚本中获得精确性和可回忆性。但是我找不到方法来得到我的12类图像的混淆矩阵。 Scikit learn显示way,但不显示图像。 我正在使用model.fit_生成器()
是否有方法为我的所有类创建混淆矩阵或在我的类上查找分类可信度?我正在使用Google Colab,不过我可以下载模型并在本地运行。
任何帮助都将不胜感激。
代码:
train_data_path = 'dataset_cfps/train'
validation_data_path = 'dataset_cfps/validation'
#Parametres
img_width, img_height = 224, 224
vggface = VGGFace(model='resnet50', include_top=False, input_shape=(img_width, img_height, 3))
#vgg_model = VGGFace(include_top=False, input_shape=(224, 224, 3))
last_layer = vggface.get_layer('avg_pool').output
x = Flatten(name='flatten')(last_layer)
xx = Dense(256, activation = 'sigmoid')(x)
x1 = BatchNormalization()(xx)
x2 = Dropout(0.3)(x1)
y = Dense(256, activation = 'sigmoid')(x2)
yy = BatchNormalization()(y)
y1 = Dropout(0.6)(yy)
x3 = Dense(12, activation='sigmoid', name='classifier')(y1)
custom_vgg_model = Model(vggface.input, x3)
# Create the model
model = models.Sequential()
# Add the convolutional base model
model.add(custom_vgg_model)
model.summary()
#model = load_model('facenet_resnet_lr3_SGD_sameas1.h5')
def recall(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = true_positives / (possible_positives + K.epsilon())
return recall
def precision(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
validation_datagen = ImageDataGenerator(rescale=1./255)
# Change the batchsize according to your system RAM
train_batchsize = 32
val_batchsize = 32
train_generator = train_datagen.flow_from_directory(
train_data_path,
target_size=(img_width, img_height),
batch_size=train_batchsize,
class_mode='categorical')
validation_generator = validation_datagen.flow_from_directory(
validation_data_path,
target_size=(img_width, img_height),
batch_size=val_batchsize,
class_mode='categorical',
shuffle=True)
# Compile the model
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.SGD(lr=1e-3),
metrics=['acc', recall, precision])
# Train the model
history = model.fit_generator(
train_generator,
steps_per_epoch=train_generator.samples/train_generator.batch_size ,
epochs=100,
validation_data=validation_generator,
validation_steps=validation_generator.samples/validation_generator.batch_size,
verbose=1)
# Save the model
model.save('facenet_resnet_lr3_SGD_new_FC.h5')
为什么scikit学习功能不起作用?您转发传递列车/测试集中的所有样本(图像),将一个热编码转换为标签编码(请参见link),并将其作为
y_pred
传递到sklearn.metrics.confusion_matrix
。以类似的方式处理y_true
(一个热标签)。示例代码:
以下是如何获取所有类的混淆矩阵(或使用scikit learn进行统计):
1.预测班级
2.获取基本真相类和类标签
三。使用scikit学习获取统计信息
您可以阅读更多here
编辑: 如果上述方法不起作用,请查看此视频Create confusion matrix for predictions from Keras model。如果你有问题的话,可以看看评论。 或Make predictions with a Keras CNN Image Classifier
相关问题 更多 >
编程相关推荐