全く同じコードで学習したCNNモデルの分類結果が大きく異なる。

前提

 機械学習の初学者です。KerasでCNNモデルを実装し、データの分類に取り組んでいます。
モデルの中身をいじっていたら最初の学習結果から大きく乖離しました。何が原因となっているのか調べようと思いひとつずつ変更点を戻したのですが、全て戻しても学習結果の乖離は直りませんでした。
そこで、元のスクリプトファイルをまるまる複製して実行してみたのですが、最初の学習結果とは大きく異なる乖離した結果が得られました。最初の学習と違う点は実行した日にちだけです。
何か問題解決の糸口になるような可能性を提示していただければ幸いです。最悪、このような問題は聞いたことがないといった有識者の方々のご回答でもありがたいです。

実現したいこと

 CNNモデルを使って6クラス分類を行っています。
複製した全く同じ2つのスクリプトファイルの実行結果が大きく変わる原因を知り、以前の学習結果を再現したいです。

発生している問題

 先週実験した際の混同行列が以下の通りです。うまく分類ができていることがお分かりいただけるかと思います。

イメージ説明

Loss: 0.4715383052825928 (損失関数値 - 0に近いほど正解に近い)
Accuracy: 82.3812484741211 % (精度 - 100% に近いほど正解に近い)

 次に、本日行った実験では以下のような混同行列が得られました。うまく分類ができていないことがお分かりいただけると思いますが、問題はうまく分類ができているかどうかではなく、以前と明らかに違う結果が得られた点です。
繰り返しになりますが上に示した混同行列のときと全く同じスクリプトを実行しています。

イメージ説明

Loss: 4.6609601974487305 (損失関数値 - 0に近いほど正解に近い)
Accuracy: 29.49013113975525 % (精度 - 100% に近いほど正解に近い)

試したこと

 データセットはtrain:valid:test = 6:1:3で分割していますが、その際のシャッフルはランダムシードを指定して行っています。なのでそこの再現性は問題ないと考えています。2回の実験条件で違う点は実行した日時のみです。
なにかアイデアをお持ちの方がいらっしゃればご教授お願いします。

実験環境

・計算機環境
CPU: Intel Core i9-11900K @ 3.50GHz
GPU: NVIDIA GeForce RTX 3090
・ソフトウェアのバージョン
Python: 3.10.5
CUDA: 11.2
cuDNN: 8.1
tesorflow-gpu: 2.10.1
・その他の環境
エディタはvscodeです。拡張子が.ipynbの対話型のスクリプトファイルで実行しています。

該当のソースコード

今回の問題に関係ないとは思いますが、一応CNNモデルのコードを載せておきます。

BATCH_SIZE = 128 image_size_x = 25 #画像サイズ image_size_y = 15 epochnumber = 50 L2weight = 0.001 #CNNアーキテクチャの設計 model = Sequential() model.add(BatchNormalization(input_shape=(image_size_x, image_size_y, color_setting))) model.add(Activation('relu')) model.add(Conv2D(16, (3, 3), padding='same')) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3), padding='same')) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3), padding='same')) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3), padding='same')) model.add(GlobalAveragePooling2D()) model.add(Dense(class_number, activation='softmax', kernel_regularizer=regularizers.l2(L2weight))) model.summary() #学習率減衰の設定 def step_decay(epoch): x = 0.01 if epoch >= 20: x = 0.001 if epoch >= 40: x = 0.0001 return x lr_decay = LearningRateScheduler(step_decay) model.compile(loss='categorical_crossentropy', #損失関数の設定 optimizer=Adam(learning_rate=0.01), #最適化アルゴリズムの設定 metrics=['accuracy']) #評価関数の設定 start_time = time.time() #可視化 history = model.fit(x_train,y_train, batch_size=BATCH_SIZE, epochs=epochnumber, verbose=1, validation_data=(x_valid, y_valid), callbacks=[lr_decay]) print('Computation time(計算時間):{0:.3f} sec(秒)'.format(time.time() - start_time))

コメントを投稿

0 コメント