質問編集履歴
1
現在の状況をアップデートしました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -5,53 +5,18 @@
|
|
5
5
|
3. Trainデータ、Validationデータを使ったモデルの評価、保存
|
6
6
|
4. 作成したモデルとTestデータを使用した画像分類
|
7
7
|
|
8
|
+
ここで手順3のモデル評価時にValidationデータの予想結果を混合行列を使って可視化したいと思っています。
|
9
|
+
sklearnのconfusion_matrix()とmatplotlibを用いて下記Figure1のような混合行列を表示・保存したいです。
|
10
|
+
現在Figure2のような状態なのですが、
|
11
|
+
・Figure1のようにどの画像で何枚間違えたかを可視化する方法がわからない
|
12
|
+
・Figure2のA, Dの部分の見切れた部分をどうにかしたい
|
8
|
-
|
13
|
+
という状況で、この打開策をご教授頂きたく思います。
|
14
|
+

|
9
15
|
|
10
|
-
processed
|
11
|
-
-Train
|
12
|
-
--A
|
13
|
-
---sample01.png
|
14
|
-
---sample02.png
|
15
|
-
・・・
|
16
|
-
--B
|
17
|
-
--C
|
18
|
-
--D
|
19
|
-
-Validation
|
20
|
-
--A
|
21
|
-
--B
|
22
|
-
--C
|
23
|
-
--D
|
24
|
-
-Test
|
25
|
-
--A
|
26
|
-
--B
|
27
|
-
--C
|
28
|
-
--D
|
29
|
-
|
30
|
-
ここで手順3のモデル評価時にValidationデータの予想結果を混合行列を使って可視化したいと思っています。(accやlossは図示できました)
|
31
|
-
confusion_matrix()を使い、引数に実クラスと予想クラスを入れればいいと思うのですが、
|
32
|
-
実クラスと予想クラスの抽出方法がわかりません。
|
33
|
-
ネットに出てくる例だとImageDataGeneratorを使わずに画像を読み込み、行列に変換してやっているのを見るのですが、
|
34
|
-
ImageDataGeneratorを使って画像を読み込んだ際にはどのような処理をすればいいのでしょうか?
|
35
|
-
|
36
16
|
現在のコードは下記の通りです。
|
37
|
-
このコードの下にどのような記述をすればいいのかご教授お願い致します。
|
38
17
|
|
39
18
|
```ここに言語を入力
|
40
|
-
import os
|
41
|
-
import random
|
42
|
-
from pathlib import Path
|
43
|
-
import matplotlib.pyplot as plt
|
44
|
-
|
19
|
+
#ライブラリのインポート部分は省略
|
45
|
-
import keras.models
|
46
|
-
from keras.models import Model
|
47
|
-
from keras.models import Sequential
|
48
|
-
from keras.layers import Dense, Input, Activation, Dropout, Flatten
|
49
|
-
from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
|
50
|
-
from keras.layers import MaxPool2D
|
51
|
-
from keras.applications.vgg16 import VGG16
|
52
|
-
from keras.preprocessing.image import ImageDataGenerator
|
53
|
-
from keras.preprocessing.image import img_to_array, load_img
|
54
|
-
from keras.optimizers import Adam, RMSprop, SGD
|
55
20
|
|
56
21
|
program_path = Path(__file__).parent.resolve()
|
57
22
|
parent_path = program_path.parent.resolve()
|
@@ -125,7 +90,7 @@
|
|
125
90
|
target_size=(input_image_size,input_image_size),
|
126
91
|
batch_size=batch_size,
|
127
92
|
class_mode='categorical',
|
128
|
-
shuffle=
|
93
|
+
shuffle=False
|
129
94
|
)
|
130
95
|
|
131
96
|
history=model.fit_generator(
|
@@ -134,7 +99,51 @@
|
|
134
99
|
verbose=1,
|
135
100
|
validation_data=validation_generator
|
136
101
|
)
|
102
|
+
|
103
|
+
#Confution Matrix and Classification Report
|
104
|
+
def plot_confusion_matrix(cm, classes, cmap):
|
105
|
+
|
106
|
+
plt.imshow(cm, cmap=cmap)
|
107
|
+
plt.colorbar()
|
108
|
+
plt.ylabel('True label')
|
109
|
+
plt.xlabel('Predicted label')
|
110
|
+
plt.title('Confusion Matrix')
|
111
|
+
tick_marks = np.arange(len(classes))
|
112
|
+
plt.xticks(tick_marks, classes, rotation=45)
|
113
|
+
plt.yticks(tick_marks, classes)
|
114
|
+
plt.tight_layout()
|
115
|
+
plt.savefig(os.path.join(result_path, 'confuse_' + file_name + '.png'))
|
116
|
+
|
117
|
+
Y_pred = model.predict_generator(validation_generator)
|
118
|
+
y_pred = np.argmax(Y_pred, axis=1)
|
119
|
+
true_class = validation_generator.classes
|
120
|
+
class_labels = list(validation_generator.class_indices.keys())
|
121
|
+
cm = confusion_matrix(true_class, y_pred)
|
122
|
+
cmap = plt.cm.Blues
|
123
|
+
plot_confusion_matrix(cm, classes=class_labels, cmap=cmap)
|
137
124
|
```
|
138
125
|
|
126
|
+
ちなみに画像データ格納フォルダの階層は次のような感じです。
|
139
127
|
|
128
|
+
data
|
129
|
+
-processed
|
130
|
+
--Train
|
131
|
+
---A
|
132
|
+
----sample01.png
|
133
|
+
----sample02.png
|
134
|
+
・・・
|
135
|
+
---B
|
136
|
+
---C
|
137
|
+
---D
|
138
|
+
--Validation
|
139
|
+
---A
|
140
|
+
---B
|
141
|
+
---C
|
142
|
+
---D
|
143
|
+
--Test
|
144
|
+
---A
|
145
|
+
---B
|
146
|
+
---C
|
147
|
+
---D
|
148
|
+
|
140
149
|
初心者的な質問になってしまっているかもしれませんが、よろしくお願いします。
|