如何提高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-pool
、dropout
、regularization
等时,您正在向网络中引入某种噪声,这确实有助于避免过度拟合。但是,过多的噪音会妨碍您学习,尤其是对于小数据。
@dennlinger,我编辑了我的问题以澄清一些事情。我已经尝试过SGD
、adagrad
、adam
优化器,但没有一个提供任何体面的输出。我试过 LR 为0.1, 0.5, 0.05, 0.01
,但没有变化。
@ParagS.Chandakkar,谢谢。我试图删除dropout
层,甚至将LR 减少到0.01
和0.05
。准确率似乎提高到了 60%,但现在已经过拟合了。
您正在扩充测试数据,您不应该这样做。这是一个很大的禁忌。
【参考方案1】:
您已经掌握了调整学习率、辍学率、批量标准化等内容 - 这是一个很好的调整起点。
你尝试过正则化吗?
退房 https://cambridgespark.com/content/tutorials/neural-networks-tuning-techniques/index.html
如果没有帮助,您可能需要查看输入的结构,看看是否有其他方法更有助于网络收敛。这包括确保训练和验证在数据等方面具有相同水平的差异。但是,这更具体到您要解决的问题。
【讨论】:
嘿。我认为添加dropout
层是regularization
的一种形式。所以我做到了。如果我的数据大小是问题,我还做了一些数据生成。你有什么建议?以上是关于如何提高keras模型的准确率,防止过拟合的主要内容,如果未能解决你的问题,请参考以下文章