質問内容
ResNet50の転移学習モデルを用いて画像分類を試みています。
ところが、下記のようにtrain時とval, predict時の挙動が異なっており困っております。
train時:学習が正常に進み、epochごとにlossとaccuracyが改善される
val, predict時:すべての画像を特定の分類として判定する
ちなみに、学習後のモデルを用いて、trainに用いた画像を推論させたところ、
train時の判定精度は約89%だったにもかかわらず、
下記のConfusion Matrix同様に、すべての画像をある特定のラベルと判定していました。
原因についてお心当たりがありましたら、ご教授いただければ幸いです。
追記(修正点と結果)
下記の点、修正いたしました。
①resnet50とfc_modelを削除しない(回答参考) ⇒ 変化なし
②手動でダウンロードしていた重みを自分で作成したフォルダに保存して読み込んでいたが、
"~/.keras/models/"に移動して、'imagenet'で読み込み ⇒ 変化なし
③input_shape = (image_size, image_size, 3)として、input_tensorでなくinput_shapeで指定 ⇒ 変化なし
④別の重みをダウンロードして実行 ⇒ 最新版でないとのメッセージがでたため、元の重みに戻した
⑤転移学習を行わない場合の結果を追記いたしました(画像数とepoch数は異なる)。
問題のスクリプト
python
1# 画像とラベルをtrain, validation, testで分割 2X_train, X_test, y_train, y_test = train_test_split(x_all_data, y_GroundTruth, test_size=0.2, random_state=1) 3X_train, X_val , y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=1) 4 5y_train = to_categorical(y_train) 6y_val = to_categorical(y_val) 7y_test = to_categorical(y_test) 8 9# ResNet50のロード。 10# FC層は不要なので include_top=False 11# 参照:https://www.pythonmania.work/entry/2019/04/17/154829 12# weightsがダウンロードできないためhttps://github.com/fchollet/deep-learning-models/releases/tag/v0.2 13# にて手動ダウンロード 参照:https://github.com/fchollet/deep-learning-models/issues/33 14input_shape = Input(shape=(image_size, image_size, 3)) 15resnet50 = ResNet50(include_top=False, 16 weights=r'./(ディレクトリ名)/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5', 17 input_tensor=input_shape) 18 19# FC層の作成 20fc_model = Sequential() 21fc_model.add(Flatten(input_shape=resnet50.output_shape[1:])) 22fc_model.add(Dense(256, activation='relu')) 23fc_model.add(Dropout(0.5)) 24fc_model.add(Dense(8, activation='softmax')) 25 26# ResNet50とFC層を結合してモデルを作成 27resnet50_model = Model(input=resnet50.input, output=fc_model(resnet50.output)) 28 29del resnet50 30del fc_model 31 32gc.collect() 33 34# print(len(resnet50_model.layers)) => 176 35#ResNet50の一部の重みを固定(176階層中の170階層の重み固定) 36for layer in resnet50_model.layers[:170]: 37 layer.trainable = False 38 39 40# 多クラス分類を指定 41resnet50_model.compile(loss='categorical_crossentropy', 42 optimizer=optimizers.SGD(lr=1e-3, momentum=0.9), 43 metrics=['accuracy']) 44 45history = resnet50_model.fit(X_train, y_train, batch_size=8, verbose=1, epochs=10, 46 validation_data=(X_val, y_val)) 47 48 49 50 51# In[ ]: 52# 結果表示 53 54 55 56# accuracyが最小となるときのweightを読み込み 57# model.load_weights('weights.hdf5') 58 59y_pred = resnet50_model.predict(X_test, batch_size=8, verbose=0) 60 61 62y_test_arg = np.argmax(y_test, axis=1) 63y_pred_arg = np.argmax(y_pred, axis=1) 64 65print("Confusion Matrix") 66print(confusion_matrix(y_test_arg, y_pred_arg)) 67 68print('Accuracy: ', accuracy_score(y_test_arg, y_pred_arg)) 69print('F1 Score: ', f1_score(y_test_arg, y_pred_arg,average="macro"))
問題のスクリプトの結果
python
1Train on 775 samples, validate on 194 samples 2Epoch 1/10 3775/775 [==============================] - 43s 56ms/step - loss: 2.8364 - accuracy: 0.6026 - val_loss: 2.1264 - val_accuracy: 0.3041 4Epoch 2/10 5775/775 [==============================] - 26s 34ms/step - loss: 0.9090 - accuracy: 0.7394 - val_loss: 2.0831 - val_accuracy: 0.0567 6Epoch 3/10 7775/775 [==============================] - 27s 34ms/step - loss: 0.7186 - accuracy: 0.7806 - val_loss: 2.0935 - val_accuracy: 0.0567 8Epoch 4/10 9775/775 [==============================] - 27s 34ms/step - loss: 0.6537 - accuracy: 0.8206 - val_loss: 2.3842 - val_accuracy: 0.3041 10Epoch 5/10 11775/775 [==============================] - 26s 34ms/step - loss: 0.7280 - accuracy: 0.8065 - val_loss: 2.1401 - val_accuracy: 0.3041 12Epoch 6/10 13775/775 [==============================] - 26s 34ms/step - loss: 0.5726 - accuracy: 0.8374 - val_loss: 2.0188 - val_accuracy: 0.3093 14Epoch 7/10 15775/775 [==============================] - 26s 34ms/step - loss: 0.5044 - accuracy: 0.8542 - val_loss: 2.1495 - val_accuracy: 0.0361 16Epoch 8/10 17775/775 [==============================] - 27s 35ms/step - loss: 0.5044 - accuracy: 0.8619 - val_loss: 2.1775 - val_accuracy: 0.2990 18Epoch 9/10 19775/775 [==============================] - 27s 34ms/step - loss: 0.5373 - accuracy: 0.8645 - val_loss: 2.1233 - val_accuracy: 0.3041 20Epoch 10/10 21775/775 [==============================] - 27s 34ms/step - loss: 0.4005 - accuracy: 0.8877 - val_loss: 2.0625 - val_accuracy: 0.3041 22 23Confusion Matrix 24[[ 0 0 0 0 2 0 0 0] 25 [ 0 0 0 0 10 0 0 0] 26 [ 0 0 0 0 39 0 0 0] 27 [ 0 0 0 0 65 0 0 0] 28 [ 0 0 0 0 77 0 0 0] 29 [ 0 0 0 0 32 0 0 0] 30 [ 0 0 0 0 7 0 0 0] 31 [ 0 0 0 0 11 0 0 0]] 32 33Accuracy: 0.3168724279835391 34F1 Score: 0.06015625 35 36
成功するスクリプト
python
1# 画像とラベルをtrain, validation, testで分割 2X_train, X_test, y_train, y_test = train_test_split(x_all_data, y_GroundTruth, test_size=0.2, random_state=1) 3X_train, X_val , y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=1) 4 5y_train = to_categorical(y_train) 6y_val = to_categorical(y_val) 7y_test = to_categorical(y_test) 8 9model = Sequential() 10 11# 入力画像は224 X 224 X 3 12model.add(Conv2D(16, kernel_size=(5, 5),padding='same', activation='relu', 13 kernel_initializer='he_normal', input_shape=(224, 224, 3))) 14model.add(MaxPooling2D(pool_size=(2, 2))) 15model.add(Conv2D(64, kernel_size=(5, 5),padding='same', activation='relu', 16 kernel_initializer='he_normal')) 17model.add(MaxPooling2D(pool_size=(2, 2))) 18model.add(Conv2D(128, kernel_size=(5, 5),padding='same', activation='relu', 19 kernel_initializer='he_normal')) 20model.add(MaxPooling2D(pool_size=(2, 2))) 21 22model.add(Flatten()) 23model.add(Dense(units=512)) 24model.add(Activation('relu')) 25model.add(Dense(units=256)) 26model.add(Activation('relu')) 27model.add(Dense(units=256)) 28model.add(Activation('relu')) 29model.add(Dense(8, activation='softmax')) 30 31model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 32 33history = model.fit(X_train, y_train, batch_size=8, verbose=1, epochs=15, validation_data=(X_val, y_val)) 34 35 36y_pred = model.predict(X_test, batch_size=8, verbose=0) 37 38y_test_arg = np.argmax(y_test, axis=1) 39y_pred_arg = np.argmax(y_pred, axis=1) 40 41print("Confusion Matrix") 42print(confusion_matrix(y_test_arg, y_pred_arg)) 43 44print('Accuracy: ', accuracy_score(y_test_arg, y_pred_arg)) 45print('F1 Score: ', f1_score(y_test_arg, y_pred_arg,average="macro")) 46
# 成功するスクリプトの結果
python
1Train on 670 samples, validate on 168 samples 2Epoch 1/15 3670/670 [==============================] - 22s 33ms/step - loss: 11.9808 - accuracy: 0.3149 - val_loss: 1.4312 - val_accuracy: 0.3810 4Epoch 2/15 5670/670 [==============================] - 6s 9ms/step - loss: 1.2536 - accuracy: 0.5746 - val_loss: 1.0848 - val_accuracy: 0.6726 6Epoch 3/15 7670/670 [==============================] - 6s 9ms/step - loss: 1.1292 - accuracy: 0.6149 - val_loss: 1.1626 - val_accuracy: 0.6369 8Epoch 4/15 9670/670 [==============================] - 6s 9ms/step - loss: 0.9577 - accuracy: 0.6343 - val_loss: 0.9260 - val_accuracy: 0.6786 10Epoch 5/15 11670/670 [==============================] - 6s 9ms/step - loss: 0.7463 - accuracy: 0.7313 - val_loss: 0.8360 - val_accuracy: 0.6845 12Epoch 6/15 13670/670 [==============================] - 6s 9ms/step - loss: 0.6855 - accuracy: 0.7507 - val_loss: 0.9705 - val_accuracy: 0.7262 14Epoch 7/15 15670/670 [==============================] - 6s 9ms/step - loss: 0.6168 - accuracy: 0.7731 - val_loss: 1.0714 - val_accuracy: 0.7619 16Epoch 8/15 17670/670 [==============================] - 6s 9ms/step - loss: 0.4977 - accuracy: 0.8164 - val_loss: 0.9056 - val_accuracy: 0.6964 18Epoch 9/15 19670/670 [==============================] - 6s 9ms/step - loss: 0.3705 - accuracy: 0.8716 - val_loss: 0.7673 - val_accuracy: 0.7321 20Epoch 10/15 21670/670 [==============================] - 6s 9ms/step - loss: 0.2310 - accuracy: 0.9075 - val_loss: 0.7087 - val_accuracy: 0.7798 22Epoch 11/15 23670/670 [==============================] - 6s 9ms/step - loss: 0.1560 - accuracy: 0.9418 - val_loss: 1.0097 - val_accuracy: 0.7262 24Epoch 12/15 25670/670 [==============================] - 6s 9ms/step - loss: 0.1333 - accuracy: 0.9507 - val_loss: 0.8617 - val_accuracy: 0.8452 26Epoch 13/15 27670/670 [==============================] - 6s 9ms/step - loss: 0.1456 - accuracy: 0.9478 - val_loss: 0.8585 - val_accuracy: 0.7440 28Epoch 14/15 29670/670 [==============================] - 6s 9ms/step - loss: 0.0938 - accuracy: 0.9716 - val_loss: 0.7732 - val_accuracy: 0.7857 30Epoch 15/15 31670/670 [==============================] - 6s 9ms/step - loss: 0.0609 - accuracy: 0.9836 - val_loss: 0.7505 - val_accuracy: 0.8214 32 33Confusion Matrix 34[[ 3 0 0 0 0 0 0] 35 [ 0 1 1 2 0 0 3] 36 [ 0 1 21 7 3 0 1] 37 [ 0 1 11 38 1 8 1] 38 [ 0 0 0 0 83 0 0] 39 [ 0 0 0 1 0 14 0] 40 [ 0 0 3 0 0 0 6]] 41Accuracy: 0.7904761904761904 42F1 Score: 0.6922323858385239
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/22 06:38
2020/01/22 06:43 編集
2020/01/22 08:33
2020/01/23 00:06
2020/01/23 02:11 編集
2020/01/23 02:13
2020/01/23 02:35
2020/01/23 03:01
2020/01/23 04:27
2020/01/24 04:52