提高深度学习模型的准确性

数据挖掘 神经网络 喀拉斯 过拟合 正则化 辍学
2022-03-12 20:24:19

在我当前的项目中,我只有 647rows个(500 个用于训练,147 个用于测试),并且我使用以下代码应用了Keras Sequential 模型:

from keras import models
from keras import layers
from keras import regularizers
model = models.Sequential()
model.add(layers.Dense(5,activation="relu",input_shape=(train_x.shape[1],)))
model.add(layers.Dense(1,activation="sigmoid"))
from keras import optimizers
#network = model.compile(optimizer=optimizers.RMSprop(lr=0.001),loss="binary_crossentropy",metrics=["accuracy"]) 
network = model.compile(optimizer=optimizers.Adam(lr=0.05, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False),loss="binary_crossentropy",metrics=["accuracy"]) 
result = model.fit(train_x,train_y,epochs=60, batch_size=32)

以下是几个 Epoch 的结果:

   Epoch 1/60
   500/500 [==============================] - 1s 3ms/step - loss: 0.7253 - acc: 0.5520
   Epoch 2/60 
   500/500 [==============================] - 0s 137us/step - loss: 0.6379 - acc: 0.6640
   Epoch 3/60
   500/500 [==============================] - 0s 134us/step - loss: 0.6035 - acc: 0.6880
   Epoch 4/60
   500/500 [==============================] - 0s 158us/step - loss: 0.5852 - acc: 0.6980
   Epoch 5/60
   500/500 [==============================] - 0s 136us/step - loss: 0.5864 - acc: 0.7140
   Epoch 6/60
   500/500 [==============================] - 0s 134us/step - loss: 0.5552 - acc: 0.7240
   Epoch 7/60
   500/500 [==============================] - 0s 141us/step - loss: 0.5475 - acc: 0.7280
   Epoch 8/60
   500/500 [==============================] - 0s 164us/step - loss: 0.5340 - acc: 0.7460
   Epoch 9/60
   500/500 [==============================] - 0s 138us/step - loss: 0.5389 - acc: 0.7280
   Epoch 10/60
   500/500 [==============================] - 0s 139us/step - loss: 0.5374 - acc: 0.7540
    ===================For the simplicity I am sharing first and last few epochs result=
   Epoch 55/60
   500/500 [==============================] - 0s 161us/step - loss: 0.4947 - acc: 0.7800
   Epoch 56/60
   500/500 [==============================] - 0s 168us/step - loss: 0.5058 - acc: 0.7660
   Epoch 57/60
   500/500 [==============================] - 0s 158us/step - loss: 0.5011 - acc: 0.7700
   Epoch 58/60
   500/500 [==============================] - 0s 154us/step - loss: 0.5062 - acc: 0.7660
   Epoch 59/60
   500/500 [==============================] - 0s 156us/step - loss: 0.5040 - acc: 0.7600
   Epoch 60/60
   500/500 [==============================] - 0s 147us/step - loss: 0.4994 - acc: 0.7800

使用上述配置(我也尝试了不同的神经网络架构,上面的看起来不错),我能够达到迄今为止最好的准确率,即训练准确率 ~ 78 % 和测试准确率 ~ 72 %。我也尝试了逻辑回归,但在这种情况下训练准确度约为 65%。

这里看起来好像发生了过度拟合,所以我尝试了L2 正则化Dropout,但它们都不能帮助实现更好的准确性。不幸的是,我无法生成更多数据。

我应该怎么做才能获得更好的模型精度(给定有限的数据量)?如何提高训练和测试数据的效率?

1个回答

你可以尝试一堆东西,比如:

  1. 数据增强。
  2. 在类似数据集上训练的模型上进行迁移学习。
  3. 训练具有不同权重初始化的多个神经网络,然后在推理过程中进行多数投票。

如果您从头开始训练,最后一点很重要,因为权重初始化将模型引导到不同的最小值。因此,对于不同网络的平均值,您实际上是在取不同最小值的平均值,这可能会提高整体准确性。