为了账号安全,请及时绑定邮箱和手机立即绑定

如何找到这个CNN模型(keras)的ROC曲线和AUC分数

如何找到这个CNN模型(keras)的ROC曲线和AUC分数

拉莫斯之舞 2022-11-01 17:15:40
我在keras中的CNN代码如下:from keras.models import Sequentialfrom keras.layers import Convolution2Dfrom keras.layers import MaxPooling2Dfrom keras.layers import Flattenfrom keras.layers import Densefrom keras.layers import Dropoutclassifier = Sequential()#1st Conv layerclassifier.add(Convolution2D(64, (9, 9), input_shape=(64, 64, 3), activation='relu'))classifier.add(MaxPooling2D(pool_size=(4,4)))#2nd Conv layerclassifier.add(Convolution2D(32, (3, 3), activation='relu'))classifier.add(MaxPooling2D(pool_size=(2,2)))#Flatteningclassifier.add(Flatten())# Step 4 - Full connectionclassifier.add(Dense(units = 128, activation = 'relu'))classifier.add(Dropout(0.1))classifier.add(Dense(units = 128, activation = 'relu'))classifier.add(Dropout(0.2))classifier.add(Dense(units = 128, activation = 'relu'))classifier.add(Dense(units = 2, activation = 'softmax'))classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])#Fitting datasetfrom keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(rescale = 1./255,                                   shear_range = 0.2,                                   zoom_range = 0.2,                                   horizontal_flip = True)test_datagen = ImageDataGenerator(rescale = 1./255)training_set = train_datagen.flow_from_directory('dataset/training_set',                                                 target_size = (64, 64),                                                 batch_size = 32,                                                 class_mode = 'categorical')test_set = test_datagen.flow_from_directory('dataset/test_set',                                            target_size = (64, 64),                                            batch_size = 32,                                            class_mode = 'categorical')无论我在哪里看到 sklearn.metrics 中使用 roc_curve,它都需要 x_train、y_train、x_test、y_test 等参数,我知道这些参数可以是 pandas DataFrames,但在我的情况下并非如此。如何绘制 ROC 曲线并获得用于 CNN 模型训练的 AUC 分数?
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

我让它工作了。我所要做的就是将获得的 preds 的数据类型preds = classifier.predict(test_set)与我获得的 true_labels 相匹配labels = test_set。Preds 基本上是一个 numpy.ndarray 包含具有 np.float32 值的单个元素列表。将标签转换为相同的格式和形状使 roc_curve 正常工作。

此外,我必须添加第三个变量阈值,fpr, tpr, threshold = roc_curve(true_labels, preds)因此不会弹出 ValueError: too many values to unpack 错误。


查看完整回答
反对 回复 2022-11-01
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

实际上,如果查看 sklearn.metrics.roc_curve 的文档(以及几乎每个 sklearn 指标),他们不会将模型(图像)的输入作为参数,它只需要真实标签和预测标签。因此,在您对测试集进行推断之后,在 keras 中(这里我只是猜测)类似于

preds = classifier.predict(batch)

您将 roc_curve 称为

fpr, tpr = roc_curve(true_labels,preds)

可能你必须改变类型,因为它们是张量。

编辑:我已经检查了 keras 文档flow_from_directory并产生了一个迭代器,(x,y) = (images,labels)所以如果你想做某种训练后分析,你应该使用这样的东西来获取标签:

labels = []
for _,y in test_set:
    labels.extend(list(y))

如果您只有两个类,请将 class_mode 更改为binary


查看完整回答
反对 回复 2022-11-01
?
阿晨1998

TA贡献2037条经验 获得超6个赞

要计算 ROC AUC,您需要分数,而不是最终分类/决策的结果。

classifier.add(Dense(units = 2, activation = 'softmax'))由于您的模型有一个以两个神经元( 所以,你不能将它与 softmax 一起使用。

您可以用一个神经元和 sigmoid 替换您的 2 个神经元和 softmax。然后,roc_curve在二元分类问题中使用是安全的。

还有另一个名为roc_auc_score的函数,它具有multi_class将多类分类问题转换为多个二元问题的参数。例如,auc_roc = roc_auc_score(labels, classifier.predict(...), multi_class='ovr')。但是,这只会返回 AUC 分数,它不能帮助您绘制 ROC 曲线。


查看完整回答
反对 回复 2022-11-01
  • 3 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信