问题描述
使用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