Google Colaboratoryを用いて、画像分類を行おうとしています。
EfficientNetを用いて転移学習をさせようとしているのですが、accuracyが5割前後から上昇しない状態です。
学習用画像は犬と猫の画像で500枚ずつ合計1000枚、バリデーション画像は200枚ずつ合計400枚使用しています。
画像はGoogleDrive上にtrainフォルダ、valフォルダの中にそれぞれcats, dogsというフォルダを作成し、そこに保存しています。
発生している問題・エラーメッセージ
Epoch 1/20 6/6 [==============================] - 29s 4s/step - loss: 0.8470 - accuracy: 0.4896 - val_loss: 0.7962 - val_accuracy: 0.4453 Epoch 2/20 6/6 [==============================] - 16s 3s/step - loss: 0.7151 - accuracy: 0.5030 - val_loss: 0.7310 - val_accuracy: 0.4766 Epoch 3/20 6/6 [==============================] - 19s 3s/step - loss: 0.7059 - accuracy: 0.4987 - val_loss: 0.7102 - val_accuracy: 0.4688 Epoch 4/20 6/6 [==============================] - 17s 3s/step - loss: 0.7013 - accuracy: 0.5104 - val_loss: 0.6931 - val_accuracy: 0.4844 Epoch 5/20 6/6 [==============================] - 17s 3s/step - loss: 0.6938 - accuracy: 0.4970 - val_loss: 0.6914 - val_accuracy: 0.5156 Epoch 6/20 6/6 [==============================] - 17s 3s/step - loss: 0.6956 - accuracy: 0.5045 - val_loss: 0.6958 - val_accuracy: 0.4844 Epoch 7/20 6/6 [==============================] - 17s 3s/step - loss: 0.6971 - accuracy: 0.4911 - val_loss: 0.6946 - val_accuracy: 0.5078 Epoch 8/20 6/6 [==============================] - 17s 3s/step - loss: 0.6939 - accuracy: 0.5179 - val_loss: 0.6905 - val_accuracy: 0.5156 Epoch 9/20 6/6 [==============================] - 17s 3s/step - loss: 0.6940 - accuracy: 0.5104 - val_loss: 0.6925 - val_accuracy: 0.5156 Epoch 10/20 6/6 [==============================] - 17s 3s/step - loss: 0.6928 - accuracy: 0.5134 - val_loss: 0.6948 - val_accuracy: 0.4688 Epoch 11/20 6/6 [==============================] - 16s 3s/step - loss: 0.6938 - accuracy: 0.5149 - val_loss: 0.6897 - val_accuracy: 0.6406 Epoch 12/20 6/6 [==============================] - 17s 3s/step - loss: 0.6927 - accuracy: 0.5238 - val_loss: 0.6942 - val_accuracy: 0.4922 Epoch 13/20 6/6 [==============================] - 17s 3s/step - loss: 0.6948 - accuracy: 0.5164 - val_loss: 0.6910 - val_accuracy: 0.5000 Epoch 14/20 6/6 [==============================] - 17s 3s/step - loss: 0.6966 - accuracy: 0.4911 - val_loss: 0.6902 - val_accuracy: 0.5156 Epoch 15/20 6/6 [==============================] - 17s 3s/step - loss: 0.6944 - accuracy: 0.4940 - val_loss: 0.6929 - val_accuracy: 0.5000 Epoch 16/20 6/6 [==============================] - 17s 3s/step - loss: 0.6971 - accuracy: 0.4896 - val_loss: 0.6916 - val_accuracy: 0.4531 Epoch 17/20 6/6 [==============================] - 17s 3s/step - loss: 0.6963 - accuracy: 0.4985 - val_loss: 0.6954 - val_accuracy: 0.5000 Epoch 18/20 6/6 [==============================] - 19s 3s/step - loss: 0.7004 - accuracy: 0.5026 - val_loss: 0.6901 - val_accuracy: 0.6172 Epoch 19/20 6/6 [==============================] - 17s 3s/step - loss: 0.6917 - accuracy: 0.5104 - val_loss: 0.6911 - val_accuracy: 0.5391 Epoch 20/20 6/6 [==============================] - 17s 3s/step - loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6891 - val_accuracy: 0.5312
該当のソースコード
import os # クラス取得 classes = os.listdir("/content/drive/MyDrive/dataset/train") # クラス数 num_classes = len(classes) # ディレクトリの指定 train_data_dir = '/content/drive/MyDrive/dataset/train' validation_data_dir = '/content/drive/MyDrive/dataset/val' # データ前処理 from tensorflow.keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale = 1.0/255, rotation_range = 20, width_shift_range = 0.2, height_shift_range = 0.2, zoom_range = 0.2, horizontal_flip = True) val_datagen = ImageDataGenerator(rescale = 1.0/255) # 幅と高さを指定 img_width = 300 img_height = 300 # バッチサイズの指定 BATCH_SIZE = 128 training_set = train_datagen.flow_from_directory(directory = train_data_dir, color_mode='rgb', target_size = (img_width, img_height), batch_size = BATCH_SIZE, classes = classes, class_mode = 'categorical') val_set = val_datagen.flow_from_directory(directory = validation_data_dir, color_mode='rgb', target_size = (img_width, img_height), batch_size = BATCH_SIZE, classes = classes, class_mode = 'categorical') # 転移学習モデルの構築 from tensorflow.keras.applications.efficientnet import EfficientNetB3 from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, GlobalAveragePooling2D, Dense # EfficientNetをトップ層を除いて導入 input_tensor = Input(shape=(img_width, img_height, 3)) EN = EfficientNetB3(include_top=False, weights='imagenet', input_tensor=input_tensor) # EfficientNetのパラメータを凍結(すべての層を凍結) for layer in EN.layers: layer.trainable = False # 差し替え用の新しい層を追加 x = EN.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) predictions = Dense(num_classes, activation='softmax')(x) model = Model(inputs=EN.input, outputs=predictions) # 各層をコンパイル from tensorflow.keras import optimizers model.compile(loss = binary_crossentropy, optimizer=optimizers.Adam(learning_rate = 0.001), metrics=['accuracy']) # エポック数の設定 epochs = 20 # ステップ数の設定 steps_per_epoch = int(len(training_set.classes) // BATCH_SIZE) validation_steps = int(len(val_set.classes) // BATCH_SIZE) history = model.fit( training_set, # 学習データ steps_per_epoch = steps_per_epoch, epochs = epochs, # エポック数 validation_data = val_set, # 検証データ validation_steps = validation_steps )
試したこと
・learning rateの変更
・flow_from_directoryでデータを読み込む際にcategoricalでOne-hot変換するのではなく、binaryに変更(その際は出力層最後のDenseをnum_classesではなく1にして試しています)
・epoch数を増やす
・EfficientNetを使わず、1から構築した簡易的なCNNモデルではaccuracyがこの画像数でも8割程度まで行きました。
いろいろと調べてみたのですが、手詰まり状態です…。
ご教示いただければ幸いです。よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー