質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

854閲覧

畳み込みニューラルネットワークで学習データとテストデータを用意し、混同行列を作成したい。

yutoto

総合スコア0

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/05 10:50

前提・実現したいこと

初めての投稿です。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/09/05 11:28

> CNNで学習して混同行列を作成したいのですが下記に示しているようなエラーが出ます。 UndefinedMetricWarningですのでエラーではなくウォーニングですね。 > ちなみにコード内で学習結果のグラフも出すようにしていますが、学習がうまくいっていないのかTrainもValidationの推移(線)も表示されていません。 学習していなくても何らかのグラフは出るかと思うのですが、history.history['accuracy']の値はどうなっていましたか?
yutoto

2021/09/05 12:09

> UndefinedMetricWarningですのでエラーではなくウォーニングですね。 ウォーニングということは問題はないということで大丈夫でしょつな? > 学習していなくても何らかのグラフは出るかと思うのですが、history.history['accuracy']の値はどうなっていましたか? 分かりにくい表現で申し訳ありません。グラフ自体は出ています。 history.history['accuracy']の値は0.9800347089767456となっています。 ちなみに print('Accuracy:', score[1] * 100, '%', '(精度 - 100% に近いほど正解に近い)') は0.0%となっています。
meg_

2021/09/05 12:24

学習の精度が98%ということですか?テストデータの精度はいくつでしたか?
meg_

2021/09/05 12:28

ウォーニングの原因はhttps://datalove.hatenadiary.jp/entry/how-to-resolve-f-score-ill-defined-errorでしょうか?
yutoto

2021/09/05 12:40

ご返信ありがとうございます。 学習の精度が98%ということです。 テストデータは0.0%となっております。 ウォーニングの原因はそれだと思います。ありがとうございました!
jbpb0

2021/09/06 02:38 編集

質問のコードは、本当に実行してるコードですか? 「def set random_seed(seed):」でエラーになるのですが (「set」の次にスペースがあるため) そこを「def set_random_seed(seed):」と変えても、 「 np.random.seed (seed) tf.set_random_seed(seed)」 でエラーになるし (「 tf.set_random_seed(seed)」の前の改行が抜けてる) 他にも、「print (recall score (...」の「recall」の次の「_」が抜けてるとか、 「y_test.ar gmax(axis=1)」の「ar」の次にスペースが入ってるとか、 「axis=1」が「axis-1」になってるとか、あちこちおかしい
jbpb0

2021/09/06 03:11 編集

> 学習の精度が98%ということです。 テストデータは0.0%となっております。 test_data_path = 'dataset1' を test_data_path = 'dataset' と変えて、テストデータに学習データと同じものを使った場合は、どうなりますか? 【追記】 私の「2021/09/06 11:33」のコメントに書いたように、テストデータのファイルを読み込むコードに間違いがあるため、上記を行なっても意味がありませんので、無視してください
jbpb0

2021/09/06 00:04

> テスト用データ dataset normal 1500枚 dataset abnormal 50枚 > [[ 0 0] [ 1550 0]] 1550枚が全て「abnormal」に分類されても、約3%の50枚は合ってるのだから、 > テストデータは0.0%となっております。 は変ですね
jbpb0

2021/09/20 08:03 編集

「for index1, name in enumerate(folders):」のループの最後が間違ってます Y1_label.append(index) ↓ 修正 Y1_label.append(index1) この間違いで、「y_test」は全て「abnormal」になってしまう 上記を直して、私の「2021/09/06 08:42」のコメントで指摘したような明らかな書き間違いと思われるところも全部直して、適当な2種類に画像を分類するデータセットを使って当方のMacでコードを動かしてみたら、ちゃんと学習されて、「print」文で表示される各数値もそれなりの値が表示されました
guest

回答1

0

python

1 Y1_label.append(index)

↓ 修正

python

1 Y1_label.append(index1)

【追記】
上記の修正の他に、明らかな書き間違いと思われるところも全部直した下記のコードで、適当な2種類に画像を分類するデータセットを使って、Google Colabで実行したところ、正常に学習され、「print」文で表示される各数値もそれなりの正しそうな値が表示されました

python

1#import keras 2import glob 3import numpy as np 4from sklearn.model_selection import train_test_split 5from tensorflow.keras.preprocessing.image import load_img, img_to_array 6from tensorflow.keras.models import Sequential 7from tensorflow.keras.layers import Conv2D, MaxPooling2D 8from tensorflow.keras.layers import Dense, Dropout, Flatten 9from tensorflow.keras.utils import to_categorical 10from tensorflow.keras.optimizers import Adam 11import matplotlib.pyplot as plt 12import time 13import pickle 14from sklearn.metrics import confusion_matrix 15from sklearn import metrics 16from sklearn.metrics import precision_score 17from sklearn.metrics import recall_score 18 19''' 20def set_random_seed(seed): 21 random.seed(seed) 22 np.random.seed (seed) 23 tf.set_random_seed(seed) 24''' 25 26train_data_path = 'dataset' 27 28test_data_path = 'dataset1' 29 30image_size = 28 31 32color_setting = 3 33 34folder = ['normal', 'abnormal'] 35folders = ['normal', 'abnormal'] 36 37class_number = len(folder) 38print('今回のデータで分類するクラス数は「', str(class_number), '」です。') 39 40X_image = [] 41Y_label = [] 42X1_image = [] 43Y1_label = [] 44 45for index, name in enumerate(folder): 46 read_data = train_data_path + '/' + name 47 files = glob.glob(read_data + '/*.jpg') 48 print('--- 読み込んだデータセットは', read_data, 'です。') 49 for i, file in enumerate(files): 50 if color_setting == 1: 51 img = load_img(file, color_mode = 'grayscale' ,target_size=(image_size, image_size)) 52 elif color_setting == 3: 53 img = load_img(file, color_mode = 'rgb' ,target_size=(image_size, image_size)) 54 array = img_to_array(img) 55 X_image.append(array) 56 Y_label.append(index) 57 58for index1, name in enumerate(folders): 59 read_data1 = test_data_path + '/' + name 60 files1 = glob.glob(read_data1 + '/*.jpg') 61 print('--- 読み込んだデータセットは', read_data1, 'です。') 62 for j, file1 in enumerate(files1): 63 if color_setting == 1: 64 img1 = load_img(file1, color_mode = 'grayscale' ,target_size=(image_size, image_size)) 65 elif color_setting == 3: 66 img1 = load_img(file1, color_mode = 'rgb' ,target_size=(image_size, image_size)) 67 array = img_to_array(img1) 68 X1_image.append(array) 69 #Y1_label.append(index) 70 Y1_label.append(index1) 71 72X_image = np.array(X_image) 73Y_label = np.array(Y_label) 74 75X1_image = np.array(X1_image) 76Y1_label = np.array(Y1_label) 77 78X_image = X_image.astype('float32') / 255 79Y_label = to_categorical(Y_label, class_number) 80 81X1_image = X1_image.astype('float32') / 255 82Y1_label = to_categorical(Y1_label, class_number) 83 84x_train = X_image 85y_train = Y_label 86x_test = X1_image 87y_test = Y1_label 88 89#4 機械学習(人工知能)モデルの作成 – 畳み込みニューラルネットワーク(CNN)・学習の実行等 90 91model = Sequential() 92model.add(Conv2D(16, (3, 3), padding='same', 93 input_shape=(image_size, image_size, color_setting), activation='relu')) 94model.add(MaxPooling2D(pool_size=(2, 2))) 95model.add(Conv2D(128, (3, 3), padding='same', activation='relu')) 96model.add(Conv2D(256, (3, 3), padding='same', activation='relu')) 97model.add(MaxPooling2D(pool_size=(2, 2))) 98model.add(Dropout(0.5)) 99model.add(Flatten()) 100model.add(Dense(128, activation='relu')) 101model.add(Dropout(0.25)) 102model.add(Dense(class_number, activation='softmax')) 103 104model.summary() 105 106model.compile(loss='categorical_crossentropy', 107 optimizer=Adam(), 108 metrics=['accuracy']) 109 110start_time = time.time() 111 112history = model.fit(x_train,y_train, batch_size=128, epochs=5, verbose=1, validation_data=(x_test, y_test)) 113 114print (metrics.confusion_matrix(y_test.argmax(axis=1), model.predict(x_test).argmax(axis=1))) 115 116print (recall_score(y_test.argmax(axis=1), model.predict(x_test).argmax(axis=1))) 117 118print (precision_score(y_test.argmax(axis=1), model.predict(x_test).argmax(axis=1))) 119 120plt.plot(history.history['accuracy']) 121plt.plot(history.history['val_accuracy']) 122plt.title('Model accuracy') 123plt.ylabel('Accuracy') 124plt.xlabel('Epoch') 125plt.grid() 126plt.legend(['Train', 'Validation'], loc='upper left') 127plt.show() 128 129plt.plot(history.history['loss']) 130plt.plot(history.history['val_loss']) 131plt.title('Model loss') 132plt.ylabel('Loss') 133plt.xlabel('Epoch') 134plt.grid() 135plt.legend(['Train', 'Validation'], loc='upper left') 136plt.show() 137 138open('cnn_model.json','w').write(model.to_json()) 139model.save_weights('cnn_weights.h5') 140#model.save('cnn_model_weight.h5') #モデル構造と重みを1つにまとめることもできます 141 142score = model.evaluate(x_test, y_test, verbose=0) 143print('Loss:', score[0], '(損失関数値 - 0に近いほど正解に近い)') 144print('Accuracy:', score[1] * 100, '%', '(精度 - 100% に近いほど正解に近い)') 145print('Computation time(計算時間):{0:.3f} sec(秒)'.format(time.time() - start_time))

投稿2021/09/06 03:25

編集2021/09/20 08:15
jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問