【问题标题】:how to get predicted classes when using ImageDataGenerator使用 ImageDataGenerator 时如何获取预测的类
【发布时间】: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'作为你的损失函数。所以你的预测是这两类的概率。让我们知道这听起来是否正确
  • 嗨。我已经用更多信息编辑了我的问题,请检查。
  • 请回答问题。

标签: keras confusion-matrix


【解决方案1】:

我正试图弄清楚同样的事情。我最接近的是:

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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2020-03-18
    • 2018-12-20
    • 2020-05-10
    • 2021-01-17
    • 2017-08-19
    • 2019-05-22
    相关资源
    最近更新 更多