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