Python 培训损失保持不变,而验证损失波动较大
在VGG上进行转移学习时,数据量适中,配置如下:Python 培训损失保持不变,而验证损失波动较大,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,在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)) m
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
)
培训损失和验证损失的变化如下,其中培训损失在整个过程中是恒定的,验证损失在最初达到峰值后变为恒定的:
我尝试的内容
我看到的一件事是你设置了每一个历元的步数=批量大小。假设您有3200个培训样本,且批次大小=32。要查看所有培训样本,您必须查看3200/32=100批。但是,如果每一个历元的步数=BATCH\u SIZE=32,则一个历元只能处理1024个样本。将每个历元的步数设置为
steps_per_epoch =number_of_train samples//BATCH_SIZE
其中,批处理大小为生成器中指定的大小。或者,您可以将其保留为“无”,model.fit将在内部确定正确的值。
如model.fit文件所述
因为在model.fit中,您使用的是列车发电机,我假设这是一台发电机。
VGG模型在imagenet图像上训练,其中像素值在-1到+1范围内重新缩放。因此,在输入管道的某个地方,您应该重新缩放图像。例如image=image/127.5-1将完成此工作。您使用的批次号是多少?使它更大(在你的内存大小限制内)可能有助于消除波动。
我还建议您使用两种keras回调,Earlysting和ReducelRon。将文档设置为监视验证丢失。我建议的代码如下所示
estop=tf.keras.callbacks.EarlyStopping(monitor="val_loss",patience=4,verbose=1,
restore_best_weights=True)
rlronp=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", factor=0.5,
patience=2, verbose=1)
callbacks=[estop, rlronp]
# in model.fit add callbacks=callbacks
如第二个示例所示,随着列车损失的增加,预计验证损失波动更大。您可以尝试使用正则化(如退出)来稳定验证损失。我们总是对输入数据进行规范化,批量规范化与损失的波动性无关,这主要取决于数据大小。我认为您的验证数据太小。通常我用5000个样品
estop=tf.keras.callbacks.EarlyStopping(monitor="val_loss",patience=4,verbose=1,
restore_best_weights=True)
rlronp=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", factor=0.5,
patience=2, verbose=1)
callbacks=[estop, rlronp]
# in model.fit add callbacks=callbacks