如何在使用ImageDataGenerator时获取预测类

时间:2017-12-22 14:59:18

标签: keras confusion-matrix

我正在制作用于图像分类的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)

1 个答案:

答案 0 :(得分:2)

我正在尝试找出同一件事。我最接近的是:

test_datagen = ImageDataGenerator(rescale=1. / 255)

# preprocess data for testing (resize) and create batches
validation_generator = test_datagen.flow_from_directory(
    'data/test/',
    target_size=(img_width, img_height),
    batch_size=16,
    class_mode=None,
    shuffle=False,
)

print(validation_generator.class_indices)

print (model.predict_generator(validation_generator))

此输出的概率适用于1级(不适用于0级)。