2017-04-18 9 views
1

Ich habe einige Trainingsdaten x_train und einige entsprechende Etiketten für diese x_train namens y_train. Hier ist, wie x_train und y_train aufgebaut sind:LSTM mit keras

train_x = np.array([np.random.rand(1, 1000)[0] for i in range(10000)]) 
train_y = (np.random.randint(1,150,10000)) 

train_x hat 10000 Zeilen und 1000 Spalten für jede Zeile. train_y hat eine Bezeichnung zwischen 1 und 150 für jede Probe in train_x und repräsentiert einen Code für jede train_x-Probe.

Ich habe auch eine Probe namens Probe, die 1 Zeile mit 1000 Spalten ist, die ich für die Vorhersage auf diesem LSTM-Modell verwenden möchte. Diese Variable ist als

sample = np.random.rand(1,1000)[0] 

definiert. Ich versuche, ein LSTM auf diese Daten mit Keras zu trainieren und vorherzusagen. Ich möchte diesen Feature-Vektor aufnehmen und diesen LSTM verwenden, um einen der Codes im Bereich von 1 bis 150 vorherzusagen. Ich weiß, dass dies zufällige Arrays sind, aber ich kann die Daten, die ich habe, nicht posten. Ich habe den folgenden Ansatz versucht, die ich arbeiten glauben sollte, aber bin vor ein paar Probleme

model = Sequential() 
    model.add(LSTM(output_dim = 32, input_length = 10000, input_dim = 1000,return_sequences=True)) 
    model.add(Dense(150, activation='relu')) 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    history = model.fit(train_x, train_y, 
       batch_size=128, nb_epoch=1, 
       verbose = 1) 
    model.predict(sample) 

Hilfe oder Anpassungen dieser Pipeline wäre toll. Ich bin mir nicht sicher, ob die output_dim korrekt ist. Ich möchte den LSTM an jedem Beispiel der 1000-dimensionalen Daten trainieren und dann einen spezifischen Code reproduzieren, der zwischen 1 und 150 liegt. Danke.

Antwort

1

ich mindestens drei Dinge sehen müssen Sie ändern:

  1. Ändern Sie diese Zeile:

    model.add(Dense(150, activation='relu')) 
    

    zu:

    model.add(Dense(150, activation='softmax')) 
    

    als Abgangs 'relu' als Aktivierung Ihrer Ausgabe macht unbegrenzt, während es eine probabilistische Interpretation haben muss (wie Sieverwenden).

  2. ändern Verlust oder Ziel:

    Wie Sie categorical_crossentropy verwenden Sie müssen Ihr Ziel zu ändern ein one-hot kodierten Vektor der Länge 150. Ein anderer Weg, um Ihr Ziel zu verlassen, aber Verlust zu ändern zu sparse_categorical_crossentropy.

  3. Ihren Zielbereich ändern:

    Keras hat eine 0-basierte Array-Indizierung (wie in Python, C und C++ so Ihre Werte [0, 150) statt [1, 150] in Reichweite sein sollten

+0

so, als ich. zu einem einzigen kodierten Vektor der Länge 150 wechseln, bekomme ich an jedem Ort eine Menge Dezimalzahlen für die Vorhersagen.Was stellen diese Dezimalzahlen dar? Sind sie eine Wahrscheinlichkeit, dass es sich um Klasse 1,2,3, ..., 150 handelt? –

+0

Ja - aber erinnere dich an ab out diese 0-basierte Array-Indizierung. Wahrscheinlichkeit der Klasse 1 ist bei Index 0, - der Klasse 2 - bei Index 1, etc. –

+0

ok super danke! Könnten Sie dies mit einem k enkodierten Vektor tun? Sagen wir, dass wir für Probe 1 [5, 8, 9] und Probe 2 [130, 11, 12, 5, 9] hatten, wo es eine andere Anzahl von Labels gab? –

Verwandte Themen