迁移学习模型推理模式下无法学习的原因求助
Kaggle物种分类迁移学习异常问题
我正在完成Kaggle上的「Yum or Yuck: Butterfly Mimics 2022」物种分类任务,由于数据集图像数量较少,决定采用迁移学习方案。模型构建代码如下:
inputs = tf.keras.layers.Input(shape=(224, 224, 3)) base_model = tf.keras.applications.resnet50.ResNet50( input_shape=(224,224,3), include_top=False, weights="imagenet") for layer in base_model.layers: layer.trainable = False x = base_model(inputs, training=False) x = tf.keras.layers.GlobalAveragePooling2D()(x) x = tf.keras.layers.Dropout(0.3)(x) x = tf.keras.layers.Dense(1024, activation="relu")(x) x = tf.keras.layers.Dropout(0.3)(x) x = tf.keras.layers.Dense(512, activation="relu")(x) x = tf.keras.layers.Dropout(0.3)(x) x = tf.keras.layers.Dense(64, activation="relu")(x) output = tf.keras.layers.Dense(6, activation="softmax")(x) model = tf.keras.Model(inputs=inputs, outputs=output)
按照Keras迁移学习指南,我冻结了ResNet50的所有层,并在推理模式(training=False)下训练模型,但模型始终无法正常收敛,训练近200个epoch仍无明显学习迹象。训练配置及部分epoch结果如下:
model.compile( optimizer=tf.keras.optimizers.Adam(), loss="categorical_crossentropy", metrics="accuracy", ) stop_early = tf.keras.callbacks.EarlyStopping( monitor='val_loss', min_delta=0.0001, patience=20, restore_best_weights=True ) history = model.fit(train_generator, validation_data = val_generator, epochs = 200, callbacks=[stop_early])
22/22 [==============================] - 19s 442ms/step - loss: 1.9317 - accuracy: 0.1794 - val_loss: 1.8272 - val_accuracy: 0.1618 Epoch 2/200 22/22 [==============================] - 9s 398ms/step - loss: 1.8250 - accuracy: 0.1882 - val_loss: 1.7681 - val_accuracy: 0.2197 Epoch 3/200 22/22 [==============================] - 9s 402ms/step - loss: 1.7927 - accuracy: 0.2294 - val_loss: 1.7612 - val_accuracy: 0.2139 Epoch 4/200 22/22 [==============================] - 9s 424ms/step - loss: 1.7930 - accuracy: 0.2000 - val_loss: 1.7640 - val_accuracy: 0.2139 Epoch 5/200 22/22 [==============================] - 9s 391ms/step - loss: 1.7872 - accuracy: 0.2132 - val_loss: 1.7489 - val_accuracy: 0.3121 Epoch 6/200 22/22 [==============================] - 9s 389ms/step - loss: 1.7700 - accuracy: 0.2574 - val_loss: 1.7378 - val_accuracy: 0.2543 Epoch 7/200 22/22 [==============================] - 9s 396ms/step - loss: 1.7676 - accuracy: 0.2353 - val_loss: 1.7229 - val_accuracy: 0.3064 Epoch 8/200 22/22 [==============================] - 9s 427ms/step - loss: 1.7721 - accuracy: 0.2353 - val_loss: 1.7225 - val_accuracy: 0.2948 Epoch 9/200 22/22 [==============================] - 9s 399ms/step - loss: 1.7522 - accuracy: 0.2588 - val_loss: 1.7267 - val_accuracy: 0.2948 Epoch 10/200 22/22 [==============================] - 9s 395ms/step - loss: 1.7434 - accuracy: 0.2735 - val_loss: 1.7151 - val_accuracy: 0.2948 Epoch 11/200 22/22 [==============================] - 9s 391ms/step - loss: 1.7500 - accuracy: 0.2632 - val_loss: 1.7083 - val_accuracy: 0.3064 Epoch 12/200 22/22 [==============================] - 9s 425ms/step - loss: 1.7307 - accuracy: 0.2721 - val_loss: 1.6899 - val_accuracy: 0.3179 Epoch 13/200 22/22 [==============================] - 9s 407ms/step - loss: 1.7439 - accuracy: 0.2794 - val_loss: 1.7045 - val_accuracy: 0.2948 Epoch 14/200 22/22 [==============================] - 9s 404ms/step - loss: 1.7376 - accuracy: 0.2706 - val_loss: 1.7118 - val_accuracy: 0.2659 Epoch 15/200 22/22 [==============================] - 9s 419ms/step - loss: 1.7588 - accuracy: 0.2647 - val_loss: 1.6684 - val_accuracy: 0.3237 Epoch 16/200 22/22 [==============================] - 9s 394ms/step - loss: 1.7289 - accuracy: 0.2824 - val_loss: 1.6733 - val_accuracy: 0.3064 Epoch 17/200 22/22 [==============================] - 9s 387ms/step - loss: 1.7184 - accuracy: 0.2809 - val_loss: 1.7185 - val_accuracy: 0.2659 Epoch 18/200 22/22 [==============================] - 9s 408ms/step - loss: 1.7242 - accuracy: 0.2765 - val_loss: 1.6961 - val_accuracy: 0.2717 Epoch 19/200 22/22 [==============================] - 9s 424ms/step - loss: 1.7218 - accuracy: 0.2853 - val_loss: 1.6757 - val_accuracy: 0.3006 Epoch 20/200 22/22 [==============================] - 9s 396ms/step - loss: 1.7248 - accuracy: 0.2882 - val_loss: 1.6716 - val_accuracy: 0.3064 Epoch 21/200 22/22 [==============================] - 9s 401ms/step - loss: 1.7134 - accuracy: 0.2838 - val_loss: 1.6666 - val_accuracy: 0.2948 Epoch 22/200 22/22 [==============================] - 9s 393ms/step - loss: 1.7140 - accuracy: 0.2941 - val_loss: 1.6427 - val_accuracy: 0.3064
只有解冻ResNet50的层并关闭推理模式(training=True),模型才能正常学习。我用EfficientNet做了相同场景的测试,结果和ResNet50一致;但使用Xception时,冻结所有层并开启推理模式却能正常收敛。
尽管这三个模型都包含BatchNorm层,但表现差异巨大,我无法理解为何ResNet50和EfficientNet必须关闭推理模式才能正常学习,恳请各位提供分析思路。
补充训练结果图
ResNet50训练结果:

Xception训练结果:

内容的提问来源于stack exchange,提问作者DPM
相关产品推荐
相关产品推荐

