2017-02-20 4 views
16

Ich versuche, eine RNN in Keras mit Sequenzen, die unterschiedliche Zeitlängen haben, zu passen. Meine Daten befinden sich in einem Numpy-Array mit dem Format (sample, time, feature) = (20631, max_time, 24). Dabei wird max_time zur Laufzeit als die Anzahl der verfügbaren Zeitschritte für die Stichprobe mit den meisten Zeitmarken festgelegt. Ich habe den Anfang jeder Zeitreihe mit 0 aufgefüllt, bis auf den längsten natürlich.Keras-Maskierung für RNN mit verschiedenen Zeitschritten

Ich habe definiert zunächst mein Modell wie so ...

model = Sequential() 
model.add(Masking(mask_value=0., input_shape=(max_time, 24))) 
model.add(LSTM(100, input_dim=24)) 
model.add(Dense(2)) 
model.add(Activation(activate)) 
model.compile(loss=weibull_loglik_discrete, optimizer=RMSprop(lr=.01)) 
model.fit(train_x, train_y, nb_epoch=100, batch_size=1000, verbose=2, validation_data=(test_x, test_y)) 

Der Vollständigkeit halber ist hier der Code für den Funktionsverlust:

def weibull_loglik_discrete(y_true, ab_pred, name=None): 
    y_ = y_true[:, 0] 
    u_ = y_true[:, 1] 
    a_ = ab_pred[:, 0] 
    b_ = ab_pred[:, 1] 

    hazard0 = k.pow((y_ + 1e-35)/a_, b_) 
    hazard1 = k.pow((y_ + 1)/a_, b_) 

    return -1 * k.mean(u_ * k.log(k.exp(hazard1 - hazard0) - 1.0) - hazard1) 

Und hier ist der Code für die Funktion individuelle Aktivierung :

def activate(ab): 
    a = k.exp(ab[:, 0]) 
    b = k.softplus(ab[:, 1]) 

    a = k.reshape(a, (k.shape(a)[0], 1)) 
    b = k.reshape(b, (k.shape(b)[0], 1)) 

    return k.concatenate((a, b), axis=1) 

Wenn ich das Modell passen und einige Testvorhersagen machen, jedes Sample im Testset bekommt genau die gleiche Vorhersage, die fischig scheint.

Es wird besser, wenn ich die Maskierungsschicht entferne, was mich denken lässt, dass etwas mit der Maskierungsschicht nicht stimmt, aber soweit ich das beurteilen kann, habe ich die Dokumentation genau befolgt.

Ist etwas mit der Maskierungsschicht falsch spezifiziert? Vermisse ich etwas anderes?

+1

Ich habe ein paar Kommentare: 1. Warum haben Sie eine '1e-35'-Konstante festgelegt, wenn' float32' Genauigkeit tatsächlich '1e-7' ist? –

+1

In Bezug auf meine Prämie, ich möchte nur ein Beispiel für die richtige Verwendung der Maskierungsschicht für Sequenzen unterschiedlicher Länge. Mach dir keine Sorgen über Netzwerk-Besonderheiten. – Seanny123

Antwort

2

Ich konnte nicht ohne tatsächliche Daten validieren, aber ich hatte eine ähnliche Erfahrung mit einem RNN. In meinem Fall hat die Normalisierung das Problem gelöst. Fügen Sie Ihrem Modell eine Normalisierungsschicht hinzu.

+0

Ich entschuldige mich dafür, dass ich dabei AUSSERGEWÖHNLICH bin und ich schätze jeden Input. Dies war in der Tat das Problem - ich hatte die Normalisierung übersprungen, während ich versuchte, ein möglichst brauchbares Beispiel zu hacken, aber das war ein fataler Fehler. Für Interessierte ist das resultierende Modell (andere Daten) jedoch hier: https://github.com/daynebatten/keras-wtte-rnn –

2

Die Art und Weise, wie Sie die Maskierung implementiert haben, sollte korrekt sein. Wenn Sie Daten mit der Form (Stichproben, Zeitschritte, Funktionen) haben und Zeitabschnitte mit fehlenden Daten mit einer Nullmaske der gleichen Größe wie das Argument feases maskieren möchten, fügen Sie Masking(mask_value=0., input_shape=(timesteps, features)) hinzu. Siehe hier: keras.io/layers/core/#masking

Ihr Modell könnte möglicherweise zu einfach sein, und/oder Ihre Anzahl von Epochen könnte nicht ausreichen, damit das Modell zwischen all Ihren Klassen unterscheidet. Versuchen Sie dieses Modell:

model = Sequential() 
model.add(Masking(mask_value=0., input_shape=(max_time, 24))) 
model.add(LSTM(256, input_dim=24)) 
model.add(Dense(1024)) 
model.add(Dense(2)) 
model.add(Activation(activate)) 
model.compile(loss=weibull_loglik_discrete, optimizer=RMSprop(lr=.01)) 
model.fit(train_x, train_y, nb_epoch=100, batch_size=1000, verbose=2, validation_data=(test_x, test_y)) 

Wenn das nicht funktioniert, versuchen Sie die Epochen ein paar Mal zu verdoppeln (zum Beispiel 200, 400) und sehen, ob das die Ergebnisse verbessert.