首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使使用Dropout、L2和更多的数据,验证精度(LeNet-5)也没有提高。

即使使用Dropout、L2和更多的数据,验证精度(LeNet-5)也没有提高。
EN

Stack Overflow用户
提问于 2020-08-06 03:04:26
回答 2查看 271关注 0票数 0

我试图训练LeNet 5的16输出的灰度图像的大小(30x30x1)。我在Keras中使用Adam优化器,对12800个没有丢失和正则化的样本进行了尝试,在400个批次大小为100的历元后,训练准确率达到了100%,而没有辍学和正则化者的验证精度达到了65%。

我尝试了增加数据,添加了L2正则化和Dropout,但是验证的准确性并没有得到很大的提高,而不是发散。

你能建议我如何着手解决这个过度拟合问题(afaik)吗?

EN

回答 2

Stack Overflow用户

发布于 2020-08-06 03:11:34

你可以尝试一些事情:

  • 把你的辍学率提高到0.5
  • 停止训练你的模型更早,以防止过度安装。这可以通过EarlyStopping回调来完成。
  • 增加你的训练数据,以引入噪音。理论上,这可以帮助您的模型学习与您的问题相关的特性,而不是噪音。
  • 考虑您的验证数据与您的培训数据有多相似。您应该期望模型对您的验证数据执行类似的操作吗?
票数 0
EN

Stack Overflow用户

发布于 2020-08-06 06:21:37

扩展了jakub给出的优秀指针。

  1. 在将培训和验证数据输入到模型之前,几乎总是需要对其进行调整,以便这两个集合都包含类似的图像分布。
  2. 让我们假设您已经将数据分隔成两个集合,并将它们放置到以下路径:

train_dir =‘/数据/培训’ validation_dir =‘/数据/验证’

现在要做的第一件事是将每个像素除以255,这样它们就可以在0到1之间重新缩放。在此基础上,通过各种转换(如剪切、旋转、缩放、翻转等)来增加数据通常是有好处的,因为它在一定程度上推广了模型。这两种方法都可以使用ImageDataGenerator模块实现,如下所示:

代码语言:javascript
复制
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Add our data-augmentation parameters to ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255.,
                                   rotation_range = 40,
                                   width_shift_range = 0.2,
                                   height_shift_range = 0.2,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator( rescale = 1.0/255. )

# Flow training images in batches of 100 using train_datagen generator
train_generator = train_datagen.flow_from_directory(train_dir,
                                                    batch_size = 100,
                                                    class_mode = 'binary', 
                                                    target_size = (30, 30))     

# Flow validation images in batches of 100 using test_datagen generator
validation_generator =  test_datagen.flow_from_directory(validation_dir,
                                                          batch_size  = 100,
                                                          class_mode  = 'binary', 
                                                          target_size = (30, 30))
  1. 现在,训练数据的准确率通常是100%,这意味着要么特征非常简单,要么模型过度拟合。创建回调以设置训练准确性的阈值可能是有用的。简单地说,如果训练的准确性达到临界值,训练就会停止。我们可以把它设为99%,举个例子。

所有这些都很好,但不幸的是,它不会考虑验证集的准确性。为了解决这个问题,我们可以引入一个名为“早期停止”的正则化程序,它将帮助我们在验证精度停止提高时立即停止训练。如果你看一下你分享的图表,验证的准确性会在大约25个年代达到峰值。在那之后你很可能太适合了。一个关于角化病早期停止的引物是可用的这里。因此,让我们实例化这两个回调,并在培训阶段使用它们。

代码语言:javascript
复制
# Define a Callback class that stops training once accuracy reaches 98%
class MyCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('acc')>0.99):
      print("\nReached 99% accuracy so cancelling training!")
      self.model.stop_training = True

training_clbk = MyCallback()

# Define the early stopping Callback
early_stopper_clbk = tf.keras.callbacks.EarlyStopping(
    monitor="val_loss",
    min_delta=0,
    patience=0,
    verbose=0,
    mode="auto",
    baseline=None,
    restore_best_weights=False,
)

history = model.fit_generator(
      train_generator,
      epochs=100,
      validation_data=validation_generator,
      callbacks = [training_clbk, early_stopper_clbk],
      verbose=2)

这应该能解决你面临的一些可能的过度适应问题。当然,退出比赛和正规化在大多数情况下都是有帮助的,所以请你也玩一玩。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63276239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档