Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到CNN模型(keras)的ROC曲线和AUC分数_Python_Tensorflow_Keras_Deep Learning_Neural Network - Fatal编程技术网

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

Python 如何找到CNN模型(keras)的ROC曲线和AUC分数,python,tensorflow,keras,deep-learning,neural-network,Python,Tensorflow,Keras,Deep Learning,Neural Network,我在keras的CNN代码如下: from keras.models import Sequential from keras.layers import Convolution2D from keras.layers import MaxPooling2D from keras.layers import Flatten from keras.layers import Dense from keras.layers import Dropout classifier = Sequentia

我在keras的CNN代码如下:

from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout

classifier = Sequential()
#1st Conv layer
classifier.add(Convolution2D(64, (9, 9), input_shape=(64, 64, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(4,4)))
#2nd Conv layer
classifier.add(Convolution2D(32, (3, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2,2)))

#Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.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 dataset

from keras.preprocessing.image import ImageDataGenerator

train_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')

classifier.fit_generator(
        training_set,
        steps_per_epoch=(1341+3875)/32,
        epochs=15,
        validation_data=test_set,
        validation_steps=(234+390)/32)

无论我在哪里看到sklearn.metrics中使用roc_曲线,它都会使用x_-train、y_-train、x_-test、y_-test等参数,我知道这些参数可以是数据帧,但在我的例子中,情况并非如此。如何绘制ROC曲线并获得CNN模型训练的AUC分数,如图所示?

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

preds=classifier.predict(批处理)

你把roc_曲线称为

fpr,tpr=roc\u曲线(真标签,pred)

也许你必须改变类型,因为它们是张量

编辑:我已经检查了来自目录的
flow\u上的keras文档
并生成了一个迭代器,迭代器覆盖
(x,y)=(图像,标签)
,因此,如果你想做某种培训后分析,你应该使用如下方法获得标签:

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

如果您只有两个类,请将class_模式更改为binary
我让它工作了。我所要做的就是将从
preds=classifier.predict(test\u set)
获得的preds数据类型与从
labels=test\u set
获得的真实标签进行匹配。Preds基本上是一个numpy.ndarray,包含具有np.float32值的单个元素列表。将标签转换为相同的格式和形状使roc_曲线工作


此外,我还必须在
fpr,tpr,threshold=roc\u曲线(true\u标签,preds)
中添加第三个变量threshold,这样就不会出现ValueError:出现太多值而无法解包的错误。

假设胸部X光数据集有两个类名,“正常”和“肺炎”。在分类器.predict(batch)中,我将batch作为测试集。那么,在调用roc_曲线时,真正的_标签的类型应该是什么?它是一个字符串列表,其中每个元素是“正常”还是“肺炎”?或者是0和1,其中0默认分配给“正常”,反之亦然。我如何知道模型预测每张图像的顺序?在文件资源管理器中排列图像时,您看到的是正常序列吗?关于您的第一个问题,是的,您应该为“正常”和“肺炎”指定一个数字标签。您有测试集的标签吗?有时人们将测试称为没有标签的测试集,在这种情况下,您应该将您的测试集滑入一个测试集和一个验证集。我不确定你的第二个问题,你是说模型可能会改变你图像的顺序吗?如果答案是否定的,预测将以相同的顺序对应图像。对于测试集,我只有一个名为“test_set”的文件夹,其中还有两个名为“PNEUMONIA”和“NORMAL”的文件夹。您是否可以编辑您的答案并添加相应的代码来标记和编码它们,以便我可以准确地获得真实的标签?我不知道如何使用LabelEncoder自动为所有图像分配0和1。请注意,“测试集”的第一个文件夹为“正常”,第二个文件夹为“肺炎”。你答对了我的第二个问题。我尝试了你的解决方案,但它在Jupyter笔记本中无法处理。所以我尝试研究test_集,结果发现每个元素都是一个图像、标签元组列表(图像和标签分别是2D和1D列表)。我设法得到了0和1的标签列表,并将它们展平为只有0和1的列表,并将其命名为“true\u标签”。我使用这个'true_labels'和preds from preds=classifier.predict(test_set)作为fpr,tpr=roc_曲线(true_labels,preds),但它给了我这个错误
ValueError:太多的值需要解包(预期为2)