CNN模型在多类分类上过拟合

Posted

技术标签:

【中文标题】CNN模型在多类分类上过拟合【英文标题】:CNN model overfitting on multi-class classification 【发布时间】:2020-01-06 22:29:17 【问题描述】:

我正在尝试使用 GloVe 嵌入来训练基于 this article 的 cnn 模型(也是一个 rnn,它具有 this issue)。数据集是一个带标签的数据:带有标签的文本(推文)(仇恨、攻击性或两者都没有)。

问题是模型在训练集上表现良好,但在验证集上表现不佳。

这是模型:

kernel_size = 2
filters = 256
pool_size = 2
gru_node = 64
model = Sequential()
model.add(Embedding(len(word_index) + 1,
                            EMBEDDING_DIM,
                            weights=[embedding_matrix],
                            input_length=MAX_SEQUENCE_LENGTH,
                            trainable=True))
model.add(Dropout(0.25))
model.add(Conv1D(filters, kernel_size, activation='relu'))
model.add(MaxPooling1D(pool_size=pool_size))
model.add(Conv1D(filters, kernel_size, activation='softmax'))
model.add(MaxPooling1D(pool_size=pool_size))
model.add(LSTM(gru_node, return_sequences=True, recurrent_dropout=0.2))
model.add(LSTM(gru_node, return_sequences=True, recurrent_dropout=0.2))
model.add(LSTM(gru_node, return_sequences=True, recurrent_dropout=0.2))
model.add(LSTM(gru_node, recurrent_dropout=0.2))
model.add(Dense(1024,activation='relu'))
model.add(Dense(nclasses))
model.add(Activation('softmax'))

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

拟合模型:

X = df.tweet
y = df['classifi']    # classes 0,1,2

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, shuffle=False)
X_train_Glove,X_test_Glove, word_index,embeddings_index = loadData_Tokenizer(X_train,X_test)

model_RCNN = Build_Model_RCNN_Text(word_index,embeddings_index, 20)

model_RCNN.fit(X_train_Glove, y_train,validation_data=(X_test_Glove, y_test),
                              epochs=15,batch_size=128,verbose=2)

predicted = model_RCNN.predict(X_test_Glove)

predicted = np.argmax(predicted, axis=1)
print(metrics.classification_report(y_test, predicted))

这就是分布的样子(0:讨厌,1:攻击性,2:不喜欢)

模型总结

结果:

    分类报告

这是正确的方法还是我在这里遗漏了什么

【问题讨论】:

你在第一层有 1M 参数。我不知道这是不是故意的,但它似乎很大 【参考方案1】:

一般来说,您可以解决两个方面的过拟合问题:

    改进数据

    更多独特数据 过采样(平衡数据)

    限制网络结构

    Dropout(你已经实现了) 更少的参数(您可能希望针对更小的网络进行基准测试) 正则化(例如 L1 和 L2)

我建议尝试使用少得多的参数(因为这很快)和过采样(因为您的数据似乎不平衡)。

另外,您还可以尝试超参数拟合。制作大量具有不同参数的网络,而不是选择最好的网络。

注意:如果您进行超参数拟合,请确保有一个额外的验证集,因为这样很容易过度拟合您的测试集。

旁注:有时在对 NN 进行故障排除时,将优化器设置为基本随机梯度下降会很有帮助。它会减慢训练速度,但会使进度更加清晰。

祝你好运!

【讨论】:

以上是关于CNN模型在多类分类上过拟合的主要内容,如果未能解决你的问题,请参考以下文章

使用深度学习防止在多类分类中过度拟合特定类

文本分类 CNN 过拟合训练

为啥我的 CNN 预训练图像分类器过拟合?

CNN 中的验证损失显着减少,模型拟合还是过拟合?

这是过拟合的情况吗? CNN图像分类器

在 CNN 提取特征之上使用 SVM - 如何进行多类分类?