前提・実現したいこと
PythonのKerasで、画像を判別するプログラムを書いています。
犬、猫、ライオンのカラー画像をそれぞれやく1000枚訓練データとし、3つのラベルで分類しようとしています。
モデルの精度も下の通り、イマイチで、検証データの精度を見る限りか学習してしまっています。
この原因を教えていただきたいです。
発生している問題・エラーメッセージ
該当のソースコード
訓練データの用意
python
1NUM_CLASSES = 3 # 分類するクラス数 2IMG_SIZE = 280 # 画像の1辺の長さ 3 4# 学習用画像データ 5train_images = [] 6# 学習用データのラベル 7train_labels = [] 8 9#学習用データセット作成 10for label, dir_name in enumerate(img_dirs): 11 # ./data/以下の各ディレクトリ内のファイル名取得 12 files = os.listdir(os.getcwd() + '/imgs/train_images/' + dir_name) 13 for file in files: 14 # 画像読み込み 15 img = cv2.imread(os.getcwd() + '/imgs/train_images/' + dir_name + '/' + file) 16 if img is not None: 17 # 1辺がIMG_SIZEの正方形にリサイズ 18 img = cv2.resize(img, dsize=(IMG_SIZE, IMG_SIZE), interpolation=cv2.INTER_NEAREST) 19 # OpenCVの関数cvtColorでBGRとRGBを変換 20 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 21 # Numpy配列にする 22 data = np.asarray(img) 23 # 配列に追加 24 train_images.append(data) 25 # ラベル 26 train_labels.append(label) 27 28# numpy配列に変換 29train_images = np.array(train_images) 30train_labels = np.array(train_labels) 31 32# ニューラルネットワークにデータを投入する前に、これらの値を0から1までの範囲にスケールする 33train_images = train_images.astype('float32') / 255.0 34 35# One-Hotエンコーディングする 36train_labels = np_utils.to_categorical(train_labels, NUM_CLASSES)
モデルに関して
python
1model = models.Sequential() 2model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(IMG_SIZE, IMG_SIZE, NUM_CLASSES))) 3model.add(layers.MaxPooling2D((2,2))) 4model.add(layers.BatchNormalization()) 5model.add(layers.Conv2D(64,(3,3),activation="relu")) 6model.add(layers.MaxPooling2D((2,2))) 7model.add(layers.BatchNormalization()) 8model.add(layers.Flatten()) 9model.add(layers.Dense(128,activation="relu")) 10model.add(layers.Dropout(0.5)) 11model.add(layers.Dense(NUM_CLASSES,activation="softmax")) 12 13#モデルのコンパイル 14model.compile(optimizer=optimizers.RMSprop(lr=1e-4, rho=0.9, epsilon=1e-08, decay=0.0), 15 loss="categorical_crossentropy", 16 metrics=["acc"]) 17 18# Early-stopping 19early_stopping = EarlyStopping(monitor='val_loss', patience=2, verbose=1, mode='auto') 20 21# モデルの学習 22fit = model.fit( 23 train_images, train_labels, 24 batch_size=64, 25 epochs=10, 26 verbose=1, 27 validation_split=0.1, 28 callbacks=[early_stopping]) 29 30# モデルの評価 31test_loss, test_acc = model.evaluate(test_images, test_labels) 32print('Test accuracy:', test_acc)
試したこと
モデルを下のように書き換えてみましたが、モデルの精度も下がり、学習にかかる時間がとても長くなってしまいました。
python
1# モデルの構築 2model = models.Sequential() 3model.add(layers.Conv2D(32, kernel_size=(3, 3), 4 activation='relu', 5 input_shape=(IMG_SIZE, IMG_SIZE, NUM_CLASSES))) 6model.add(layers.Conv2D(64, (3, 3), activation='relu')) 7model.add(layers.MaxPooling2D(pool_size=(2, 2))) 8model.add(layers.Dropout(0.25)) 9model.add(layers.Flatten()) 10model.add(layers.Dense(128, activation='relu')) 11model.add(layers.Dropout(0.5)) 12model.add(layers.Dense(NUM_CLASSES, activation='softmax'))
最後に
適切なモデルの作り方を細かく教えていただけると幸いです。
初めての質問で至らぬところもあるかと思いますが、どうぞよろしくお願い致します。