【问题标题】:Training accuracy is less than validation accuracy训练准确率低于验证准确率
【发布时间】:2023-03-17 11:30:02
【问题描述】:

我创建了一个用于对文本数据进行分类的 CNN 模型。请帮助我解释我的结果并告诉我为什么我的训练准确度低于验证准确度?

我一共有2619个Data,都是文本数据。有两个不同的班级。这是我的数据集的示例。

验证集有 34 个数据。其余 2619 个数据是训练数据。

我已经完成了 RepeatedKfold 交叉验证。这是我的代码。

from sklearn.model_selection import RepeatedKFold 
kf = RepeatedKFold(n_splits=75, n_repeats=1, random_state= 42) 

for train_index, test_index in kf.split(X,Y):
      #print("Train:", train_index, "Validation:",test_index)
      x_train, x_test = X.iloc[train_index], X.iloc[test_index] 
      y_train, y_test = Y.iloc[train_index], Y.iloc[test_index]

我使用过 CNN。这是我的模型。

model = Sequential()
model.add(Embedding(2900,2 , input_length=1))
model.add(Conv1D(filters=2, kernel_size=3, kernel_regularizer=l2(0.0005 ), bias_regularizer=l2(0.0005 ), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1, kernel_regularizer=l2(0.0005 ), bias_regularizer=l2(0.0005 ), activation='sigmoid'))
model.add(Dropout(0.25))
adam = optimizers.Adam(lr = 0.0005, beta_1 = 0.9, beta_2 = 0.999, epsilon = None, decay = 0.0, amsgrad = False)
model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy'])
print(model.summary())
history = model.fit(x_train, y_train, epochs=300,validation_data=(x_test, y_test), batch_size=128, shuffle=False)
# Final evaluation of the model
scores = model.evaluate(x_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

这是结果。

Epoch 295/300
2585/2585 [==============================] - 0s 20us/step - loss: 1.6920 - acc: 0.7528 - val_loss: 0.5839 - val_acc: 0.8235
Epoch 296/300
2585/2585 [==============================] - 0s 20us/step - loss: 1.6532 - acc: 0.7617 - val_loss: 0.5836 - val_acc: 0.8235
Epoch 297/300
2585/2585 [==============================] - 0s 27us/step - loss: 1.5328 - acc: 0.7551 - val_loss: 0.5954 - val_acc: 0.8235
Epoch 298/300
2585/2585 [==============================] - 0s 20us/step - loss: 1.6289 - acc: 0.7524 - val_loss: 0.5897 - val_acc: 0.8235
Epoch 299/300
2585/2585 [==============================] - 0s 21us/step - loss: 1.7000 - acc: 0.7582 - val_loss: 0.5854 - val_acc: 0.8235
Epoch 300/300
2585/2585 [==============================] - 0s 25us/step - loss: 1.5475 - acc: 0.7451 - val_loss: 0.5934 - val_acc: 0.8235
Accuracy: 82.35%

请帮我解决我的问题。谢谢你。

【问题讨论】:

    标签: python keras nlp conv-neural-network


    【解决方案1】:

    您的模型可能有太多的正则化,导致它无法适应您的数据。
    一个好的开始方法是完全不进行正则化(没有 Dropout,没有权重衰减,..),然后看看它是否过度拟合:

    • 如果没有,正则化就没用了
    • 如果过拟合,一点一点地添加正则化,从小的 dropout / 权重衰减开始,如果继续过拟合,则增加它

    另外,不要把Dropout作为最后一层,也不要连续放两个Dropout层。

    【讨论】:

    • 我按照你的建议做了。然后,这件事发生了。 2585/2585 [===============================] - 0s 26us/步 - 损失:1.5064 - acc: 0.8607 - val_loss :0.8631 - val_acc:0.8235 准确度:82.35%
    • 所以你不再欠拟合了,不是你想要的吗?
    • 如果我一次又一次地运行我的脚本,结果会发生变化。
    【解决方案2】:

    您的训练准确度低于验证准确度可能是因为使用了 dropout:它在训练期间“关闭”了一些神经元以防止过度拟合。在验证期间 dropout 关闭,因此您的网络使用其所有神经元,从而(在该特定情况下)做出更准确的预测。

    总的来说,我同意 Thibault Bacqueyrisses 的建议,并想补充一点,在批量标准化之前放置 dropout 通常也是一种不好的做法(这与这种特殊情况无关)。

    【讨论】:

    • 我按照你的建议做了。然后,这件事发生了。 2585/2585 [===============================] - 0s 26us/步 - 损失:1.5064 - acc: 0.8607 - val_loss :0.8631 - val_acc:0.8235 准确度:82.35%
    猜你喜欢
    • 2021-10-13
    • 2018-09-18
    • 1970-01-01
    • 2019-02-14
    • 2017-10-05
    • 2019-09-06
    • 2020-04-07
    • 2020-03-28
    • 2021-07-22
    相关资源
    最近更新 更多