具有两个数据源的 LSTM 神经网络

LSTM neural network with two sources of data

我有以下配置:一个 lstm 网络接收大小为 2 的 n-gram 文本。下面是一个简单的示意图:

经过一些测试后,我注意到对于某些 类,当我使用大小为 3 的 ngram 时,我的准确性有显着提高。现在我想训练一个新的 LSTM 神经网络,同时具有两个 ngram 大小时间,如下示意图:

我如何提供数据并构建此模型,使用 keras 执行此任务?

我假设您已经有了将单词拆分为 n-gram 的功能,因为您已经可以使用 2-gram 和 3-gram 模型了?因此,我只是构建了一个单词 "cool" 的示例示例作为一个工作示例。对于我的示例,我不得不使用嵌入,因为具有 26^3=17576 个节点的 LSTM 层对我的计算机来说有点太多了,无法处理。我希望你在你的 3-gram 代码中也这样做了?

下面是一个完整的工作示例:

from tensorflow.keras.layers import Input, Embedding, LSTM, Dense, concatenate
from tensorflow.keras.models import Model
import numpy as np

# c->2 o->14 o->14 l->11
np_2_gram_in = np.array([[26*2+14,26*14+14,26*14+11]])#co,oo,ol
np_3_gram_in = np.array([[26**2*2+26*14+14,26**2*14+26*14+26*11]])#coo,ool

np_output = np.array([[1]])

output_shape=1
lstm_2_gram_embedding = 128
lstm_3_gram_embedding = 192

inputs_2_gram = Input(shape=(None,))
em_input_2_gram = Embedding(output_dim=lstm_2_gram_embedding, input_dim=26**2)(inputs_2_gram)
lstm_2_gram = LSTM(lstm_2_gram_embedding)(em_input_2_gram)
inputs_3_gram = Input(shape=(None,))
em_input_3_gram = Embedding(output_dim=lstm_3_gram_embedding, input_dim=26**3)(inputs_3_gram)
lstm_3_gram = LSTM(lstm_3_gram_embedding)(em_input_3_gram)
concat = concatenate([lstm_2_gram, lstm_3_gram])
output = Dense(output_shape,activation='sigmoid')(concat)

model = Model(inputs=[inputs_2_gram, inputs_3_gram], outputs=[output])
model.compile(optimizer='adam', loss='binary_crossentropy')

model.fit([np_2_gram_in, np_3_gram_in], [np_output], epochs=5)
model.predict([np_2_gram_in,np_3_gram_in])