RNN con più funzionalità


27

Ho un po 'di conoscenza autodidatta lavorando con algoritmi di Machine Learning (roba di base di tipo Random Forest e Linear Regression). Ho deciso di diramare e iniziare a imparare RNN con Keras. Quando osservo la maggior parte degli esempi, che di solito implicano previsioni di stock, non sono stato in grado di trovare esempi di base di funzionalità multiple implementate diverse da 1 colonna come data della funzione e l'altra come output. C'è una cosa fondamentale fondamentale che mi manca o qualcosa del genere?

Se qualcuno ha un esempio, lo apprezzerei molto.

Grazie!


1
Non sono sicuro di cosa intendevi per "funzionalità multiple". Se intendi più di una funzione che ha un impatto sull'apprendimento, allora usi semplicemente una matrice di progettazione multivariata. Chiarisci con un esempio o qualcosa del genere.
Orazio

@horaceT Ho elaborato multiple features qui una domanda più specifica su come utilizzare RNN per le previsioni di serie temporali con funzionalità che contengono dati numerici e dati non numerici?
hhh

Risposte:


25

Le reti neurali ricorrenti (RNN) sono progettate per apprendere i dati di sequenza. Come indovini, possono sicuramente prendere più funzionalità come input! Gli RNN di Keras accettano input 2D ( T , F ) di timestep T e funzionalità F (qui sto ignorando la dimensione del batch).

Tuttavia, non è sempre necessario o desiderato i timestep intermedi, t = 1, 2 ... ( T - 1). Pertanto, Keras supporta in modo flessibile entrambe le modalità. Per avere in uscita tutti i timestep T , passa return_sequences=Trueal tuo RNN (ad esempio, LSTMo GRU) durante la costruzione. Se vuoi solo l'ultimo timestep t = T , usa return_sequences=False(questo è il default se non passi return_sequencesal costruttore).

Di seguito sono riportati esempi di entrambe queste modalità.

Esempio 1: apprendimento della sequenza

Ecco un breve esempio di addestramento di un LSTM (tipo di RNN) che mantiene l'intera sequenza. In questo esempio, ciascun punto dati di input ha 2 timestep, ciascuno con 3 funzioni; i dati di output hanno 2 timestep (perché return_sequences=True), ognuno con 4 punti dati (perché questa è la dimensione che passo a 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)

Esempio 2: apprendimento dell'ultimo timestep

Se, d'altra parte, si desidera addestrare un LSTM che emette solo l'ultimo timestep nella sequenza, è necessario impostare return_sequences=False(o semplicemente rimuoverlo completamente dal costruttore, poiché Falseè l'impostazione predefinita). Quindi i dati di output ( data_ynell'esempio sopra) devono essere riorganizzati, poiché è necessario fornire solo l'ultimo timestep. Quindi, in questo secondo esempio, ogni punto di dati di input ha ancora 2 timestep, ognuno con 3 funzionalità. I dati di output, tuttavia, sono solo un singolo vettore per ciascun punto dati, perché abbiamo appiattito tutto in un unico timestep. Ognuno di questi vettori di output ha comunque 4 funzionalità (perché questa è la dimensione che passo a 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)

Grazie per la tua grande spiegazione. Qual è la relazione tra datapoint # 1 e datapoint # 2. Ad esempio, nella prima situazione, se dovessi rimuovere il datapoint 2 e posizionarlo sotto il datapoint 1, quindi ora abbiamo 4 passaggi temporali. In che modo ciò influenzerebbe il modello nel suo insieme?
Rjay155,

Non esiste una relazione speciale tra punti dati. Un buon set di formazione per l'apprendimento profondo avrà molte decine di migliaia o addirittura milioni di punti dati. Un punto dati = un campione di allenamento, tutto qui. Se dovessi "unire" i punti dati n. 1 e n. 2, data_xconteneresti semplicemente un singolo punto dati e quel punto dati avrebbe quattro timestep, ciascuno di 3 dimensioni (e allo stesso modo, dovresti unirti data_yallo stesso modo). Il numero di timestep che usi dipende semplicemente da cosa stai cercando di modellare (e da quanti timestep sono rilevanti per quel processo).
Adam Sypniewski,

@Adam Sypniewski Ho delle domande su y. data_y = numpy.array ([# Datapoint 1 # Funzionalità target al timestep 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Funzionalità target al timestep 2 [[205, 206, 207 , 208], [1, 0]]]) se una delle mie caratteristiche y è categorica. Come lo strutturerei. Grazie!
Hua Ye,

2
In tal caso, probabilmente dovresti alimentare l'output di RNN in un layer denso, in modo che ogni timestep di output venga mappato in categorie a uno caldo.
Adam Sypniewski

Come puoi visualizzare i risultati qui? Alcuni grafici sarebbero utili.
hhh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.