現在kerasを使った画像分類タスク(今回は4つのクラス分類)を勉強中です。
画像の元データが少ないので以下のような手順でプログラムを作成しようとしています。
- Trainデータの水増し(ImageDataGenerator)
- ファインチューニングを使ったモデルの構築
- Trainデータ、Validationデータを使ったモデルの評価、保存
- 作成したモデルとTestデータを使用した画像分類
ここで手順3のモデル評価時にValidationデータの予想結果を混合行列を使って可視化したいと思っています。
sklearnのconfusion_matrix()とmatplotlibを用いて下記Figure1のような混合行列を表示・保存したいです。
現在Figure2のような状態なのですが、
・Figure1のようにどの画像で何枚間違えたかを可視化する方法がわからない
・Figure2のA, Dの部分の見切れた部分をどうにかしたい
という状況で、この打開策をご教授頂きたく思います。
現在のコードは下記の通りです。
#ライブラリのインポート部分は省略 program_path = Path(__file__).parent.resolve() parent_path = program_path.parent.resolve() data_path = parent_path / 'data' data_processed_path = data_path / 'processed' train_dir = os.path.join(data_processed_path, 'Train') validation_dir = os.path.join(data_processed_path, 'Validation') test_dir = os.path.join(data_processed_path, 'Test') label = os.listdir(test_dir) n_categories = len(label) n_epochs = 500 batch_size = 8 input_image_size = 224 def create_vgg16(): base_model = VGG16( include_top = False, weights = "imagenet", input_shape = None ) x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation = 'relu')(x) predictions = Dense(n_categories, activation = 'softmax')(x) model = Model(inputs = base_model.input, outputs = predictions) for layer in model.layers[:17]: layer.trainable = False for layer in model.layers[17:]: layer.trainable = True return model model = create_vgg16() model.compile( optimizer = Adam(), loss = 'categorical_crossentropy', metrics = ["accuracy"] ) train_datagen=ImageDataGenerator( rescale=1.0/255, shear_range=0.2, zoom_range=0.2, vertical_flip=True, horizontal_flip=True, height_shift_range=0.5, width_shift_range=0.5, channel_shift_range=5.0, brightness_range=[0.3,1.0], fill_mode='nearest ) validation_datagen=ImageDataGenerator(rescale=1.0/255) train_generator=train_datagen.flow_from_directory( train_dir, target_size=(input_image_size,input_image_size), batch_size=batch_size, class_mode='categorical', shuffle=True ) validation_generator=validation_datagen.flow_from_directory( validation_dir, target_size=(input_image_size,input_image_size), batch_size=batch_size, class_mode='categorical', shuffle=False ) history=model.fit_generator( train_generator, epochs=n_epochs, verbose=1, validation_data=validation_generator ) #Confution Matrix and Classification Report def plot_confusion_matrix(cm, classes, cmap): plt.imshow(cm, cmap=cmap) plt.colorbar() plt.ylabel('True label') plt.xlabel('Predicted label') plt.title('Confusion Matrix') tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) plt.tight_layout() plt.savefig(os.path.join(result_path, 'confuse_' + file_name + '.png')) Y_pred = model.predict_generator(validation_generator) y_pred = np.argmax(Y_pred, axis=1) true_class = validation_generator.classes class_labels = list(validation_generator.class_indices.keys()) cm = confusion_matrix(true_class, y_pred) cmap = plt.cm.Blues plot_confusion_matrix(cm, classes=class_labels, cmap=cmap)
ちなみに画像データ格納フォルダの階層は次のような感じです。
data
-processed
--Train
---A
----sample01.png
----sample02.png
・・・
---B
---C
---D
--Validation
---A
---B
---C
---D
--Test
---A
---B
---C
---D
初心者的な質問になってしまっているかもしれませんが、よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。