如何提高keras模型的准确率,防止过拟合

Posted

技术标签:

【中文标题】如何提高keras模型的准确率,防止过拟合【英文标题】:How to increase the accuracy of the keras model and prevent overfitting 【发布时间】:2018-12-23 15:08:53 【问题描述】:

我正在努力训练

model.add(Conv2D(32, (3, 3), kernel_initializer='random_uniform', activation='relu', input_shape=(x1, x2, depth)))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(BatchNormalization())
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.4))

model.add(Conv2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.2))

model.add(Flatten())

model.add(Dense(128, activation='relu'))
model.add(Dropout(0.3))

model.add(Dense(3, activation='softmax'))

我是这样编译的:

sgd = optimizers.SGD(lr=0.1, decay=0.0, momentum=0.05, nesterov=True)
model.compile(loss='categorical_crossentropy',
          optimizer=sgd,
          metrics=['accuracy'])

我尝试了各种学习率和不同的优化器。但是准确率似乎没有超过 50%,如下图所示:

我的图像在 0 左右正确标准化,STD 为 1。

我有什么遗漏吗?如何提高模型的准确性?

编辑:

嘿,当我使用以下数据生成器时:

train_datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)
test_datagen = ImageDataGenerator(featurewise_center=True,
    featurewise_std_normalization=True)



train_generator = train_datagen.flow(np.array(X_train), batch_size=batchsize)
valid_generator = test_datagen.flow(np.array(X_test), batch_size = batchsize)

history = model.fit_generator(train_datagen.flow(np.array(X_train), y_train_cat, batch_size=batchsize),
                    steps_per_epoch=len(X_train) // batchsize, epochs=epochs, 
                    validation_data= valid_generator, 
                    validation_steps=len(X_test) // batchsize)

我收到以下错误:

TypeError: '>' 在 'int' 和 'str' 的实例之间不支持

我曾经通过更新numpy 或卸载它并重新安装来解决这个问题,但是这一次,它也不能正常工作。你能帮我吗?

【问题讨论】:

机器学习,特别是超参数调优,是一个极其复杂的话题。为了让我们(社区)为您提供有用的提示,我们需要有关您尝试执行的任务的更多信息;您当前使用的训练/测试数据;您尝试了哪些特定的优化器和学习率(或其他参数)。您提供的信息越具体,获得有用回复的机会就越高! 我建议你 1. 使用 he_normal(或 he_uniform 而不是 random_uniform) 2. 在训练集上获得接近 100% 的准确率,然后逐步添加 dropout、正则化步。我认为您添加了太多的 dropout,尤其是在第一阶段之后。请记住,当您执行max-pooldropoutregularization 等时,您正在向网络中引入某种噪声,这确实有助于避免过度拟合。但是,过多的噪音会妨碍您学习,尤其是对于小数据。 @dennlinger,我编辑了我的问题以澄清一些事情。我已经尝试过SGDadagradadam 优化器,但没有一个提供任何体面的输出。我试过 LR 为0.1, 0.5, 0.05, 0.01,但没有变化。 @ParagS.Chandakkar,谢谢。我试图删除dropout 层,甚至将LR 减少到0.010.05。准确率似乎提高到了 60%,但现在已经过拟合了。 您正在扩充测试数据,您不应该这样做。这是一个很大的禁忌。 【参考方案1】:

您已经掌握了调整学习率、辍学率、批量标准化等内容 - 这是一个很好的调整起点。

你尝试过正则化吗?

退房 https://cambridgespark.com/content/tutorials/neural-networks-tuning-techniques/index.html

如果没有帮助,您可能需要查看输入的结构,看看是否有其他方法更有助于网络收敛。这包括确保训练和验证在数据等方面具有相同水平的差异。但是,这更具体到您要解决的问题。

【讨论】:

嘿。我认为添加dropout 层是regularization 的一种形式。所以我做到了。如果我的数据大小是问题,我还做了一些数据生成。你有什么建议?

以上是关于如何提高keras模型的准确率,防止过拟合的主要内容,如果未能解决你的问题,请参考以下文章

防止神经网络模型过拟合的6种方法及keras代码实现

Keras深度学习实战——深度学习过拟合问题及解决方法

TensorFlow2 大幅提高模型准确率的神奇操作

Keras Resnet-50 图像分类过拟合

如何在 Keras 模型中训练和验证样本较小时测量过拟合

如何防止过拟合