web-dev-qa-db-ja.com

CNNケラの画像の混同行列

ケラスを使用してCNNのモデル(マルチクラス分類)をトレーニングしましたが、今度はテストの画像セットでモデルを評価したいと思います。

精度、精度、再現率以外に、モデルを評価するための可能なオプションは何ですか?カスタムスクリプトから精度と再現率を取得する方法を知っています。しかし、私はimagesの12クラスの混同行列を取得する方法を見つけることができません。 Scikit-learnは way を表示しますが、画像は表示しません。私はmodel.fit_generator()を使用しています

すべてのクラスの混同行列を作成する方法、またはクラスの分類の信頼度を見つける方法はありますか? Google Colabを使用していますが、モデルをダウンロードしてローカルで実行できます。

任意の助けいただければ幸いです。

コード:

train_data_path = 'dataset_cfps/train'
validation_data_path = 'dataset_cfps/validation'

#Parametres
img_width, img_height = 224, 224

vggface = VGGFace(model='resnet50', include_top=False, input_shape=(img_width, img_height, 3))

#vgg_model = VGGFace(include_top=False, input_shape=(224, 224, 3))

last_layer = vggface.get_layer('avg_pool').output
x = Flatten(name='flatten')(last_layer)
xx = Dense(256, activation = 'sigmoid')(x)
x1 = BatchNormalization()(xx)
x2 = Dropout(0.3)(x1)
y = Dense(256, activation = 'sigmoid')(x2)
yy = BatchNormalization()(y)
y1 = Dropout(0.6)(yy)
x3 = Dense(12, activation='sigmoid', name='classifier')(y1)

custom_vgg_model = Model(vggface.input, x3)


# Create the model
model = models.Sequential()

# Add the convolutional base model
model.add(custom_vgg_model)

model.summary()
#model = load_model('facenet_resnet_lr3_SGD_sameas1.h5')

def recall(y_true, y_pred):
     true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
     possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
     recall = true_positives / (possible_positives + K.epsilon())
     return recall

def precision(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

train_datagen = ImageDataGenerator(
      rescale=1./255,
      rotation_range=20,
      width_shift_range=0.2,
      height_shift_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')


validation_datagen = ImageDataGenerator(rescale=1./255)

# Change the batchsize according to your system RAM
train_batchsize = 32
val_batchsize = 32

train_generator = train_datagen.flow_from_directory(
        train_data_path,
        target_size=(img_width, img_height),
        batch_size=train_batchsize,
        class_mode='categorical')

validation_generator = validation_datagen.flow_from_directory(
        validation_data_path,
        target_size=(img_width, img_height),
        batch_size=val_batchsize,
        class_mode='categorical',
        shuffle=True)

# Compile the model
model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.SGD(lr=1e-3),
              metrics=['acc', recall, precision])
# Train the model
history = model.fit_generator(
      train_generator,
      steps_per_Epoch=train_generator.samples/train_generator.batch_size ,
      epochs=100,
      validation_data=validation_generator,
      validation_steps=validation_generator.samples/validation_generator.batch_size,
      verbose=1)

# Save the model
model.save('facenet_resnet_lr3_SGD_new_FC.h5')
8
Abhishek Singh

すべてのクラスの混同行列(またはscikit-learnを使用した統計)を取得する方法は次のとおりです。

1.クラスを予測する

test_generator = ImageDataGenerator()
test_data_generator = test_generator.flow_from_directory(
    test_data_path, # Put your path here
     target_size=(img_width, img_height),
    batch_size=32,
    shuffle=False)
test_steps_per_Epoch = numpy.math.ceil(test_data_generator.samples / test_data_generator.batch_size)

predictions = model.predict_generator(test_data_generator, steps=test_steps_per_Epoch)
# Get most likely class
predicted_classes = numpy.argmax(predictions, axis=1)

2. Ground-Truthクラスとクラスラベルを取得する

true_classes = test_data_generator.classes
class_labels = list(test_data_generator.class_indices.keys())   

3. scikit-learnを使用して統計を取得する

report = metrics.classification_report(true_classes, predicted_classes, target_names=class_labels)
print(report)    

あなたはもっと読むことができます ここ

編集:上記が機能しない場合は、このビデオをご覧ください Kerasモデルからの予測用の混同行列を作成 。問題がある場合は、コメントを確認してください。または Keras CNN画像分類子で予測を行う

9
Abhishek Singh

Scikit-learn機能が機能しないのはなぜですか? train/testセット内のすべてのサンプル(画像)を転送し、one-hot-encodingをラベルエンコーディング( link を参照)に変換して、sklearn.metrics.confusion_matrixy_predとして渡します。同様の方法でy_true(ワンホットラベル)を使用します。

サンプルコード:

import sklearn.metrics as metrics

y_pred_ohe = KerasClassifier.predict(X)  # shape=(n_samples, 12)
y_pred_labels = np.argmax(y_pred_ohe, axis=1)  # only necessary if output has one-hot-encoding, shape=(n_samples)

confusion_matrix = metrics.confusion_matrix(y_true=y_true_labels, y_pred=y_pred_labels)  # shape=(12, 12)
6
Jan K

ここでは猫と犬がクラスラベルです。

#Confusion Matrix and Classification Report
 from sklearn.metrics import classification_report
 Y_pred = model.predict_generator(validation_generator, nb_validation_samples // 
 batch_size+1)
 y_pred = np.argmax(Y_pred, axis=1)
 print('Confusion Matrix')
 print(confusion_matrix(validation_generator.classes, y_pred))
 print('Classification Report')
 target_names = ['Cats', 'Dogs']
 print(classification_report(validation_generator.classes, y_pred, 
 target_names=target_names))
0
Meghana Rao