我正在尝试设计双向LSTM模型,我想在最大合并和平均合并之后合并功能。 我的模特有这个:
from keras.layers import Dense, Embedding
from keras.layers.recurrent import LSTM
from keras.layers import Bidirectional
from keras.models import Sequential
from keras.layers.core import Dropout
from features import train,embedding_matrix,words
from keras.layers import concatenate,AveragePooling1D,GlobalMaxPooling1D
model=Sequential()
model.add(Embedding(words,300,input_length=train.shape[1],weights=[embedding_matrix]))
model.add(Bidirectional(LSTM(20,activation='tanh',kernel_initializer='glorot_uniform',recurrent_dropout = 0.2, dropout = 0.2,return_sequences=True)))
model.add(concatenate([GlobalMaxPooling1D(),AveragePooling1D()]))
model.add(Dropout(0.2))
model.add(Dense(2, activation='softmax'))
print model.summary()
但是我有:
ValueError: Layer concatenate_1 was called with an input that isn't a symbolic tensor
,这是因为我相信连接层。因为我没有在模型中添加池。
我可以在同一模型中添加两个图层吗?还是应该定义两个单独的模型,然后在每个模型中添加池化层?
答案 0 :(得分:1)
这里的技巧是使用图形模型而不是顺序模型。
开始之前,我假设
(B=batch_size, N=num_of_words)
形状的2D输入张量,其中N是训练数据的最长样本长度。 (如果您有不等长的样本,则应使用keras.preprocessing.sequence.pad_sequences
来获得等长的样本)您的嵌入层会将每个单词编码为F维特征,即,嵌入层的权重矩阵为VxF
。
从keras.layers导入密集,嵌入,输入,串联,Lambda 从keras.layers.recurrent导入LSTM 从keras.layers导入双向 从keras.models导入模型 从keras.layers.core导入Dropout 从keras导入后端为BKN
从keras.layers导入并置,AveragePooling1D,GlobalMaxPooling1D
单词=输入(形状=(N,))
f =嵌入(input_dim = V,output_dim = F)(个字) f =双向(LSTM(20,activation ='tanh', kernel_initializer ='glorot_uniform', recurrent_dropout = 0.2, 辍学= 0.2,return_sequences = True))(f) gpf = GlobalMaxPooling1D()(f) gpf = Lambda(lambda t:BKN.expand_dims(t,axis = 1))(gpf) apf = AveragePooling1D(pool_size = 2)(f) pf =串联(axis = 1)([gpf,apf]) pf =辍学(0.2)(pf) pred = Dense(2,activation ='softmax')(pf)#<-确保这是正确的
model = Model(input = words,output = pred)
最后,我没有发现keras Embedding
层支持weights=[embedding_matrix]
之类的语法。