質問編集履歴
2
試した事の4番目を追加。
test
CHANGED
File without changes
|
test
CHANGED
@@ -229,14 +229,12 @@
|
|
229
229
|
threshold = 0.5
|
230
230
|
y_pred = y_pred_proba >= threshold
|
231
231
|
|
232
|
+
confusion = confusion_matrix(y_pred, y_pred) #←追加コード:第1引数に正解のデータを入れたい
|
233
|
+
|
232
234
|
cmd = ConfusionMatrixDisplay(confusion, [0,1]) #←発生している問題2の該当部分
|
233
235
|
cmd.plot(cmap=plt.cm.Blues)
|
234
236
|
|
235
237
|
|
236
|
-
```
|
237
|
-
|
238
|
-
```
|
239
|
-
特になし
|
240
238
|
```
|
241
239
|
|
242
240
|
### 試したこと・調べたこと
|
@@ -290,5 +288,21 @@
|
|
290
288
|
↓表示される図
|
291
289
|
![表示される図](https://ddjkaamml8q8x.cloudfront.net/questions/2024-02-11/22cf3d30-147f-4d9c-bc85-6b6dd5c3f46e.png)
|
292
290
|
|
291
|
+
4.182行目に下記コードを追加(該当のソースコードに記入済み)すると、
|
292
|
+
混同行列自体は表示されるようになりました。
|
293
|
+
しかし、confusion_matrixの第1引数に正解データを入れたいのですが、
|
294
|
+
ここがわかりません。
|
295
|
+
y_predの中身を確認すると、下記のような配列になっているので、
|
296
|
+
|
297
|
+
array([[False], [False], [ True],....)
|
298
|
+
|
299
|
+
正解データも同様の形式で配列に格納したいです。
|
300
|
+
|
301
|
+
```
|
302
|
+
confusion = confusion_matrix(y_pred, y_pred) #←追加コード:第1引数に正解のデータを入れたい
|
303
|
+
```
|
304
|
+
↓表示された混同行列
|
305
|
+
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-02-11/2c62c720-e4e4-4c26-a15a-d068ca10dd09.png)
|
306
|
+
|
293
307
|
### 補足
|
294
308
|
Python 3.8.3
|
1
全コードを記載しました。また、エラー名と図も記載しております。
test
CHANGED
File without changes
|
test
CHANGED
@@ -7,12 +7,18 @@
|
|
7
7
|
|
8
8
|
上記のコードを順に打ち込んでおり、
|
9
9
|
一番最後の「検証-2.混同行列」でつまづいております。
|
10
|
+
(該当のソースコード欄に実際の全コードを記載しました。
|
11
|
+
現状動作しない部分は173行目の#検証(混同行列で確認)の部分になります。)
|
12
|
+
|
10
13
|
|
11
14
|
### 発生している問題・分からないこと
|
12
|
-
hdf5ファイルが見つからない。
|
15
|
+
1.参考URLをそのまま打ち込むと、hdf5ファイルが見つからない。といった内容のエラーになる。
|
16
|
+
2.プログラム中で生成したmodel(model-XXX.h5)を参照させると、
|
17
|
+
引数が適切でない。といった内容のエラーになる。
|
18
|
+
|
13
19
|
|
14
20
|
### エラーメッセージ
|
15
|
-
```error
|
21
|
+
```error(発生している問題1のerror)
|
16
22
|
---------------------------------------------------------------------------
|
17
23
|
OSError Traceback (most recent call last)
|
18
24
|
<ipython-input-72-b4c8e44d1521> in <module>
|
@@ -21,42 +27,212 @@
|
|
21
27
|
3
|
22
28
|
4 y_pred_proba = best_model.predict(test_generator, verbose=1)
|
23
29
|
5 threshold = 0.5
|
24
|
-
|
25
|
-
~\anaconda3\lib\site-packages\keras\src\saving\saving_api.py in load_model(filepath, custom_objects, compile, safe_mode, **kwargs)
|
26
|
-
|
30
|
+
)
|
27
|
-
237 # Legacy case.
|
28
|
-
--> 238 return legacy_sm_saving_lib.load_model(
|
29
|
-
239 filepath, custom_objects=custom_objects, compile=compile, **kwargs
|
30
|
-
240 )
|
31
|
-
|
32
|
-
~\anaconda3\lib\site-packages\keras\src\utils\traceback_utils.py in error_handler(*args, **kwargs)
|
33
|
-
68 # To get the full stack trace, call:
|
34
|
-
69 # `tf.debugging.disable_traceback_filtering()`
|
35
|
-
---> 70 raise e.with_traceback(filtered_tb) from None
|
36
|
-
71 finally:
|
37
|
-
72 del filtered_tb
|
38
|
-
|
39
|
-
~\anaconda3\lib\site-packages\keras\src\saving\legacy\save.py in load_model(filepath, custom_objects, compile, options)
|
40
|
-
232 if isinstance(filepath_str, str):
|
41
|
-
233 if not tf.io.gfile.exists(filepath_str):
|
42
|
-
--> 234 raise IOError(
|
43
|
-
235 f"No file or directory found at {filepath_str}"
|
44
|
-
236 )
|
45
31
|
|
46
32
|
OSError: No file or directory found at ./cnn_casting_inspection3.hdf5
|
47
33
|
```
|
48
34
|
|
35
|
+
```error(発生している問題2のerror)
|
36
|
+
1/1 [==============================] - 0s 234ms/step
|
37
|
+
---------------------------------------------------------------------------
|
38
|
+
TypeError Traceback (most recent call last)
|
39
|
+
<ipython-input-101-e403463aafc7> in <module>
|
40
|
+
8
|
41
|
+
9 #cmd = ConfusionMatrixDisplay(confusion, [0,1])
|
42
|
+
---> 10 cmd = ConfusionMatrixDisplay(confusion, [0,1])
|
43
|
+
11 cmd.plot(cmap=plt.cm.Blues)
|
44
|
+
|
45
|
+
TypeError: __init__() takes 2 positional arguments but 3 were given
|
46
|
+
```
|
47
|
+
|
49
48
|
### 該当のソースコード
|
50
49
|
|
51
50
|
```python
|
51
|
+
import os
|
52
|
+
import cv2
|
53
|
+
import random
|
54
|
+
import pandas as pd
|
55
|
+
import numpy as np
|
56
|
+
import matplotlib.pyplot as plt
|
57
|
+
import tensorflow as tf
|
58
|
+
import keras
|
59
|
+
import keras.preprocessing.image as Image
|
60
|
+
import sklearn.metrics
|
61
|
+
from keras.preprocessing.image import ImageDataGenerator
|
52
62
|
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
|
63
|
+
from sklearn.metrics import classification_report
|
64
|
+
from tensorflow.keras.layers import Dense, Dropout, Flatten, Input
|
65
|
+
from tensorflow.keras.models import Model, Sequential
|
66
|
+
from tensorflow.keras import preprocessing, layers, models, callbacks
|
67
|
+
from keras.callbacks import ModelCheckpoint
|
68
|
+
from keras.preprocessing.image import load_img, save_img, img_to_array, array_to_img
|
69
|
+
from keras.preprocessing import image
|
70
|
+
|
71
|
+
#CNN用
|
72
|
+
from tensorflow.keras.layers import Activation, Conv2D, Dense, Flatten, MaxPooling2D
|
73
|
+
from tensorflow.keras.models import Sequential, load_model
|
74
|
+
from tensorflow.keras.utils import to_categorical
|
75
|
+
import h5py
|
76
|
+
|
77
|
+
#モデルの定義
|
78
|
+
model = Sequential()
|
79
|
+
|
80
|
+
#データ数のチェック////////////////////////////////////
|
81
|
+
#train data数
|
82
|
+
print("OK_train :", len(os.listdir("./train/OK")))
|
83
|
+
print("NG_train :", len(os.listdir("./train/NG")) )
|
84
|
+
print("")
|
85
|
+
#test data数
|
86
|
+
print("OK_test :", len(os.listdir("./test/OK")))
|
87
|
+
print("NG_test:", len(os.listdir("./test/NG")))
|
88
|
+
|
89
|
+
#画像のチェック/////////////////////////////////////////
|
90
|
+
img_ok = "./train/OK"
|
91
|
+
lsdir = os.listdir(img_ok)
|
92
|
+
|
93
|
+
imgs = []
|
94
|
+
for i in lsdir:
|
95
|
+
target = os.path.join(img_ok, i)
|
96
|
+
img = cv2.imread(target)
|
97
|
+
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
98
|
+
imgs.append(img)
|
99
|
+
|
100
|
+
count = 8
|
101
|
+
plt.figure(figsize=(15, 6))
|
102
|
+
for i, l in enumerate(random.sample(imgs, count)):#ランダムに複数の要素を選択(重複なし)
|
103
|
+
plt.subplot(2,5, i+1)
|
104
|
+
plt.axis('off')
|
105
|
+
plt.title("img"+str(i))
|
106
|
+
plt.imshow(l)
|
107
|
+
|
108
|
+
|
109
|
+
#正規化//////////////////////////////////////////////////////////////////////////////
|
110
|
+
#kerasのImageDataGeneratorクラスのインスタンスを作成
|
111
|
+
datagen = image.ImageDataGenerator(
|
112
|
+
rescale=1/255,
|
113
|
+
validation_split = 0.1
|
114
|
+
)
|
115
|
+
|
116
|
+
#flow_from_directory()でディレクトリへのパスを受け取り、そこから自動でデータを読み取って加工したデータのバッチを生成
|
117
|
+
train_generator = datagen.flow_from_directory("./train/",
|
118
|
+
class_mode='binary',
|
119
|
+
batch_size=32,
|
120
|
+
target_size=(300,300),
|
121
|
+
color_mode='grayscale',
|
122
|
+
classes={'OK':0, 'NG':1},
|
123
|
+
shuffle=True,
|
124
|
+
subset = "training"#はじめに書いたvalidationかtrainのデータかを指定する。
|
125
|
+
)
|
126
|
+
|
127
|
+
val_generator = datagen.flow_from_directory("./train",
|
128
|
+
class_mode='binary',
|
129
|
+
batch_size=32,
|
130
|
+
target_size=(300,300),
|
131
|
+
color_mode='grayscale',
|
132
|
+
classes={'OK':0, 'NG':1},
|
133
|
+
shuffle=True,
|
134
|
+
subset = "validation"
|
135
|
+
)
|
136
|
+
|
137
|
+
#ImageDataGeneratorクラスのインスタンスを作成(テストデータ用)
|
138
|
+
test_datagen = image.ImageDataGenerator(
|
139
|
+
rescale = 1/255
|
140
|
+
)
|
141
|
+
|
142
|
+
n_test = sum([len(files) for curDir, dirs, files in os.walk("./test")])
|
143
|
+
|
144
|
+
test_generator = test_datagen.flow_from_directory("./test",
|
145
|
+
class_mode='binary',
|
146
|
+
batch_size=n_test,
|
147
|
+
target_size=(300,300),
|
148
|
+
color_mode='grayscale',
|
149
|
+
classes={'OK':0, 'NG':1},
|
150
|
+
shuffle = False
|
151
|
+
)
|
152
|
+
|
153
|
+
#CNN////////////////////////////////////////////////////////////
|
154
|
+
# 畳み込み層
|
155
|
+
model.add(Conv2D(filters=16,kernel_size=(7,7),strides=(2,2),padding='same',activation='relu',input_shape=(300,300,1)))
|
156
|
+
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
|
157
|
+
|
158
|
+
model.add(Conv2D(filters=32,kernel_size=(3,3),activation='relu',padding='same'))
|
159
|
+
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
|
160
|
+
|
161
|
+
model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu", padding="same"))
|
162
|
+
model.add(MaxPooling2D(pool_size = (2,2), strides =(2,2)))
|
163
|
+
|
164
|
+
model.add(Conv2D(filters=128, kernel_size=(3,3), activation="relu", padding="same"))
|
165
|
+
model.add(MaxPooling2D(pool_size = (2,2), strides =(2,2)))
|
166
|
+
|
167
|
+
model.add(Conv2D(filters=256, kernel_size=(3,3), activation="relu", padding="same"))
|
168
|
+
model.add(MaxPooling2D(pool_size = (2,2), strides =(2,2)))
|
169
|
+
|
170
|
+
model.add(Flatten())
|
171
|
+
|
172
|
+
model.add(Dense(units=64,activation='relu'))
|
173
|
+
model.add(Dropout(rate=0.2))
|
174
|
+
model.add(Dense(units=1,activation='sigmoid'))
|
175
|
+
|
176
|
+
#コンパイル→ニューラルネットワークモデルの生成終了
|
177
|
+
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
|
178
|
+
|
179
|
+
#ニューラルネットワークの構造確認
|
180
|
+
model.summary()
|
181
|
+
|
182
|
+
#モデルの学習
|
183
|
+
model.fit_generator(train_generator, validation_data=val_generator, epochs=10)
|
184
|
+
|
185
|
+
|
186
|
+
#学習//////////////////////////////////////////////////
|
187
|
+
%%time
|
188
|
+
filepath = "./model/model-{epoch:02d}.h5"
|
189
|
+
|
190
|
+
# エポックごとにモデルを保存するかチェック
|
191
|
+
checkpoint = ModelCheckpoint (
|
192
|
+
filepath=filepath,
|
193
|
+
monitor='val_loss', #評価をチェックする対象
|
194
|
+
verbose=1,
|
195
|
+
save_best_only=True, # 精度が向上した場合のみ保存する。
|
196
|
+
mode='min',
|
197
|
+
period=1 )
|
198
|
+
|
199
|
+
H = model.fit(
|
200
|
+
train_generator,
|
201
|
+
validation_data=val_generator,
|
202
|
+
epochs=20,
|
203
|
+
callbacks=[checkpoint],
|
204
|
+
)
|
205
|
+
|
206
|
+
#損失関数の確認
|
207
|
+
#accuracy・・・正解率
|
208
|
+
#loss・・・正解と予測値の差。小さいとよい。
|
209
|
+
#val・・・validation(検証)
|
210
|
+
|
211
|
+
fig = plt.figure(figsize=(8, 6))
|
212
|
+
|
213
|
+
plt.plot(H.history['accuracy'], label='acc', ls='-', marker='o')
|
214
|
+
plt.plot(H.history['val_accuracy'], label='val_acc', ls='-', marker='x')
|
215
|
+
plt.plot(H.history['loss'], label='loss', ls='-', marker='o')
|
216
|
+
plt.plot(H.history['val_loss'], label='val_loss', ls='-', marker='x')
|
217
|
+
plt.title('Model Evaluaton')
|
218
|
+
plt.xlabel('epoch')
|
219
|
+
plt.ylabel('')
|
220
|
+
plt.legend(['acc', 'val_acc', 'loss', 'val_loss'])
|
221
|
+
plt.grid(color='gray', alpha=0.2)
|
222
|
+
|
223
|
+
#検証(混同行列で確認)////////////////////////////////////////////////////////////////////////
|
224
|
+
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
|
53
|
-
best_model = models.load_model("./cnn_casting_inspection3.hdf5")
|
225
|
+
#best_model = models.load_model("./cnn_casting_inspection3.hdf5")#←発生している問題1の該当部分
|
226
|
+
best_model = models.load_model("./model/model-40.h5")#←発生している問題1はこのコードに直すと、解消される
|
54
227
|
|
55
228
|
y_pred_proba = best_model.predict(test_generator, verbose=1)
|
56
229
|
threshold = 0.5
|
57
230
|
y_pred = y_pred_proba >= threshold
|
231
|
+
|
58
|
-
cmd = ConfusionMatrixDisplay(confusion, [0,1])
|
232
|
+
cmd = ConfusionMatrixDisplay(confusion, [0,1]) #←発生している問題2の該当部分
|
59
233
|
cmd.plot(cmap=plt.cm.Blues)
|
234
|
+
|
235
|
+
|
60
236
|
```
|
61
237
|
|
62
238
|
```
|
@@ -72,11 +248,47 @@
|
|
72
248
|
##### 上記の詳細・結果
|
73
249
|
1.「import h5py」コードを追加しましたが、結果は変わりません。
|
74
250
|
バージョン・・・h5py:2.10.0
|
75
|
-
|
76
251
|
2.googleで「models.load_model」のワードで検索しましたが、
|
77
252
|
hdf5を読み込んでいる他の参考コードは見つかりませんでした。
|
78
253
|
|
79
|
-
3.
|
254
|
+
3.ConfusionMatrixDisplayの引数を下記のように変更。
|
255
|
+
|
256
|
+
```全コードの182行目(変更前)
|
257
|
+
cmd = ConfusionMatrixDisplay(confusion, [0,1]) #←発生している問題2の該当部分
|
258
|
+
```
|
259
|
+
```全コードの182行目(変更後)
|
260
|
+
cmd = ConfusionMatrixDisplay(confusion_matrix = confusion_matrix, display_labels = [0,1])
|
261
|
+
```
|
262
|
+
|
263
|
+
すると、別のerrorコードが発生。
|
264
|
+
|
265
|
+
```error(発生している問題2のerror)
|
266
|
+
1/1 [==============================] - 0s 230ms/step
|
267
|
+
---------------------------------------------------------------------------
|
268
|
+
AttributeError Traceback (most recent call last)
|
269
|
+
<ipython-input-100-b1f4923769f1> in <module>
|
270
|
+
9 #cmd = ConfusionMatrixDisplay(confusion, [0,2])
|
271
|
+
10 cmd = ConfusionMatrixDisplay(confusion_matrix = confusion_matrix, display_labels = [0,1])
|
272
|
+
---> 11 cmd.plot(cmap=plt.cm.Blues)
|
273
|
+
|
274
|
+
~\anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs)
|
275
|
+
71 FutureWarning)
|
276
|
+
72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
|
277
|
+
---> 73 return f(**kwargs)
|
278
|
+
74 return inner_f
|
279
|
+
75
|
280
|
+
|
281
|
+
~\anaconda3\lib\site-packages\sklearn\metrics\_plot\confusion_matrix.py in plot(self, include_values, cmap, xticks_rotation, values_format, ax)
|
282
|
+
84
|
283
|
+
85 cm = self.confusion_matrix
|
284
|
+
---> 86 n_classes = cm.shape[0]
|
285
|
+
87 self.im_ = ax.imshow(cm, interpolation='nearest', cmap=cmap)
|
286
|
+
88 self.text_ = None
|
287
|
+
|
288
|
+
AttributeError: 'function' object has no attribute 'shape'
|
289
|
+
```
|
290
|
+
↓表示される図
|
291
|
+
![表示される図](https://ddjkaamml8q8x.cloudfront.net/questions/2024-02-11/22cf3d30-147f-4d9c-bc85-6b6dd5c3f46e.png)
|
80
292
|
|
81
293
|
### 補足
|
82
294
|
Python 3.8.3
|