我有以下配置:一个lstm网络,接收大小为2的n-gram文本。
经过一些测试,我发现对于某些类,当我使用大小为3的ngram时,准确性有很大提高。现在,我想同时训练两个ngram大小的新LSTM神经网络,如以下示意图所示:
我如何使用keras执行此任务来提供数据并构建此模型?
答案 0 :(得分:1)
我假设您已经具有将单词分解为n-gram的功能,因为您已经具有2 gram和3 grams模型吗?因此,我只是为工作示例构建一个单词“ cool”的示例示例。对于我的示例,我不得不使用嵌入,因为具有26 ^ 3 = 17576个节点的LSTM层对于我的计算机来说太过分了。我希望您在3克代码中也这样做了吗?
下面是一个完整的工作示例:
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])