def __init__(self, embedding_mat=None, maxlen_doc=7, maxlen_sent=50, filter_length=[3, 4, 5, 6],
nb_filters=200, n_vocab=10000, embedding_dims=300, hidden_gru=64, n_classes=5):
if embedding_mat is not None:
self.n_vocab, self.embedding_dims = embedding_mat.shape
else:
self.n_vocab = n_vocab
self.embedding_dims = embedding_dims
self.maxlen_doc = maxlen_doc
self.maxlen_sent = maxlen_sent
self.filter_length = filter_length
self.nb_filters = nb_filters
self.hidden_gru = hidden_gru
print "Building the model"
#graph model
model=Graph()
model.add_input(name='input', input_shape=(self.maxlen_doc*self.maxlen_sent,), dtype='int')
#Model embedding layer, for word index-> word embedding transformation
model.add_node(Embedding(self.n_vocab, self.embedding_dims, weights=[self.embedding_mat],
input_length=self.maxlen_sent*self.maxlen_doc),
name='embedding', input='input')
model.add_node(Reshape((self.maxlen_doc, 1, self.maxlen_sent, self.embedding_dims)),
name='reshape_5d', input='embedding')
#define the different filters
conv_layer = []
for each_length in filter_length:
model.add_node(TimeDistributedConvolution2D(self.nb_filters/len(filter_length),
each_length, self.embedding_dims, border_mode='valid',
input_shape=(self.maxlen_doc,1,self.maxlen_sent, self.embedding_dims)),
name='conv_{}'.format(each_length), input='reshape_5d')
model.add_node(Activation('relu'),
name='relu_conv_{}'.format(each_length), input='conv_{}'.format(each_length))
model.add_node(TimeDistributedMaxPooling2D(pool_size=(int(self.maxlen_sent - each_length+1), 1),
border_mode='valid'),
name='pool_conv_{}'.format(each_length), input='relu_conv_{}'.format(each_length))
model.add_node(TimeDistributedFlatten(),
name='flatten_conv_{}'.format(each_length), input='pool_conv_{}'.format(each_length))
conv_layer.append('flatten_conv_{}'.format(each_length))
# model.add_node(Activation('relu'), name='relu', inputs=conv_layer)
print conv_layer
model.add_node(GRU(self.hidden_gru), name='gru_forward', inputs=conv_layer)
model.add_node(GRU(self.hidden_gru, go_backwards=True), name='gru_backward', inputs=conv_layer)
model.add_node(Dropout(0.5), name='gru_outputs', inputs=['gru_forward', 'gru_backward'])
model.add_node(Dense(n_classes), name='full_con', input='gru_outputs')
model.add_node(Activation('softmax'), name='prob', input='full_con')
model.add_output(name='pred', input='prob')
model.compile('rmsprop', loss = {'pred': 'categorical_crossentropy'})
评论列表
文章目录