我一直在尝试一个 NLP 问题,我必须预测某些文本的多标签情绪。
我有 8 个标签和 17 万个训练示例,以及 14 万个测试集。我的最终字典大小约为 190k。
我正在使用 Keras 来尝试一种 NN 方法,尽管我不确定我的架构是否正确,下面是在测试集上给我 95% 的模型,我在训练时测试了 0.7 - 0.3 分割的准确度:
model = Sequential
model.add(Embedding(max_indexes + 1, 100, weights=[embeddings],
input_length=100))
model.add(Bidirectional(LSTM(256, return_sequences=True)))
model.add(Convolution1D(256, 5, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Convolution1D(256, 5, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Convolution1D(256, 5, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPool1D())
model.add(Convolution1D(256, 4, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Convolution1D(256, 3, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Convolution1D(256, 3, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPool1D())
model.add(Flatten())
model.add(Dense(64, activation='relu',
kernel_regularizer=keras.regularizers.l2(0.02)))
model.add(Dense(target_classes_len, activation='sigmoid',
kernel_regularizer=keras.regularizers.l2(0.02)))
model.add(Dropout(0.1))
adam_opt = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
early_stopping = EarlyStopping(monitor='val_loss', patience=5, mode='min')
save_best = ModelCheckpoint('model_x.hdf', save_best_only=True,
monitor='val_loss', mode='min')
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
patience=5, min_lr=0.0001)
model.compile(adam_opt, 'binary_crossentropy', metrics=['accuracy'])
通过互联网,在观看 CSE231N 和其他 StackOverflow 问题的视频时,我发现我应该遵循:
[(CONV-RELU)*n - POOL? ]*m - (FC-RELU)*K, Softmax
N~5, M~very large, K>=0 and K<=2
虽然它是针对 ImageNet 分类问题的,但我手头有一个 NLP 问题。
另外,我发现应该在最终的完全连接和 BatchNormalization 之后使用 CONV-RELU 将 DropOut 放在一个序列中。
我只是想知道对于 NLP 问题,什么是好的层组织,或者评估不同架构的任何方式?
谢谢