前提・実現したいこと
初めての投稿です。
CNNで画像を学習させているのですが、困っているのでお力を貸していただきたいです。
機械学習・python初心者のため基礎的な質問でしたら申し訳ありません。
やりたいこと
学習用データ
dataset normal 4500枚
dataset abnormal 150枚
テスト用データ
dataset normal 1500枚
dataset abnormal 50枚
を読み込み、CNNで学習して混同行列を作成したいのですが下記に示しているようなエラーが出ます。
テストデータを読み込んだ部分でミスをしていると考えているのですが、改善策があれば教えていただきたいです。
ちなみにコード内で学習結果のグラフも出すようにしていますが、学習がうまくいっていないのかTrainもValidationの推移(線)も表示されていません。
python
1 2import keras 3import glob 4import numpy as np 5from sklearn.model_selection import train_test_split 6from tensorflow.keras.preprocessing.image import load_img, img_to_array 7from tensorflow.keras.models import Sequential 8from tensorflow.keras.layers import Conv2D, MaxPooling2D 9from tensorflow.keras.layers import Dense, Dropout, Flatten 10from tensorflow.keras.utils import to_categorical 11from tensorflow.keras.optimizers import Adam 12import matplotlib.pyplot as plt 13import time 14import pickle 15from sklearn.metrics import confusion_matrix 16from sklearn import metrics 17from sklearn.metrics import precision_score 18from sklearn.metrics import recall_score 19 20def set random_seed(seed): 21 22 random.seed(seed) 23 24 np.random.seed (seed) tf.set_random_seed(seed) 25 26 27train_data_path = 'dataset' 28 29test_data_path = 'dataset1' 30 31image_size = 28 32 33color_setting = 3 34 35folder = ['normal', 'abnormal'] 36folders = ['normal', 'abnormal'] 37 38class_number = len(folder) 39print('今回のデータで分類するクラス数は「', str(class_number), '」です。') 40 41 42X_image = [] 43Y_label = [] 44X1_image = [] 45Y1_label = [] 46 47for index, name in enumerate(folder): 48 read_data = train_data_path + '/' + name 49 files = glob.glob(read_data + '/*.jpg') 50 print('--- 読み込んだデータセットは', read_data, 'です。') 51 52 for i, file in enumerate(files): 53 if color_setting == 1: 54 img = load_img(file, color_mode = 'grayscale' ,target_size=(image_size, image_size)) 55 elif color_setting == 3: 56 img = load_img(file, color_mode = 'rgb' ,target_size=(image_size, image_size)) 57 array = img_to_array(img) 58 X_image.append(array) 59 Y_label.append(index) 60 61for index1, name in enumerate(folders): 62 read_data1 = test_data_path + '/' + name 63 files1 = glob.glob(read_data1 + '/*.jpg') 64 print('--- 読み込んだデータセットは', read_data1, 'です。') 65 66 for j, file1 in enumerate(files1): 67 if color_setting == 1: 68 img1 = load_img(file1, color_mode = 'grayscale' ,target_size=(image_size, image_size)) 69 elif color_setting == 3: 70 img1 = load_img(file1, color_mode = 'rgb' ,target_size=(image_size, image_size)) 71 array = img_to_array(img1) 72 X1_image.append(array) 73 Y1_label.append(index) 74 75X_image = np.array(X_image) 76Y_label = np.array(Y_label) 77 78X1_image = np.array(X1_image) 79Y1_label = np.array(Y1_label) 80 81X_image = X_image.astype('float32') / 255 82Y_label = to_categorical(Y_label, class_number) 83 84X1_image = X1_image.astype('float32') / 255 85Y1_label = to_categorical(Y1_label, class_number) 86 87x_train = X_image 88y_train = Y_label 89x_test = X1_image 90y_test = Y1_label 91 92#4 機械学習(人工知能)モデルの作成 – 畳み込みニューラルネットワーク(CNN)・学習の実行等 93 94model = Sequential() 95model.add(Conv2D(16, (3, 3), padding='same', 96 input_shape=(image_size, image_size, color_setting), activation='relu')) 97model.add(MaxPooling2D(pool_size=(2, 2))) 98model.add(Conv2D(128, (3, 3), padding='same', activation='relu')) 99model.add(Conv2D(256, (3, 3), padding='same', activation='relu')) 100model.add(MaxPooling2D(pool_size=(2, 2))) 101model.add(Dropout(0.5)) 102model.add(Flatten()) 103model.add(Dense(128, activation='relu')) 104model.add(Dropout(0.25)) 105model.add(Dense(class_number, activation='softmax')) 106 107model.summary() 108 109model.compile(loss='categorical_crossentropy', 110 optimizer=Adam(), 111 metrics=['accuracy']) 112 113start_time = time.time() 114 115history = model.fit(x_train,y_train, batch_size=128, epochs=5, verbose=1, validation_data=(x_test, y_test)) 116 117print (metrics.conf usion_matrix(y_test.argmax(axis-1), model.predict(x_test).argmax(axis=1))) 118 119print (recall score (y_test.ar gmax(axis=1), model.predict(x_test).argmax(axis=1))) 120 121print (precision_score(y_test.ar gmax(axis=1), model.predict(x_test).argmax(axis=1))) 122 123plt.plot(history.history['accuracy']) 124plt.plot(history.history['val_accuracy']) 125plt.title('Model accuracy') 126plt.ylabel('Accuracy') 127plt.xlabel('Epoch') 128plt.grid() 129plt.legend(['Train', 'Validation'], loc='upper left') 130plt.show() 131 132plt.plot(history.history['loss']) 133plt.plot(history.history['val_loss']) 134plt.title('Model loss') 135plt.ylabel('Loss') 136plt.xlabel('Epoch') 137plt.grid() 138plt.legend(['Train', 'Validation'], loc='upper left') 139plt.show() 140 141open('cnn_model.json','w').write(model.to_json()) 142model.save_weights('cnn_weights.h5') 143#model.save('cnn_model_weight.h5') #モデル構造と重みを1つにまとめることもできます 144 145score = model.evaluate(x_test, y_test, verbose=0) 146print('Loss:', score[0], '(損失関数値 - 0に近いほど正解に近い)') 147print('Accuracy:', score[1] * 100, '%', '(精度 - 100% に近いほど正解に近い)') 148print('Computation time(計算時間):{0:.3f} sec(秒)'.format(time.time() - start_time)) 149
結果とエラーメッセージ 混同行列の部分のみ表示します。(下記コード) "print (metrics.conf usion_matrix(y_test.argmax(axis-1), model.predict(x_test).argmax(axis=1))) " "print (recall score (y_test.ar gmax(axis=1), model.predict(x_test).argmax(axis=1))) " "print (precision_score(y_test.ar gmax(axis=1), model.predict(x_test).argmax(axis=1)))" [[ 0 0] [ 1550 0]] 0.0 UndefinedMetricWarning: Precision is ill-defined an d being set to 0.0 due to no predicted samples. Use zero_division parameter to control this behavior. _warn prf (average, modifier, msg_start, len (result)) 0.0