如何提高CNN的F1分数?

时间:2019-08-07 10:00:06

标签: tensorflow keras conv-neural-network

我正在处理文档分类问题。 多标签分类20个不同的标签,接受培训的文档为1920个,验证的为480个。该模型是具有FastText嵌入的CNN,我使用以Ngram为基线的逻辑回归模型。 问题在于,基线模型的f1-得分为0.36,而cnn仅给出0.3。

我使用的体系结构来自这里:
https://www.kaggle.com/vsmolyakov/keras-cnn-with-fasttext-embeddings

我一直在进行一些参数调整,当前最好的参数是:辍学。 0.25,学习率0.001,可训练的嵌入错误,128个过滤器,预测阈值0.15和内核大小9。

你们是否有一些需要特别注意的参数的想法,改变体系结构的想法,可以改善f1得分的任何东西?

# Parameters 
BATCH_SIZE = 16
DROP_OUT = 0.25
N_EPOCHS = 20
N_FILTERS = 128
TRAINABLE = False
LEARNING_RATE = 0.001
N_DIM = 32
KERNEL_SIZE = 9

# Create model
model = Sequential()
model.add(Embedding(NB_WORDS, EMBED_DIM, weights=[embedding_matrix], 
                    input_length=MAX_SEQ_LEN, trainable=TRAINABLE))
model.add(Conv1D(N_FILTERS, KERNEL_SIZE, activation='relu', padding='same'))
model.add(MaxPooling1D(2))
model.add(Conv1D(N_FILTERS, KERNEL_SIZE, activation='relu', padding='same'))
model.add(GlobalMaxPooling1D())
model.add(Dropout(DROP_OUT))
model.add(Dense(N_DIM, activation='relu', kernel_regularizer=regularizers.l2(1e-4)))
model.add(Dense(N_LABELS, activation='sigmoid'))  #multi-label (k-hot encoding)
adam = optimizers.Adam(lr=LEARNING_RATE, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy'])
model.summary()

修改
我认为通过在调整过程中将历元固定为20来得到一些错误的超参数。我现在尝试使用停止条件,该模型通常收敛于30-35个纪元。似乎退出0.5会更好,并且我目前正在调整批量大小。如果有人对历元和其他超参数之间的关系有一定的经验/知识,可以随意分享。

1 个答案:

答案 0 :(得分:2)

通常应该考虑的事情是数据是否不平衡以及模型对每个类的性能如何(例如使用sklearn.metrics.confusion_matrix

我认为数据集(2000多个20个类)可能不够大,不足以使深度学习从头开始工作。您可以考虑扩充数据集,也可以从为任务微调预训练的语言模型开始。请参见https://github.com/huggingface/pytorch-openai-transformer-lm。这可以帮助您克服总体数据集大小的问题。