我创建了一个分类文本数据的CNN模型。请帮助我解释我的结果,并告诉我为什么我的训练准确性低于验证的准确性?
我一共有2619个数据,它们都是文本数据。有两个不同的班。这是我的数据集的一个示例。

验证集有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%请帮我解决我的问题。谢谢。
发布于 2020-02-18 15:01:22
您可能对您的模型有太多的正则化,导致它不适合您的数据。
一种很好的开始方法是从根本没有正则化开始(没有衰减,没有重量衰减,.)看看是不是太合适了:
如果不是的话,正则化是无用的,如果它太合适的话,慢慢地添加正则化,从小的掉掉/重量衰减开始,然后如果它继续超过,则将其冻结。
Moroever,不要将Dropout作为最后一层,也不要先后放置两个Dropout层。
发布于 2020-02-18 16:09:34
您的训练精度低于验证的准确性,可能是因为使用辍学:它“关闭”一些神经元在训练期间,以防止过度拟合。在验证过程中,退出是关闭的,因此您的网络使用它的所有神经元,从而使(在特定情况下)更准确的预测。
总的来说,我同意Thibault Bacqueyrisses的建议,并想补充说,将辍学置于批处理规范化之前也是一种糟糕的做法(无论如何,这与这一特殊情况无关)。
https://stackoverflow.com/questions/60283444
复制相似问题