Keras - 文本分类,过度拟合以及如何改进我的模型?

时间:2017-11-19 08:32:00

标签: python neural-network keras text-classification keras-layer

我正在开发一个文本分类神经网络 基于这两篇文章 - https://github.com/jiegzhan/multi-class-text-classification-cnn-rnn https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/

对于我正在使用的培训,俄语文本数据(语言基本上无关紧要,因为文本包含很多特殊的专业术语,遗憾的是使用现有的word2vec将不是一种选择。)

我有训练数据的参数 - 一篇文章的最大长度 - 969个单词 词汇量 - 53886 标签数量 - 12(遗憾的是它们的分布非常不均匀,例如我有第一个标签 - 并且有大约5000个这样的例子,第二个仅包含1500个例子。)

培训数据集的数量 - 仅9876个条目。我是最大的问题,因为遗憾的是我无法以任何方式增加训练集的大小(只能等待一年☻,但即使它只会达到培训规模的两倍)日期,甚至双倍数量都“不够”

这是我的代码 -

x, x_test, y, y_test = train_test_split(x_, y_, test_size=0.1)
x_train, x_dev, y_train, y_dev = train_test_split(x, y, test_size=0.1)

embedding_vecor_length = 100

model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(keras.layers.Dropout(0.3))
model.add(Conv1D(filters=32, kernel_size=4, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(keras.layers.Dropout(0.3))
model.add(Conv1D(filters=32, kernel_size=5, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(keras.layers.Dropout(0.3))
model.add(Conv1D(filters=32, kernel_size=7, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(keras.layers.Dropout(0.3))
model.add(Conv1D(filters=32, kernel_size=9, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(keras.layers.Dropout(0.3))
model.add(Conv1D(filters=32, kernel_size=12, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(keras.layers.Dropout(0.3))
model.add(Conv1D(filters=32, kernel_size=15, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(keras.layers.Dropout(0.3))
model.add(LSTM(200,dropout=0.3, recurrent_dropout=0.3))
model.add(Dense(labels_count, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

print(model.summary())

model.fit(x_train, y_train, epochs=25, batch_size=30)
scores = model.evaluate(x_, y_)

我尝试了不同的参数,它在训练中获得了非常高的准确度(高达98%) 但我真的在测试集上表现不佳。我设法达到的最大值约为74%,通常的结果约为64% 使用小的embedding_vecor_length和小的batch_size实现了最好的结果。

我知道 - 我的测试集仅占培训测试的10%,而整体数据集是最大的问题,但我想找到解决此问题的方法。

所以我的问题是 - 1)是否正确建立了文本分类目的模型? (有用) 我是否需要使用同步卷积而不是合并结果? 我只是不知道文本信息如何在不同过滤器大小的卷积过程中丢失(如我的例子) 你能解释一下卷积与文本数据有关吗? 主要有关于图像识别的文章。

2)我无意中遇到了过度拟合模型的问题。如何让表现更好? 我已经添加了Dropout图层。我接下来该怎么办?

3)我可能需要不同的东西吗?我的意思是没有卷积的纯RNN?

0 个答案:

没有答案