亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何找到這個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 關注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號