Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 培训损失保持不变,而验证损失波动较大_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python 培训损失保持不变,而验证损失波动较大

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

在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
      )
培训损失和验证损失的变化如下,其中培训损失在整个过程中是恒定的,验证损失在最初达到峰值后变为恒定的:

我尝试的内容

  • 我一个接一个地尝试给出的解决方案,并将学习率从0.01降低到0.0001。现在,这一次训练损失确实略有下降,但验证误差仍然似乎波动很大。培训损失和验证损失变化如下:
  • 上面的解决方案链接也建议对输入进行规范化,但我认为图像不需要规范化,因为数据变化不大,而且VGG网络已经进行了批量规范化,如果我错了,请纠正我。请指出导致这种行为的原因,配置中需要更改哪些内容,以及如何改进培训

  • 我看到的一件事是你设置了每一个历元的步数=批量大小。假设您有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