合并两个池层的功能

时间:2018-10-13 23:03:48

标签: python tensorflow machine-learning keras deep-learning

我正在尝试设计双向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,这是因为我相信连接层。因为我没有在模型中添加池。

我可以在同一模型中添加两​​个图层吗?还是应该定义两个单独的模型,然后在每个模型中添加池化层?

1 个答案:

答案 0 :(得分:1)

这里的技巧是使用图形模型而不是顺序模型。

开始之前,我假设

  1. 您的网络需要一个(B=batch_size, N=num_of_words)形状的2D输入张量,其中N是训练数据的最长样本长度。 (如果您有不等长的样本,则应使用keras.preprocessing.sequence.pad_sequences来获得等长的样本)
  2. 您的词汇量是V(如果我理解正确的话,大概是300)
  3. 您的嵌入层会将每个单词编码为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]之类的语法。