RNN z wieloma funkcjami


27

Mam trochę samouczącej się wiedzy związanej z algorytmami uczenia maszynowego (podstawowe rzeczy typu Losowy Las i Regresja Liniowa). Postanowiłem rozgałęzić się i zacząć uczyć RNN z Keras. Patrząc na większość przykładów, które zwykle wiążą się z prognozami giełdowymi, nie znalazłem żadnych podstawowych przykładów implementacji wielu funkcji innych niż 1 kolumna będąca datą funkcji, a druga to wynik. Czy brakuje mi kluczowej fundamentalnej rzeczy?

Jeśli ktoś ma przykład, byłbym bardzo wdzięczny.

Dzięki!


1
Nie wiesz, co rozumiesz przez „wiele funkcji”. Jeśli masz na myśli więcej niż jedną funkcję mającą wpływ na uczenie się, to po prostu używasz wielowymiarowej matrycy projektowej. Proszę o wyjaśnienie przez przykład lub coś.
— horaceT

@horaceT Opracowałem multiple features tutaj bardziej szczegółowe pytanie o tym, jak używać RNN do prognoz szeregów czasowych z funkcjami zawierającymi dane liczbowe i dane nienumeryczne?
— hhh

Odpowiedzi:


25

Rekurencyjne sieci neuronowe (RNN) są zaprojektowane do uczenia danych sekwencji. Jak się domyślacie, zdecydowanie mogą one przyjmować wiele funkcji! RNN Keras pobierają dane 2D ( T , F ) kroków czasu T i funkcje F (tutaj ignoruję wymiar wsadowy).

Jednak nie zawsze potrzebujesz lub nie potrzebujesz pośrednich kroków czasowych, t = 1, 2 ... ( T - 1). Dlatego Keras elastycznie obsługuje oba tryby. Aby wyprowadził wszystkie T timepeps, przekaż return_sequences=Truedo swojego RNN (np. LSTMLub GRU) na budowie. Jeśli chcesz tylko ostatniego pomiaru czasu t = T , użyj return_sequences=False(jest to ustawienie domyślne, jeśli nie przejdziesz return_sequencesdo konstruktora).

Poniżej znajdują się przykłady obu tych trybów.

Przykład 1: Nauka sekwencji

Oto szybki przykład szkolenia LSTM (typ RNN), który utrzymuje całą sekwencję. W tym przykładzie każdy punkt danych wejściowych ma 2 kroki czasowe, każdy z 3 funkcjami; dane wyjściowe mają 2 przedziały czasowe (ponieważ return_sequences=True), każdy z 4 punktami danych (ponieważ jest to rozmiar, który przekazuję 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)

Przykład 2: Nauka ostatniego pomiaru czasu

Z drugiej strony, jeśli chcesz wyszkolić LSTM, który generuje tylko ostatni timepep w sekwencji, musisz ustawić return_sequences=False(lub po prostu całkowicie usunąć go z konstruktora, ponieważ Falsejest to ustawienie domyślne). A następnie dane wyjściowe ( data_yw powyższym przykładzie) muszą zostać uporządkowane, ponieważ wystarczy podać tylko ostatni czas. Tak więc w tym drugim przykładzie każdy punkt danych wejściowych nadal ma 2 przebiegi czasowe, każdy z 3 funkcjami. Dane wyjściowe są jednak tylko pojedynczym wektorem dla każdego punktu danych, ponieważ spłaszczyliśmy wszystko do pojedynczego pomiaru czasu. Każdy z tych wektorów wyjściowych ma jednak nadal 4 cechy (ponieważ taki rozmiar przekazuję 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)

Dziękuję za wspaniałe wyjaśnienie. Jaki jest związek między punktem danych nr 1 a punktem danych nr 2. Na przykład w pierwszej sytuacji, jeśli chcesz usunąć punkt danych 2 i umieścić go pod punktem danych 1, teraz mamy 4 kroki czasowe. Jak wpłynęłoby to na cały model?
— Rjay155

Nie ma szczególnego związku między punktami danych. Dobry zestaw do uczenia głębokiego będzie zawierał dziesiątki tysięcy, a nawet miliony punktów danych. Jeden punkt danych = jedna próbka treningowa, to wszystko. Jeśli miałbyś „scalić” punkty danych nr 1 i nr 2, wówczas data_xpo prostu zawierałby jeden punkt danych, a ten punkt danych miałby cztery kroki czasowe, każdy z 3 wymiarów (i podobnie, musiałbyś scalić data_yw ten sam sposób). Liczba używanych kroków czasowych zależy po prostu od tego, co próbujesz wymodelować (oraz ile kroków czasowych jest odpowiednich dla tego procesu).
— Adam Sypniewski

@Adam Sypniewski Mam pytanie dotyczące y. data_y = numpy.array ([# Datapoint 1 # Funkcje docelowe w czasie 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Funkcje docelowe w czasie 2 [[205, 206, 207 , 208], [1, 0]]]), jeśli jedno z moich y jest cechami kategorycznymi. Jak bym to ustrukturyzował. Dzięki!
— Hua Ye,

2
W takim przypadku powinieneś prawdopodobnie wprowadzić dane wyjściowe RNN do gęstej warstwy, aby każdy krok wyjściowy został odwzorowany na kategorie jednokierunkowe.
— Adam Sypniewski

Jak możesz tutaj wyobrazić sobie wyniki? Przydałyby się niektóre wykresy.
— hhh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.