我的模型是否欠拟合?

数据挖掘 张量流 美国有线电视新闻网 概括
2022-03-04 18:37:40

模型:

model = models.Sequential()
#add model layers
model.add(layers.Conv1D(64, kernel_size=3, activation='relu',padding='same'))
#model.add(layers.Conv1D(16, kernel_size=3, activation='sigmoid',padding='same'))    
model.add(layers.MaxPooling1D( pool_size=2, strides=None, padding='same', data_format=None))


#model1.add(tf.keras.layers.LSTM(100,return_sequences=True))
model.add(layers.Flatten())
model.add(layers.Dense(500, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(120, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(60, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(3, activation='softmax'))

我也初始化了提前停止。

我的模型是否欠拟合?

Epoch 213/400
360684/360684 [==============================] - 38s 106us/sample - loss: 0.3868 - acc: 0.8426 - val_loss: 0.2698 - val_acc: 0.9050
Epoch 214/400
360684/360684 [==============================] - 38s 106us/sample - loss: 0.3851 - acc: 0.8439 - val_loss: 0.2542 - val_acc: 0.9105
Epoch 215/400
360684/360684 [==============================] - 38s 105us/sample - loss: 0.3843 - acc: 0.8444 - val_loss: 0.2532 - val_acc: 0.9130
Epoch 216/400
360684/360684 [==============================] - 38s 105us/sample - loss: 0.3849 - acc: 0.8436 - val_loss: 0.2506 - val_acc: 0.9116
Epoch 217/400
360684/360684 [==============================] - 38s 105us/sample - loss: 0.3825 - acc: 0.8450 - val_loss: 0.2529 - val_acc: 0.9127
Epoch 218/400
360684/360684 [==============================] - 38s 106us/sample - loss: 0.3815 - acc: 0.8446 - val_loss: 0.2541 - val_acc: 0.9120
Epoch 219/400
360684/360684 [==============================] - 39s 108us/sample - loss: 0.3821 - acc: 0.8442 - val_loss: 0.2598 - val_acc: 0.9094
Epoch 220/400
360684/360684 [==============================] - 40s 110us/sample - loss: 0.3818 - acc: 0.8456 - val_loss: 0.2545 - val_acc: 0.9123
Epoch 221/400
360684/360684 [==============================] - 37s 104us/sample - loss: 0.3789 - acc: 0.8457 - val_loss: 0.2436 - val_acc: 0.9154
Epoch 222/400
360684/360684 [==============================] - 38s 105us/sample - loss: 0.3819 - acc: 0.8456 - val_loss: 0.2506 - val_acc: 0.9115
Epoch 223/400
360684/360684 [==============================] - 38s 105us/sample - loss: 0.3795 - acc: 0.8456 - val_loss: 0.2507 - val_acc: 0.9151
Epoch 224/400
360684/360684 [==============================] - 37s 104us/sample - loss: 0.3791 - acc: 0.8466 - val_loss: 0.2558 - val_acc: 0.9091
Epoch 225/400
360684/360684 [==============================] - 38s 106us/sample - loss: 0.3793 - acc: 0.8466 - val_loss: 0.2531 - val_acc: 0.9100

在此处输入图像描述

acc 和 val_acc 之间的差异非常小,例如 5-6%。我应该担心吗?

3个回答

我认为您不必担心,相反,我会问自己,我获得的准确性是否足以完成 NN 应该完成的任务。

训练损失高于验证损失可能意味着不同的事情:

  • 您的验证数据比训练数据更容易评估。如果训练/验证拆分是随机完成的,并且两个子集中都有足够的数据,则不应如此。
  • 您在训练中使用了 dropout,但在验证中没有使用。这是一些深度学习库的默认设置,也是有道理的。如果是这种情况,并且您希望看到更少的差距,请尝试降低辍学率,您会看到更少的差距。

总而言之,我认为这不是问题,但您可以通过减少正则化量或增加 NN 的复杂性来提高验证性能。然而,这只是一个假设,唯一知道的方法是重新训练并检查新的性能。


编辑

默认情况下,keras 不会在预测中进行 dropout,因此这很可能是您的情况,因为您的 dropout 率很高。

不。这不是欠拟合(耶!!!)。但是,是的,有一些改进的范围,例如:-

  • 我可以看到太多的 dropout 层。尝试使用 BatchNormalization 驱逐它们。这样您就可以拥有一个更通用的模型以及利用

  • 尝试减少没有。致密层数并增加数。Conv1D 层。会有两种效果。首先,您的训练时间将显着减少,您的模型很可能会表现得更好。

  • 使用交叉验证(最好使用分层 K 折),因为它可以更好地了解您的模型的普遍性。

  • 使用 ReduceLROnPlateau 回调,因为您可以看到您的模型没有从您在问题中附加的时期中学到任何实质性的东西。您的模型可能正处于平稳期。

  • (不确定这个)尝试减少你的时代。

如果我提出了一些荒谬的建议,请指出。谢谢你

我认为最好的做法是故意过拟合以确保您的模型没有欠拟合(选择大量的时期)。然后,您将确定学习过程是否结束并且您只是过度拟合......在您的情况下,不确定您的模型是否仍然可以改进验证集。

我会更加怀疑是否更适合验证集。它可能发生在验证集属于训练分布的某个区域的某些情况下,您的模型可以更好地检测类。如果不是这种情况,则可能是泄漏引起的。