RNNs mit mehreren Funktionen


27

Ich verfüge über ein wenig Autodidakt-Wissen in der Arbeit mit Algorithmen des maschinellen Lernens (das grundlegende Material vom Typ Random Forest und Linear Regression). Ich beschloss, mich zu verzweigen und mit Keras RNNs zu lernen. Wenn ich mir die meisten Beispiele ansehe, bei denen es sich in der Regel um Bestandsvorhersagen handelt, konnte ich keine grundlegenden Beispiele für die Implementierung mehrerer Funktionen finden, mit Ausnahme von 1 Spalte als Funktionsdatum und der anderen als Ausgabe. Gibt es eine wichtige grundlegende Sache, die mir fehlt oder etwas?

Wenn jemand ein Beispiel hat, würde ich es sehr schätzen.

Vielen Dank!


1
Ich bin mir nicht sicher, was Sie unter "Mehrere Funktionen" verstanden haben. Wenn Sie mehr als eine Funktion meinen, die sich auf das Lernen auswirkt, verwenden Sie einfach eine multivariate Entwurfsmatrix. Bitte klären Sie durch ein Beispiel oder etwas.
HoraceT

@horaceT Ich habe multiple features hier eine genauere Frage zur Verwendung von RNN für Zeitreihenvorhersagen mit Features, die numerische und nicht numerische Daten enthalten, ausgearbeitet .
hhh

Antworten:


25

Rekurrente neuronale Netze (RNNs) dienen zum Lernen von Sequenzdaten. Wie Sie sich denken, können sie definitiv mehrere Funktionen als Eingabe verwenden! Keras 'RNNs nehmen 2D-Eingaben ( T , F ) von Zeitschritten T und Features F auf (ich ignoriere die Batch-Dimension hier).

Sie müssen oder möchten jedoch nicht immer die Zwischenzeitschritte t = 1, 2 ... ( T - 1). Daher unterstützt Keras beide Modi flexibel. Um alle T Zeitschritte ausgeben zu lassen, übergeben return_sequences=TrueSie diese beim Bau an Ihre RNN (z. B. LSTModer GRU). Wenn Sie nur den letzten Zeitschritt t = T möchten , verwenden Sie return_sequences=False(dies ist die Standardeinstellung, wenn Sie nicht return_sequencesan den Konstruktor übergeben).

Nachfolgend finden Sie Beispiele für diese beiden Modi.

Beispiel 1: Lernen der Sequenz

Hier ist ein kurzes Beispiel für das Training eines LSTM (RNN-Typs), bei dem die gesamte Sequenz beibehalten wird. In diesem Beispiel hat jeder Eingangsdatenpunkt 2 Zeitschritte mit jeweils 3 Merkmalen. Die Ausgabedaten haben 2 Zeitschritte (weil return_sequences=True) mit jeweils 4 Datenpunkten (weil das die Größe ist, an die ich übergebe LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    [
        # Target features at timestep 1
        [101, 102, 103, 104],
        # Target features at timestep 2
        [105, 106, 107, 108]
    ],
    # Datapoint 2
    [
        # Target features at timestep 1
        [201, 202, 203, 204],
        # Target features at timestep 2
        [205, 206, 207, 208]
    ]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Beispiel 2: Lernen des letzten Zeitschritts

Wenn Sie andererseits einen LSTM trainieren möchten, der nur den letzten Zeitschritt in der Sequenz ausgibt, müssen Sie ihn setzen return_sequences=False(oder ihn einfach ganz aus dem Konstruktor entfernen), daFalse die Standardeinstellung ist). Und dann müssen Ihre Ausgabedaten ( data_yim obigen Beispiel) neu angeordnet werden, da Sie nur den letzten Zeitschritt angeben müssen. In diesem zweiten Beispiel hat jeder Eingangsdatenpunkt also noch 2 Zeitschritte mit jeweils 3 Merkmalen. Die Ausgabedaten sind jedoch nur ein einziger Vektor für jeden Datenpunkt, da wir alles auf einen einzigen Zeitschritt reduziert haben. Jeder dieser Ausgabevektoren hat jedoch immer noch 4 Merkmale (da dies die Größe ist, an die ich übergebe LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    # Target features at timestep 2
    [105, 106, 107, 108],
    # Datapoint 2
    # Target features at timestep 2
    [205, 206, 207, 208]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Vielen Dank für Ihre großartige Erklärung. Wie ist die Beziehung zwischen Datenpunkt Nr. 1 und Datenpunkt Nr. 2? Wenn Sie beispielsweise in der ersten Situation den Datenpunkt 2 entfernen und unter dem Datenpunkt 1 platzieren, haben wir jetzt 4 Zeitschritte. Wie würde sich das auf das gesamte Modell auswirken?
Rjay155

Es gibt keine spezielle Beziehung zwischen Datenpunkten. Ein gutes Deep-Learning-Trainingsset wird viele Zehntausende oder sogar Millionen von Datenpunkten enthalten. Ein Datenpunkt = ein Trainingsmuster, das ist alles. Wenn Sie die Datenpunkte Nr. 1 und Nr. 2 "zusammenführen" data_xwürden , dann würde dies einfach einen einzelnen Datenpunkt enthalten, und dieser Datenpunkt würde vier Zeitschritte mit jeweils drei Dimensionen aufweisen (und ähnlich müssten Sie data_yauf die gleiche Weise zusammenführen). Die Anzahl der Zeitschritte, die Sie verwenden, hängt einfach davon ab, was Sie modellieren möchten (und wie viele Zeitschritte für diesen Prozess relevant sind).
Adam Sypniewski

@Adam Sypniewski Ich habe eine Frage zum y. data_y = numpy.array ([# Datenpunkt 1 # Zielmerkmale zum Zeitpunkt 2 [[105, 106, 107, 108], [0, 1]], # Datenpunkt 2 # Zielmerkmale zum Zeitpunkt 2 [[205, 206, 207 , 208], [1, 0]]]) wenn eines meiner y kategoriale Merkmale ist. Wie würde ich das strukturieren? Danke!
Hua Ye

2
In diesem Fall sollten Sie die Ausgabe des RNN wahrscheinlich in eine dichte Ebene einspeisen, damit jeder Ausgabezeitschritt einer One-Hot-Kategorie zugeordnet wird.
Adam Sypniewski

Wie können Sie die Ergebnisse hier visualisieren? Einige Grundstücke wären nützlich.
Hhh,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.