我有一系列索引词w_1,...,w_n。由于我刚接触深度学习,我正在寻找Keras中seq2seq pos标记模型的简单实现,该模型使用注意机制并从我的单词序列中生成一系列POS标记t_1,...,t_n。
具体来说,我不知道如何收集编码器的LSTM隐藏层的输出(因为它们是TimeDistributed)以及如何为时间“t-1”的输出提供每个时间戳的解码器LSTM层“用于生成输出”t“。
我正在考虑的模型看起来像本文http://arxiv.org/abs/1409.0473中的模型。
答案 0 :(得分:0)
我认为这个问题会对你有帮助,尽管没有注意机制。 https://github.com/fchollet/keras/issues/2654
问题中包含的代码如下。
B = self.igor.batch_size
R = self.igor.rnn_size
S = self.igor.max_sequence_len
V = self.igor.vocab_size
E = self.igor.embedding_size
emb_W = self.igor.embeddings.astype(theano.config.floatX)
## dropout parameters
p_emb = self.igor.p_emb_dropout
p_W = self.igor.p_W_dropout
p_U = self.igor.p_U_dropout
p_dense = self.igor.p_dense_dropout
w_decay = self.igor.weight_decay
M = Sequential()
M.add(Embedding(V, E, batch_input_shape=(B,S),
W_regularizer=l2(w_decay),
weights=[emb_W], mask_zero=True, dropout=p_emb))
#for i in range(self.igor.num_lstms):
M.add(LSTM(R, return_sequences=True, dropout_W=p_W, dropout_U=p_U,
U_regularizer=l2(w_decay), W_regularizer=l2(w_decay)))
M.add(Dropout(p_dense))
M.add(LSTM(R*int(1/p_dense), return_sequences=True, dropout_W=p_W, dropout_U=p_U))
M.add(Dropout(p_dense))
M.add(TimeDistributed(Dense(V, activation='softmax',
W_regularizer=l2(w_decay), b_regularizer=l2(w_decay))))
print("compiling")
optimizer = Adam(self.igor.LR, clipnorm=self.igor.max_grad_norm,
clipvalue=5.0)
#optimizer = SGD(lr=0.01, momentum=0.5, decay=0.0, nesterov=True)
M.compile(loss='categorical_crossentropy', optimizer=optimizer,
metrics=['accuracy', 'perplexity'])
print("compiled")
self.model = M