具有注意机制的Keras序列到序列编码器 - 解码器词性标记示例

时间:2016-06-30 22:40:19

标签: deep-learning keras encoder decoder pos-tagger

我有一系列索引词w_1,...,w_n。由于我刚接触深度学习,我正在寻找Keras中seq2seq pos标记模型的简单实现,该模型使用注意机制并从我的单词序列中生成一系列POS标记t_1,...,t_n。

具体来说,我不知道如何收集编码器的LSTM隐藏层的输出(因为它们是TimeDistributed)以及如何为时间“t-1”的输出提供每个时间戳的解码器LSTM层“用于生成输出”t“。

我正在考虑的模型看起来像本文http://arxiv.org/abs/1409.0473中的模型。

1 个答案:

答案 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