【发布时间】:2018-11-05 13:43:25
【问题描述】:
我正在制作一个用于图像分类的 CNN 模型(我有两个类)。我使用ImageDataGenerator 进行数据准备,使用model.fit_generator 进行培训。测试我使用model.evaluate_generator。对于混淆矩阵,我使用sklearn.metrics.confusion_matrix,这需要实际和预测的类。我有我的测试数据的实际类。对于预测,我使用model.predict_generator,但我不知道如何获得预测类。通常我使用model.predict_classes,但它不适用于validation_generator。我的代码如下所示:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
from sklearn.metrics import confusion_matrix
model = Sequential()
model.add(Conv2D(32, (2, 2), input_shape=(50,50,1),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(32, (2, 2),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(64, (2, 2),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(64,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1,activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
batch_size = 10
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'data/train_data',
target_size=(50, 50),
batch_size=batch_size,
class_mode='binary',color_mode='grayscale')
validation_generator = test_datagen.flow_from_directory( 'data/test_data',target_size=(50, 50),
batch_size=batch_size,class_mode='binary',color_mode='grayscale')
model.fit_generator(train_generator,steps_per_epoch=542 ,epochs=10)
print(model.evaluate_generator(validation_generator))
我用下面的代码计算混淆矩阵和其他参数,并继续上面的代码,但我认为这是错误的,因为用 TP TN 公式计算的验证准确率与用model.evaluate_generator 计算的不匹配:
predict1_data=model.predict_generator(validation_generator)
predict_data=np.round(predict1_data)
print(train_generator.class_indices)
print(validation_generator.class_indices)
actual1=np.zeros(21)
actual1[13:21]=1
actual=np.float32(actual1)
cm = confusion_matrix(actual,predict_data)
TN=cm[0,0]
FP=cm[0,1]
FN=cm[1,0]
TP=cm[1,1]
SEN=TP/(TP+FN);print('SEN=',SEN)
SPE=TN/(TN+FP);print('SPE=',SPE)
ACC=(TP+TN)/(TP+TN+FP+FN);print('ACC=',ACC)
【问题讨论】:
-
因此您想为验证集生成混淆矩阵,但找不到获取标签的方法。我们需要更多信息。我猜你正在使用'binary_crossentropy'作为你的损失函数。所以你的预测是这两类的概率。让我们知道这听起来是否正确
-
嗨。我已经用更多信息编辑了我的问题,请检查。
-
请回答问题。