keras预训练模型resnet50过拟合、验证集准确率不变的解决方法

问题描述

使用TensorFlow2.0中 keras自带resnet50预训练模型进行图片分类训练时,发生 过拟合,验证集的准确率一直不变

原因及解决方法

详见:
https://www.malaoshi.top/show_1EF5JnCCFGcd.html

方式1

# 设置bn层参数不可变
K.set_learning_phase(0)

base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False,
                                  input_shape=(img_resize, img_resize, 3), )

# 设置bn层参数可变
K.set_learning_phase(1)

model=tf.keras.Sequential()
model.add(base_model)
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(512,activation="relu"))
#model.add(tf.keras.layers.Dense(512,activation="relu",kernel_regularizer=tf.keras.regularizers.l2(0.0001)))
model.add(tf.keras.layers.Dense(1,activation="sigmoid"))


model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0001),loss="binary_crossentropy",metrics=["acc"])


history=model.fit(train_ds2,epochs=5,validation_data=test_ds2)

训练效果

Train for 625 steps, validate for 125 steps
Epoch 1/10
625/625 [==============================] - 78s 125ms/step - loss: 0.1414 - acc: 0.9448 - val_loss: 0.6711 - val_acc: 0.5490
Epoch 2/10
625/625 [==============================] - 65s 103ms/step - loss: 0.0696 - acc: 0.9762 - val_loss: 0.0694 - val_acc: 0.9770
Epoch 3/10
625/625 [==============================] - 64s 102ms/step - loss: 0.0426 - acc: 0.9872 - val_loss: 0.1430 - val_acc: 0.9500
Epoch 4/10
  1/625 [..............................] - ETA: 1:37:17

方式2

K.set_learning_phase(0)

base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False,input_shape=(img_resize, img_resize, 3) )
# 不要设置成False,否则会影响训练效果
base_model.trainable=False
K.set_learning_phase(1)

x=base_model.output
#     x = base_model(inp,training=True)

x=tf.keras.layers.GlobalAveragePooling2D()(x)
x=tf.keras.layers.Dense(512,activation="relu")(x)
x=tf.keras.layers.Dense(1,activation="sigmoid")(x)

model = tf.keras.Model(inputs=base_model.input, outputs=x)

训练效果

Train for 625 steps, validate for 125 steps
Epoch 1/10
625/625 [==============================] - 78s 125ms/step - loss: 0.1414 - acc: 0.9448 - val_loss: 0.6711 - val_acc: 0.5490
Epoch 2/10
625/625 [==============================] - 65s 103ms/step - loss: 0.0696 - acc: 0.9762 - val_loss: 0.0694 - val_acc: 0.9770
Epoch 3/10
625/625 [==============================] - 64s 102ms/step - loss: 0.0426 - acc: 0.9872 - val_loss: 0.1430 - val_acc: 0.9500
Epoch 4/10
  1/625 [..............................] - ETA: 1:37:17

其他失败的实现方式及效果

方式1

inp=tf.keras.Input(shape=(img_resize,img_resize,3))
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, )
base_model.trainable=False
x = base_model(inp,training=False)
#     x = base_model(inp,training=True)
#     x = base_model(inp)

x=tf.keras.layers.GlobalAveragePooling2D()(x)
x=tf.keras.layers.Dense(512,activation="relu")(x)
x=tf.keras.layers.Dense(1,activation="sigmoid")(x)

model = tf.keras.Model(inputs=inp, outputs=x)
return model

训练效果

Train for 625 steps, validate for 125 steps
Epoch 1/10
625/625 [==============================] - 42s 68ms/step - loss: 0.6773 - acc: 0.5782 - val_loss: 0.6861 - val_acc: 0.5620
Epoch 2/10
625/625 [==============================] - 32s 52ms/step - loss: 0.6581 - acc: 0.5988 - val_loss: 0.6846 - val_acc: 0.5620
Epoch 3/10
625/625 [==============================] - 32s 51ms/step - loss: 0.6508 - acc: 0.6176 - val_loss: 0.6720 - val_acc: 0.5760
Epoch 4/10
253/625 [===========>..................] - ETA: 23s - loss: 0.6352 - acc: 0.6374

方式2

inp=tf.keras.Input(shape=(img_resize,img_resize,3))
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, )
base_model.trainable=False
#     x = base_model(inp,training=False)
x = base_model(inp,training=True)
#     x = base_model(inp)

x=tf.keras.layers.GlobalAveragePooling2D()(x)
x=tf.keras.layers.Dense(512,activation="relu")(x)
x=tf.keras.layers.Dense(1,activation="sigmoid")(x)

model = tf.keras.Model(inputs=inp, outputs=x)
return model

训练效果

Train for 625 steps, validate for 125 steps
Epoch 1/10
625/625 [==============================] - 40s 63ms/step - loss: 0.1715 - acc: 0.9334 - val_loss: 0.7311 - val_acc: 0.7150
Epoch 2/10
625/625 [==============================] - 36s 58ms/step - loss: 0.1098 - acc: 0.9564 - val_loss: 0.7752 - val_acc: 0.7270
Epoch 3/10
625/625 [==============================] - 35s 56ms/step - loss: 0.0998 - acc: 0.9592 - val_loss: 0.8077 - val_acc: 0.7290
Epoch 4/10
625/625 [==============================] - 35s 57ms/step - loss: 0.0921 - acc: 0.9652 - val_loss: 0.7652 - val_acc: 0.7230

方式3

K.set_learning_phase(0)

inp=tf.keras.Input(shape=(img_resize,img_resize,3))
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, )
base_model.trainable=False
x = base_model(inp,training=False)

K.set_learning_phase(1)
#     x = base_model(inp,training=True)
#     x = base_model(inp)

x=tf.keras.layers.GlobalAveragePooling2D()(x)
x=tf.keras.layers.Dense(512,activation="relu")(x)
x=tf.keras.layers.Dense(1,activation="sigmoid")(x)

model = tf.keras.Model(inputs=inp, outputs=x)

训练效果

Train for 625 steps, validate for 125 steps
Epoch 1/10
625/625 [==============================] - 37s 59ms/step - loss: 0.6844 - acc: 0.5542 - val_loss: 0.6832 - val_acc: 0.5480
Epoch 2/10
625/625 [==============================] - 32s 52ms/step - loss: 0.6559 - acc: 0.6058 - val_loss: 0.6680 - val_acc: 0.5840
Epoch 3/10
625/625 [==============================] - 32s 51ms/step - loss: 0.6516 - acc: 0.6200 - val_loss: 0.6539 - val_acc: 0.6000
Epoch 4/10
  1/625 [..............................] - ETA: 1:38:22

方式4

K.set_learning_phase(0)

inp=tf.keras.Input(shape=(img_resize,img_resize,3))
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, )
base_model.trainable=False
#     x = base_model(inp,training=False)
x = base_model(inp)

K.set_learning_phase(1)
#     x = base_model(inp,training=True)

x=tf.keras.layers.GlobalAveragePooling2D()(x)
x=tf.keras.layers.Dense(512,activation="relu")(x)
x=tf.keras.layers.Dense(1,activation="sigmoid")(x)

model = tf.keras.Model(inputs=inp, outputs=x)

训练效果

Train for 625 steps, validate for 125 steps
Epoch 1/10
625/625 [==============================] - 39s 63ms/step - loss: 0.1746 - acc: 0.9344 - val_loss: 0.6942 - val_acc: 0.4670
Epoch 2/10
625/625 [==============================] - 35s 56ms/step - loss: 0.1249 - acc: 0.9494 - val_loss: 0.6935 - val_acc: 0.5010
Epoch 3/10
625/625 [==============================] - 36s 57ms/step - loss: 0.1024 - acc: 0.9620 - val_loss: 0.6983 - val_acc: 0.5080
Epoch 4/10
 13/625 [..............................] - ETA: 7:52 - loss: 0.0730 - acc: 0.9688

感谢:
https://blog.csdn.net/aojue1109/article/details/88181927


原文出处:/show_1EF5JUYBib4t.html