【发布时间】:2021-02-08 00:16:29
【问题描述】:
在 VGG 上进行迁移学习时,数据量相当大,配置如下:
base_big_3 = tf.keras.applications.VGG19(include_top=False, weights='imagenet',input_shape=[IMG_SIZE,IMG_SIZE,3])
model_big_3 = tf.keras.Sequential()
model_big_3.add(base_big_3)
model_big_3.add(BatchNormalization(axis=-1))
model_big_3.add(GlobalAveragePooling2D())
model_big_3.add(Dense(5, activation='softmax'))
model_big_3.compile(loss=tf.keras.losses.CategoricalCrossentropy(), optimizer=tf.keras.optimizers.Adamax(learning_rate=0.01), metrics=['acc'])
history = model_big_3.fit(
train_generator,
steps_per_epoch=BATCH_SIZE,
epochs=100,
validation_data=valid_generator,
batch_size=BATCH_SIZE
)
训练损失和验证损失变化如下,其中训练损失自始至终是恒定的,验证损失最初会达到峰值,之后会变得恒定:
我尝试了什么
- 我一一尝试了here给出的解决方案,并将学习率从0.01降低到0.0001。现在,这次训练损失确实略有下降,但验证错误似乎仍然非常波动。训练损失和验证损失变化如下:
- 上面的解决方案链接也建议对输入进行归一化,但我认为图像不需要归一化,因为数据变化不大,而且 VGG 网络已经进行了批量归一化,如果我有,请纠正我错了。请指出导致这种行为的原因、配置中的哪些更改以及如何改进培训?
【问题讨论】:
-
预计验证损失会随着火车损失波动更大,如第二个示例所示。您可以尝试使用诸如 dropout 之类的正则化来稳定验证损失。
-
我们总是对输入数据进行归一化,批量归一化与此无关
-
损失的波动性很大程度上取决于数据大小。我认为您的 validation_data 大小太小。通常我使用 5000 个样本
标签: python tensorflow machine-learning keras deep-learning