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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2466閲覧

EfficientNetを用いた転移学習でaccuracyが上昇しない。

ryuntatatan

総合スコア10

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/04/08 01:35

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割程度まで行きました。

いろいろと調べてみたのですが、手詰まり状態です…。
ご教示いただければ幸いです。よろしくお願いいたします。

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

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

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

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

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

jbpb0

2022/04/08 04:02

> train_datagen = ImageDataGenerator(... でのデータ拡張を全部止めたら、どうなりますでしょうか? > # EfficientNetのパラメータを凍結(すべての層を凍結) をやらずに全層で学習した場合は、どうなりますでしょうか?
ryuntatatan

2022/04/08 05:34

jbpb0 2022/04/08 13:02 > train_datagen = ImageDataGenerator(... でのデータ拡張を全部止めたら、どうなりますでしょうか? 結果は変わらず、accuracyは向上しませんでした。 > 全層で学習した場合は、どうなりますでしょうか? GoogleColabでは割り当てRAMの都合からか、ResourceExhaustedErrorのエラーがでて全層学習はできませんでした。 EfficientNetではなく、試しにVGG16にして他はまったく同じにしてみたところ学習率は向上するのが確認できました。 なぜかEfficientNetの場合はこのコードで動かない状況です。
guest

回答1

0

自己解決

EfficientNetのtf.keras.applicationモデルは入力イメージの正規化があらかじめモデルに組み込まれていることがわかりました。
ですので、最初のデータ前処理の段階で1.0/255で割らないことで、accuracyが上昇しました。

投稿2022/04/13 11:06

ryuntatatan

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問