将元数据添加到Keras LSTM

时间:2018-06-09 23:08:00

标签: python tensorflow keras

我查看了几个答案,但无法看到我正在尝试做的明确解决方案。

我有一个用于二进制文本分类的LSTM,它接受语料库中的前40k个单词,然后对前50个令牌进行操作。准备这样:

max_words = 40000
max_review_length = 50
embedding_vector_length = 100
batch_size = 128
epochs = 10 

all_texts = combo.title.tolist()
lstm_text_tokenizer = Tokenizer(nb_words=max_words)
lstm_text_tokenizer.fit_on_texts(all_texts)

x_train = lstm_text_tokenizer.texts_to_sequences(x_train.title.tolist())
x_test =  lstm_text_tokenizer.texts_to_sequences(x_test.title.tolist())
x_test = sequence.pad_sequences(x_test, maxlen=50)


x_train = sequence.pad_sequences(x_train, maxlen=50)

我目前的型号如下:

def lstm_cnn_model(max_words, embedding_vector_length, max_review_length):
    model = Sequential()
    model.add(Embedding(max_words, embedding_vector_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(LSTM(100))
    model.add(Dense(num_classes))
    model.add(Activation('softmax'))
    return model

我还为每个示例提供了一个1维的元数据列表,每个示例都有一个值。我可能会在将来添加更复杂的元数据。

我的问题是,在模型训练中将这两个输入结合起来的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

现在切换到functional API并创建一个多输入网络将是明智之举,该网络将获取文本以及元数据:

text_in = Input(shape=(max_review_length,))
meta_in = Input(shape=(1,)) # so 1 meta feature per review
# Embedding(...)(text_in)
# You process text_in however you like
text_features = LSTM(100)(embedded_text)
merged = concatenate([text_features, meta_in]) # (samples, 101)
text_class = Dense(num_classes, activation='softmax')(merged)
model = Model([text_in, meta_in], text_class)
return model

这个想法是功能API为您提供了创建计算图的选项,可以以非顺序方式使用这两个输入。您可以从文本中提取要素,从元数据中提取要素并合并它们以查看它是否可以改进分类。您可能希望查看how to encode data以使用元数据。