2016-10-31 3 views
2

Ich versuche, benutzerdefinierte Worteinbettungen von Spacy für das Training einer Sequenz zu verwenden -> Label RNN Abfrageklassifikator. Hier ist mein Code:Genauigkeit geht auf 0,0000 beim Training RNN mit Keras?

word_vector_length = 300 
dictionary_size = v.num_tokens + 1 
word_vectors = v.get_word_vector_dictionary() 
embedding_weights = np.zeros((dictionary_size, word_vector_length)) 
max_length = 186 
for word, index in dictionary._get_raw_id_to_token().items(): 
    if word in word_vectors: 
     embedding_weights[index,:] = word_vectors[word] 
model = Sequential() 
model.add(Embedding(input_dim=dictionary_size, output_dim=word_vector_length, 
        input_length= max_length, mask_zero=True, weights=[embedding_weights])) 
model.add(Bidirectional(LSTM(128, activation= 'relu', return_sequences=False))) 
model.add(Dense(v.num_labels, activation= 'sigmoid')) 

model.compile(loss = 'binary_crossentropy', 
       optimizer = 'adam', 
       metrics = ['accuracy']) 

model.fit(X_train, Y_train, batch_size=200, nb_epoch=20) 

hier die word_vectors aus spacy.vectors abgezogen und haben Länge 300 ist die Eingabe ein np_array die wie [0,0,12,15,0...] der Dimension aussieht 186, wo die ganzen Zahlen der Token-IDs in dem Eingang sind, und Ich habe die eingebettete Gewichtsmatrix entsprechend konstruiert. Die Ausgabeschicht ist [0,0,1,0,...0] mit einer Länge von 26 für jedes Trainingssample und gibt die Bezeichnung an, die zu diesem Vektortext gehören sollte.

Das sieht so aus, als müsste es funktionieren, aber in der ersten Epoche nimmt die Trainingsgenauigkeit ständig ab ... und am Ende der ersten Epoche/für den Rest des Trainings ist es genau 0 und ich bin mir nicht sicher warum das passiert. Ich habe schon viele Modelle mit Keras/TF trainiert und bin nie auf dieses Problem gestoßen.

Irgendeine Idee, was hier geschehen könnte?

+0

Haben Sie versucht, die Lernrate zu verringern? Der Standard '1e-3' für Adam ist für diese Aufgabe ziemlich hoch. – y300

Antwort

-1

Sind die Etiketten immer ein-heiß? Bedeutet nur eines der Elemente des Label-Vektors ist eins und der Rest Null.

Wenn ja, dann vielleicht versuchen, eine softmax Aktivierung mit einem kategorischen crossentropy Verlust mit wie in der folgenden offiziellen Beispiel:

https://github.com/fchollet/keras/blob/master/examples/babi_memnn.py#L202

Dies wird dazu beitragen, um das Netzwerk zu Ausgabewahrscheinlichkeitsverteilungen auf der letzten Schicht Constraint (dh die softmax-schicht gibt summe bis 1) aus.

Verwandte Themen