2016-06-30 13 views
1

Ich habe eine Folge von indizierten Wörtern w_1, ..., w_n. Da ich neu im Deep Learning bin, suche ich nach einer einfachen Implementierung eines seq2seq-Po-Tagging-Modells in Keras, das den Aufmerksamkeitsmechanismus verwendet und eine Folge von POS-Tags t_1, ..., t_n aus meiner Wortsequenz erzeugt.Keras Sequenz-zu-Sequenz-Codierer-Decodierer-Wortart-Beispiel mit Aufmerksamkeitsmechanismus

Um genau zu sein, ich weiß nicht, wie die Ausgänge von LSTM versteckten Schichten des Encoders zu sammeln (da sie TimeDistributed sind) und wie die Decoder LSTM Schicht für jeden Zeitstempel mit den Ausgaben der Zeit "t- 1 "zum Erzeugen der Ausgabe" t ".

Das Modell, über das ich nachdenke, sieht wie das in diesem Papier http://arxiv.org/abs/1409.0473 aus.

+0

Sie können die vollständige Sequenz von wiederkehrenden Schichten erhalten, indem sie die 'return_sequences = true' Initialisierungsparameter wenn das Ihr Problem vorbei. – nemo

+0

Bedeutet das, dass ich Zugang zu den Ausgaben aller Schichten haben werde, sobald die Ausgabe im letzten Knoten berechnet wird (ich muss auf den Vektor von h_0 zu h_n in der Aufmerksamkeitsebene zugreifen) –

+0

Mein anderes Problem ist, dass ich 'don' Ich weiß, ob ich einen Sequential- oder einen Graph-Container benötige, um den codierten Vektor von versteckten Zuständen + Eingabe in der Aufmerksamkeitsschicht zu erzeugen. Funktioniert 'return_sequences = True' in einem oder nur einem Graphen? –

Antwort

0

Ich denke, dieses Problem wird Ihnen helfen, obwohl es keinen Aufmerksamkeitsmechanismus gibt. https://github.com/fchollet/keras/issues/2654

Der in dem Problem enthaltene Code ist wie folgt.

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