前提
kerasを用いて、2 クラスの画像分類を行うプログラムを作成しています。
100枚強程画像の入ったフォルダから画像を読み取り、npyファイルに保存→CNNで学習→推論を行なっているのですが、lossが0.69前後、accuracyも0.50前後と精度が悪いです。
プログラムのミス、精度を上げる方法をご教授頂ければ幸いです。
実現したいこと
- lossの減少
- accuracyの向上
発生している問題・エラーメッセージ
Epoch 25/30 131/131 [==============================] - 5s 40ms/step - loss: 0.6936 - accuracy: 0.4909 Epoch 26/30 131/131 [==============================] - 5s 40ms/step - loss: 0.6935 - accuracy: 0.5048 Epoch 27/30 131/131 [==============================] - 5s 40ms/step - loss: 0.6933 - accuracy: 0.5074 Epoch 28/30 131/131 [==============================] - 5s 39ms/step - loss: 0.6934 - accuracy: 0.5048 Epoch 29/30 131/131 [==============================] - 5s 39ms/step - loss: 0.6933 - accuracy: 0.5067 Epoch 30/30 131/131 [==============================] - 5s 39ms/step - loss: 0.6935 - accuracy: 0.5000 1/1 [==============================] - 0s 78ms/step 判別した画像 >>> ./god_judge/IMG_0206.jpeg 判別精度([良好,不良]) >>> [[0.5187298 0.48127016]] 判別結果 >>> 良好胚
該当のソースコード
pyhotn
1import cv2 2import sys 3from PIL import Image 4import os 5import tensorflow as tf 6import datetime 7import random 8import glob 9import numpy as np 10import h5py 11from PIL import ImageFile 12import matplotlib.pyplot as plt 13import keras 14from keras.models import Sequential 15from keras.layers import Convolution2D, MaxPooling2D 16from keras.layers import Activation, Dropout, Flatten, Dense 17from keras.optimizers import RMSprop 18from keras.utils import np_utils 19from keras.models import load_model 20from keras.callbacks import EarlyStopping 21from tensorflow.keras.utils import plot_model, to_categorical 22from tensorflow.keras import datasets, layers, models 23 24 25# indexを教師ラベルとして割り当て(0にはgod、1にはbad) 26classes = ["god", "bad"] 27num_classes = len(classes) 28image_size = 64 29num_testdata = 50 30 31X_train = [] 32X_test = [] 33y_train = [] 34y_test = [] 35 36for index, classlabel in enumerate(classes): 37 38 #学習用ファイルのインポート 39 files = glob.glob("god_learn/*.jpeg") 40 #files = glob.glob("bad_learn/*.jpeg") 41 image = cv2.imread(files[0]) 42 #print(files) 43 for i, file in enumerate(files): 44 image = Image.open(file) 45 image = image.convert("RGB") 46 image = image.resize((image_size, image_size)) 47 data = np.asarray(image) 48 49 #print(image) 50 #print(data) 51 if i < num_testdata: 52 X_test.append(data) 53 y_test.append(index) 54 else: 55 56 # angleに代入される値 57 # -20 58 # -15 59 # -10 60 # -5 61 # 0 62 # 5 63 # 10 64 # 15 65 # 画像を5度ずつ回転 66 for angle in range(-20, 20, 5): 67 68 img_r = image.rotate(angle) 69 data = np.asarray(img_r) 70 X_train.append(data) 71 y_train.append(index) 72 # FLIP_LEFT_RIGHT は 左右反転 73 img_trains = img_r.transpose(Image.FLIP_LEFT_RIGHT) 74 data = np.asarray(img_trains) 75 X_train.append(data) 76 y_train.append(index) # indexを教師ラベルとして割り当てる.0にはgodを指定し、1にはbadを指定 77 78X_train = np.asanyarray(X_train) 79X_test = np.asanyarray(X_test) 80y_train = np.asanyarray(y_train) 81y_test = np.asanyarray(y_test) 82 83xy = (X_train, X_test, y_train, y_test) 84np.save('./imori.npy', xy) 85classes = ["god", "bad"] 86num_classes = len(classes) 87image_size = 64 88 89#データを読み込む 90def load_data(): 91 X_train, X_test, y_train, y_test = np.load('./imori.npy', allow_pickle=True) 92 # 入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) 93 X_train = X_train.astype("float") / 255 94 X_test = X_test.astype("float") / 255 95 # to_categorical()にてラベルをone hot vector化 96 y_train = np_utils.to_categorical(y_train, num_classes) 97 y_test = np_utils.to_categorical(y_test, num_classes) 98 99 return X_train, y_train, X_test, y_test 100 101#モデルの学習 102def train(X, y, X_test, y_test): 103 model = Sequential() 104 105 #conv2D(64,(3,3)) →3✖️3のフィルタを64枚使う 106 model.add(Convolution2D(32,3, 3, padding='same',input_shape=X.shape[1:])) 107 model.add(Activation('relu')) 108 model.add(Convolution2D(32,(3, 3))) 109 model.add(Activation('relu')) 110 model.add(MaxPooling2D(pool_size=(2,2))) 111 model.add(Dropout(0.1)) 112 113 model.add(Convolution2D(64,3, 3, padding='same')) 114 model.add(Activation('relu')) 115 model.add(Convolution2D(64,(3, 3))) 116 model.add(Activation('relu')) 117 model.add(MaxPooling2D(pool_size=(2,2))) 118 model.add(Dropout(0.1)) 119 120 model.add(Flatten()) 121 model.add(Dense(512)) 122 model.add(Activation('relu')) 123 model.add(Dropout(0.5)) 124 model.add(Dense(2)) # 識別のため、2クラス分類のため2を指定 125 model.add(Activation('softmax')) 126 127 128 # HDF5ファイルにKerasのモデルを保存 129 #ls:学習率(一度にどのくらいパラメータを変化させるか) decay:各更新の学習減衰率 130 adam = RMSprop(lr=0.01, decay=1e-6) 131 model.compile(loss='categorical_crossentropy',optimizer=adam,metrics=['accuracy']) 132 #学習回数を50回に設定 133 model.fit(X, y, batch_size=64, epochs=30) 134 135 # HDF5ファイルにKerasのモデルを保存 136 model.save('./cnn.h5') 137 138 139 140 return model 141 142def main(): 143#読み込み 144 X_train, y_train, X_test, y_test = load_data() 145# モデルの学習 146 model = train(X_train, y_train, X_test, y_test) 147 148main() 149 150#推論 151 152cnn = "./cnn.h5" 153 154#判別したい画像のインポート 155pic = "./god_judge/IMG_0206.jpeg" 156#pic = "./bad_judge/IMG_0209.jpeg" 157 158imsize = (64, 64) 159 160def load_image(path): 161 img = Image.open(path) 162 img = img.convert('RGB') 163 # 学習時に、(64, 64, 3)で学習したので、画像の縦・横は今回 変数imsizeの(64, 64)にリサイズします。 164 img = img.resize(imsize) 165 # 画像データをnumpy配列の形式に変更 166 img = np.asarray(img) 167 img = img / 255.0 168 return img 169 #print(img) 170 171model = load_model(cnn) 172img = load_image(pic) 173#print(img) 174prd = model.predict(np.array([img])) 175prelabel = np.argmax(prd, axis=1) 176print("判別した画像 >>>", pic) 177print("判別精度([良好,不良]) >>>", prd) 178 179if prelabel == 0: 180 print("判別結果 >>> 良好胚") 181elif prelabel == 1: 182 print("判別結果 >>> 不良胚")
試したこと
- バッチサイズ、学習回数の変更
- 中間層の追加
- 学習率、学習減衰率の変更
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー