gpt4 book ai didi

python - Keras:训练损失减少(准确度增加)而验证损失增加(准确度降低)

转载 作者:太空狗 更新时间:2023-10-30 00:01:21 25 4
gpt4 key购买 nike

我正在处理一个非常稀疏的数据集,目的是预测 6 个类别。我尝试过使用很多模型和架构,但问题仍然存在。

当我开始训练时,训练的 acc 会慢慢开始增加,损失会减少,而验证会做完全相反的事情。

我已经真正尝试处理过拟合问题,但我仍然无法相信这就是导致此问题的原因。

我尝试了什么

VGG16 上的迁移学习:

  • 排除顶层并添加具有 256 个单元和 6 个单元的 softmax 输出层的密集层
  • 微调顶部 CNN block
  • 微调前 3-4 个 CNN block

为了处理过度拟合,我在 Keras 中使用大量增强,并在 p=0.5 的 256 个密集层之后使用 dropout。

使用 VGG16-ish 架构创建自己的 CNN:

  • 尽可能包括批量归一化
  • 每个 CNN+dense 层上的 L2 正则化
  • 在每个 CNN+dense+pooling 层之后从 0.5-0.8 之间的任何地方丢弃
  • 在 Keras 中“即时”进行大量数据扩充

意识到也许我有太多的自由参数:

  • 将网络减少到只包含 2 个 CNN block + 密集 + 输出。
  • 以与上述相同的方式处理过度拟合。

无一异常(exception)所有培训课都是这样的: Training & Validation loss+accuracy

最后提到的架构如下所示:

    reg = 0.0001

model = Sequential()

model.add(Conv2D(8, (3, 3), input_shape=input_shape, padding='same',
kernel_regularizer=regularizers.l2(reg)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.7))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Conv2D(16, (3, 3), input_shape=input_shape, padding='same',
kernel_regularizer=regularizers.l2(reg)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.7))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(16, kernel_regularizer=regularizers.l2(reg)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(6))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='SGD',metrics=['accuracy'])

并且数据由 Keras 中的生成器扩充并使用 flow_from_directory 加载:

    train_datagen = ImageDataGenerator(rotation_range=10,
width_shift_range=0.05,
height_shift_range=0.05,
shear_range=0.05,
zoom_range=0.05,
rescale=1/255.,
fill_mode='nearest',
channel_shift_range=0.2*255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
shuffle = True,
class_mode='categorical')

validation_datagen = ImageDataGenerator(rescale=1/255.)
validation_generator = validation_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=1,
shuffle = True,
class_mode='categorical')

最佳答案

通过分析您的指标输出(来自您提供的 link)我能想到的:

enter image description here

在我看来,大约在第 30 个周期附近,您的模型开始过度拟合。因此,您可以尝试在该迭代中停止训练,或者只训练 ~30 个时期(或确切数字)。 Keras Callbacks在这里可能很有用,特别是 ModelCheckpoint 使您能够在需要时 (Ctrl +C) 或满足特定条件时停止训练。以下是基本 ModelCheckpoint 使用示例:

#save best True saves only if the metric improves
chk = ModelCheckpoint("myModel.h5", monitor='val_loss', save_best_only=False)
callbacks_list = [chk]
#pass callback on fit
history = model.fit(X, Y, ... , callbacks=callbacks_list)

(Edit:) 正如评论中所建议的,您可以使用的另一个选项是使用 EarlyStopping回调,您可以在其中指定容忍的最小变化以及停止训练之前没有此类改进的“耐心”或时代。如果使用它,您必须将它传递给 callbacks 参数,如前所述。

在您模型的当前设置中(以及您尝试过的修改),您训练中的那一点似乎是您案例的最佳训练时间; 进一步训练它不会给您的模型带来任何好处(事实上,会使它泛化更差)。

鉴于您已经尝试了多种修改,您可以做的一件事是尝试增加您的网络深度,以提供更多容量。尝试添加更多层,一次一个,并检查是否有改进。此外,您通常希望先从更简单的模型开始,然后再尝试多层解决方案。

如果一个简单的模型不起作用,添加一层并再次测试,重复直到满意或可能。我所说的简单是指非常简单,您是否尝试过非卷积方法?尽管 CNN 非常适合图像,但您可能在这里过度使用了它。

如果似乎没有任何效果,也许是时候获取更多数据,或者通过采样或其他技术从您拥有的数据中生成更多数据。对于最后一个建议,请尝试检查 this我发现 keras 博客非常有用。深度学习算法通常需要大量的训练数据,特别是对于复杂的模型,比如图像,所以要知道这可能不是一件容易的事。希望这会有所帮助。

关于python - Keras:训练损失减少(准确度增加)而验证损失增加(准确度降低),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47272383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com