実現したいこと
CNNで学習させたモデルに対して、
混同行列を用いて評価したいです。
下記を参考にpythonで作成しております。
https://qiita.com/tmengine/items/4eeb6770a9a69baf9439
上記のコードを順に打ち込んでおり、
一番最後の「検証-2.混同行列」でつまづいております。
(該当のソースコード欄に実際の全コードを記載しました。
現状動作しない部分は173行目の#検証(混同行列で確認)の部分になります。)
発生している問題・分からないこと
1.参考URLをそのまま打ち込むと、hdf5ファイルが見つからない。といった内容のエラーになる。
2.プログラム中で生成したmodel(model-XXX.h5)を参照させると、
引数が適切でない。といった内容のエラーになる。
エラーメッセージ
error(発生している問題1のerror)
1--------------------------------------------------------------------------- 2OSError Traceback (most recent call last) 3<ipython-input-72-b4c8e44d1521> in <module> 4 1 from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay 5----> 2 best_model = models.load_model("./cnn_casting_inspection3.hdf5") 6 3 7 4 y_pred_proba = best_model.predict(test_generator, verbose=1) 8 5 threshold = 0.5 9 ) 10 11OSError: No file or directory found at ./cnn_casting_inspection3.hdf5
error(発生している問題2のerror)
11/1 [==============================] - 0s 234ms/step 2--------------------------------------------------------------------------- 3TypeError Traceback (most recent call last) 4<ipython-input-101-e403463aafc7> in <module> 5 8 6 9 #cmd = ConfusionMatrixDisplay(confusion, [0,1]) 7---> 10 cmd = ConfusionMatrixDisplay(confusion, [0,1]) 8 11 cmd.plot(cmap=plt.cm.Blues) 9 10TypeError: __init__() takes 2 positional arguments but 3 were given
該当のソースコード
python
1import os 2import cv2 3import random 4import pandas as pd 5import numpy as np 6import matplotlib.pyplot as plt 7import tensorflow as tf 8import keras 9import keras.preprocessing.image as Image 10import sklearn.metrics 11from keras.preprocessing.image import ImageDataGenerator 12from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay 13from sklearn.metrics import classification_report 14from tensorflow.keras.layers import Dense, Dropout, Flatten, Input 15from tensorflow.keras.models import Model, Sequential 16from tensorflow.keras import preprocessing, layers, models, callbacks 17from keras.callbacks import ModelCheckpoint 18from keras.preprocessing.image import load_img, save_img, img_to_array, array_to_img 19from keras.preprocessing import image 20 21#CNN用 22from tensorflow.keras.layers import Activation, Conv2D, Dense, Flatten, MaxPooling2D 23from tensorflow.keras.models import Sequential, load_model 24from tensorflow.keras.utils import to_categorical 25import h5py 26 27#モデルの定義 28model = Sequential() 29 30#データ数のチェック//////////////////////////////////// 31#train data数 32print("OK_train :", len(os.listdir("./train/OK"))) 33print("NG_train :", len(os.listdir("./train/NG")) ) 34print("") 35#test data数 36print("OK_test :", len(os.listdir("./test/OK"))) 37print("NG_test:", len(os.listdir("./test/NG"))) 38 39#画像のチェック///////////////////////////////////////// 40img_ok = "./train/OK" 41lsdir = os.listdir(img_ok) 42 43imgs = [] 44for i in lsdir: 45 target = os.path.join(img_ok, i) 46 img = cv2.imread(target) 47 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 48 imgs.append(img) 49 50count = 8 51plt.figure(figsize=(15, 6)) 52for i, l in enumerate(random.sample(imgs, count)):#ランダムに複数の要素を選択(重複なし) 53 plt.subplot(2,5, i+1) 54 plt.axis('off') 55 plt.title("img"+str(i)) 56 plt.imshow(l) 57 58 59#正規化////////////////////////////////////////////////////////////////////////////// 60#kerasのImageDataGeneratorクラスのインスタンスを作成 61datagen = image.ImageDataGenerator( 62 rescale=1/255, 63 validation_split = 0.1 64) 65 66#flow_from_directory()でディレクトリへのパスを受け取り、そこから自動でデータを読み取って加工したデータのバッチを生成 67train_generator = datagen.flow_from_directory("./train/", 68 class_mode='binary', 69 batch_size=32, 70 target_size=(300,300), 71 color_mode='grayscale', 72 classes={'OK':0, 'NG':1}, 73 shuffle=True, 74 subset = "training"#はじめに書いたvalidationかtrainのデータかを指定する。 75) 76 77val_generator = datagen.flow_from_directory("./train", 78 class_mode='binary', 79 batch_size=32, 80 target_size=(300,300), 81 color_mode='grayscale', 82 classes={'OK':0, 'NG':1}, 83 shuffle=True, 84 subset = "validation" 85) 86 87#ImageDataGeneratorクラスのインスタンスを作成(テストデータ用) 88test_datagen = image.ImageDataGenerator( 89 rescale = 1/255 90) 91 92n_test = sum([len(files) for curDir, dirs, files in os.walk("./test")]) 93 94test_generator = test_datagen.flow_from_directory("./test", 95 class_mode='binary', 96 batch_size=n_test, 97 target_size=(300,300), 98 color_mode='grayscale', 99 classes={'OK':0, 'NG':1}, 100 shuffle = False 101) 102 103#CNN//////////////////////////////////////////////////////////// 104# 畳み込み層 105model.add(Conv2D(filters=16,kernel_size=(7,7),strides=(2,2),padding='same',activation='relu',input_shape=(300,300,1))) 106model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2))) 107 108model.add(Conv2D(filters=32,kernel_size=(3,3),activation='relu',padding='same')) 109model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2))) 110 111model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu", padding="same")) 112model.add(MaxPooling2D(pool_size = (2,2), strides =(2,2))) 113 114model.add(Conv2D(filters=128, kernel_size=(3,3), activation="relu", padding="same")) 115model.add(MaxPooling2D(pool_size = (2,2), strides =(2,2))) 116 117model.add(Conv2D(filters=256, kernel_size=(3,3), activation="relu", padding="same")) 118model.add(MaxPooling2D(pool_size = (2,2), strides =(2,2))) 119 120model.add(Flatten()) 121 122model.add(Dense(units=64,activation='relu')) 123model.add(Dropout(rate=0.2)) 124model.add(Dense(units=1,activation='sigmoid')) 125 126#コンパイル→ニューラルネットワークモデルの生成終了 127model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']) 128 129#ニューラルネットワークの構造確認 130model.summary() 131 132#モデルの学習 133model.fit_generator(train_generator, validation_data=val_generator, epochs=10) 134 135 136#学習////////////////////////////////////////////////// 137%%time 138filepath = "./model/model-{epoch:02d}.h5" 139 140# エポックごとにモデルを保存するかチェック 141checkpoint = ModelCheckpoint ( 142 filepath=filepath, 143 monitor='val_loss', #評価をチェックする対象 144 verbose=1, 145 save_best_only=True, # 精度が向上した場合のみ保存する。 146 mode='min', 147 period=1 ) 148 149H = model.fit( 150 train_generator, 151 validation_data=val_generator, 152 epochs=20, 153 callbacks=[checkpoint], 154) 155 156#損失関数の確認 157#accuracy・・・正解率 158#loss・・・正解と予測値の差。小さいとよい。 159#val・・・validation(検証) 160 161fig = plt.figure(figsize=(8, 6)) 162 163plt.plot(H.history['accuracy'], label='acc', ls='-', marker='o') 164plt.plot(H.history['val_accuracy'], label='val_acc', ls='-', marker='x') 165plt.plot(H.history['loss'], label='loss', ls='-', marker='o') 166plt.plot(H.history['val_loss'], label='val_loss', ls='-', marker='x') 167plt.title('Model Evaluaton') 168plt.xlabel('epoch') 169plt.ylabel('') 170plt.legend(['acc', 'val_acc', 'loss', 'val_loss']) 171plt.grid(color='gray', alpha=0.2) 172 173#検証(混同行列で確認)//////////////////////////////////////////////////////////////////////// 174from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay 175#best_model = models.load_model("./cnn_casting_inspection3.hdf5")#←発生している問題1の該当部分 176best_model = models.load_model("./model/model-40.h5")#←発生している問題1はこのコードに直すと、解消される 177 178y_pred_proba = best_model.predict(test_generator, verbose=1) 179threshold = 0.5 180y_pred = y_pred_proba >= threshold 181 182confusion = confusion_matrix(y_pred, y_pred) #←追加コード:第1引数に正解のデータを入れたい 183 184cmd = ConfusionMatrixDisplay(confusion, [0,1]) #←発生している問題2の該当部分 185cmd.plot(cmap=plt.cm.Blues) 186 187
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
1.「import h5py」コードを追加しましたが、結果は変わりません。
バージョン・・・h5py:2.10.0
2.googleで「models.load_model」のワードで検索しましたが、
hdf5を読み込んでいる他の参考コードは見つかりませんでした。
3.ConfusionMatrixDisplayの引数を下記のように変更。
cmd = ConfusionMatrixDisplay(confusion, [0,1]) #←発生している問題2の該当部分
cmd = ConfusionMatrixDisplay(confusion_matrix = confusion_matrix, display_labels = [0,1])
すると、別のerrorコードが発生。
error(発生している問題2のerror)
11/1 [==============================] - 0s 230ms/step 2--------------------------------------------------------------------------- 3AttributeError Traceback (most recent call last) 4<ipython-input-100-b1f4923769f1> in <module> 5 9 #cmd = ConfusionMatrixDisplay(confusion, [0,2]) 6 10 cmd = ConfusionMatrixDisplay(confusion_matrix = confusion_matrix, display_labels = [0,1]) 7---> 11 cmd.plot(cmap=plt.cm.Blues) 8 9~\anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs) 10 71 FutureWarning) 11 72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)}) 12---> 73 return f(**kwargs) 13 74 return inner_f 14 75 15 16~\anaconda3\lib\site-packages\sklearn\metrics\_plot\confusion_matrix.py in plot(self, include_values, cmap, xticks_rotation, values_format, ax) 17 84 18 85 cm = self.confusion_matrix 19---> 86 n_classes = cm.shape[0] 20 87 self.im_ = ax.imshow(cm, interpolation='nearest', cmap=cmap) 21 88 self.text_ = None 22 23AttributeError: 'function' object has no attribute 'shape'
4.182行目に下記コードを追加(該当のソースコードに記入済み)すると、
混同行列自体は表示されるようになりました。
しかし、confusion_matrixの第1引数に正解データを入れたいのですが、
ここがわかりません。
y_predの中身を確認すると、下記のような配列になっているので、
array([[False], [False], [ True],....)
正解データも同様の形式で配列に格納したいです。
confusion = confusion_matrix(y_pred, y_pred) #←追加コード:第1引数に正解のデータを入れたい
補足
Python 3.8.3
回答1件
あなたの回答
tips
プレビュー