[PYTHON] Anfänger RNN (LSTM) | Versuchen Sie es mit Keras

Ich entschied mich für RNN für die Analyse von Zeitreihendaten, implementierte es einfach und verwendete es als Zeitreihendaten. Die meisten von ihnen sind die folgenden Imitationen, also bitte mögen Sie sie. Sin Wave Prediction unter Verwendung von RNN in der Deep Learning Library Keras Sinuswellen mit LSTM vorhersagen

Bibliothek

from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
import numpy as np
import matplotlib.pyplot as plt

Um LSTM zu erstellen, importieren Sie dieses Mal LSTM aus wiederkehrenden Frühes Stoppen wird auch importiert, um Ressourcen wie Lernzeit zu sparen.

Daten erstellen

Sinuswellenerzeugung

Zunächst wird eine Sinuswelle erzeugt.

def sin(x, T=100):
    return np.sin(2.0 * np.pi * x / T)

#Fügen Sie den Sinuswellen Rauschen hinzu
def toy_problem(T=100, ampl=0.05):
    x = np.arange(0, 2 * T + 1)
    noise = ampl * np.random.uniform(low=-1.0, high=1.0, size=len(x))
    return sin(x) + noise

f = toy_problem()

In eine Form geformt, um Sin-Wellen durch RNN zu leiten

Wie unten gezeigt, werden Trainingsdaten durch 25 Etikettendaten pro 25 Schritte als Trainingsdaten ausgedrückt.

rnn_label.png

def make_dataset(low_data, n_prev=100):

    data, target = [], []
    maxlen = 25

    for i in range(len(low_data)-maxlen):
        data.append(low_data[i:i + maxlen])
        target.append(low_data[i + maxlen])

    re_data = np.array(data).reshape(len(data), maxlen, 1)
    re_target = np.array(target).reshape(len(data), 1)

    return re_data, re_target
  

#g ->Trainingsdaten, h->Lernetikett
g, h = make_dataset(f)

Modellgenerierung

Erstellen Sie ein einfaches LSTM-Lernmodell. Das Konzept von LSTM ist wie folgt sehr einfach zu verstehen. [Übersicht über das LSTM-Netzwerk](http://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca#lstm Network)

#Modellbau

#Anzahl der Schritte einer Trainingsdaten(Diesmal 25)
length_of_sequence = g.shape[1]	
in_out_neurons = 1
n_hidden = 300

model = Sequential()
model.add(LSTM(n_hidden, batch_input_shape=(None, length_of_sequence, in_out_neurons), return_sequences=False))
model.add(Dense(in_out_neurons))
model.add(Activation("linear"))
optimizer = Adam(lr=0.001)
model.compile(loss="mean_squared_error", optimizer=optimizer)

Lernen

Das Training wird anhand der generierten Trainingsdaten und des definierten Modells durchgeführt. Dieses Mal wurden 10% der Trainingsdaten zur Validierung verwendet und in 100 Epochen trainiert. Durch Definieren von Early_stopping in der ersten Zeile mit Rückrufen wird das Lernen automatisch beendet, wenn festgestellt wird, dass die Änderung des Validierungsfehlerwerts (val_loss) konvergiert hat. Durch Einstellen des Modus auf Auto wird die Konvergenz automatisch beurteilt. Geduld lernt die Epoche für den Wert der Geduld aus dem Urteilswert und beurteilt, dass sie endet, wenn sich nichts ändert. Wenn also Geduld = 0 ist, endet das Lernen in dem Moment, in dem val_loss steigt.

early_stopping = EarlyStopping(monitor='val_loss', mode='auto', patience=20)
model.fit(g, h,
          batch_size=300,
          epochs=100,
          validation_split=0.1,
          callbacks=[early_stopping]
          )

Prognose

Vorhersage mit Trainingsdaten

Sagen Sie die Trainingsdaten voraus und prüfen Sie, ob die Sinuswelle reproduziert werden kann.

#Prognose
predicted = model.predict(g)

Jetzt können wir die Sinuswelle nach t = 25 vorhersagen lassen. Lassen Sie uns tatsächlich planen.

plt.figure()
plt.plot(range(25,len(predicted)+25),predicted, color="r", label="predict_data")
plt.plot(range(0, len(f)), f, color="b", label="row_data")
plt.legend()
plt.show()

predict_data.png

Vorhersage Die Sinuswelle kann nahezu ohne Einfluss von Rauschen vorhergesagt werden.

Vorhersage der Zukunft

Unter Verwendung des erzeugten Trainingsmodells werden die Koordinaten der Sinuswelle zum Zeitpunkt nach den Trainingsdaten vorhergesagt.

#Zeitdauer für eine Trainingsdaten-> 25
time_length = future_test.shape[1]
#Variablen, die zukünftige Prognosedaten speichern
future_result = np.empty((1))

#Zukunftsprognose
for step2 in range(400):

    test_data = np.reshape(future_test, (1, time_length, 1))
    batch_predict = model.predict(test_data)

    future_test = np.delete(future_test, 0)
    future_test = np.append(future_test, batch_predict)

    future_result = np.append(future_result, batch_predict)
    

#Plot Sin Wave
plt.figure()
plt.plot(range(25,len(predicted)+25),predicted, color="r", label="predict_data")
plt.plot(range(0, len(f)), f, color="b", label="row_data")
plt.plot(range(0+len(f), len(future_result)+len(f)), future_result, color="g", label="future_predict")
plt.legend()
plt.show()

future_predict.png

Die Amplitude ist nach und nach kleiner geworden ... Vielleicht ist die Länge einer Trainingsdaten mit 25 Schritten kurz? ?? Das nächste Mal werde ich versuchen, in etwa 40 Schritten vorherzusagen.

Source Code https://github.com/sasayabaku/Machine-Learning/blob/master/Example_RNN/SineWave_Prediction.ipynb

Recommended Posts

Anfänger RNN (LSTM) | Versuchen Sie es mit Keras
Multivariates LSTM mit Keras
Versuchen Sie TensorFlow MNIST mit RNN
Implementieren Sie Keras LSTM Feed Forward mit Numpy
Versuchen Sie, XOR mit der Keras Functional API zu implementieren
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Vorhersage von Effekten mit LSTM mithilfe von Keras + Tensorflow Teil 2 (Berechnung mit GPU)
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Versuchen Sie, FX mit LSTM mithilfe von Keras + Tensorflow Teil 3 vorherzusagen (versuchen Sie, alle Parameter zu treffen).
Bilderkennung mit Keras
Lerne Zundokokiyoshi mit LSTM
Machen Sie einen idolartigen Tweet mit Keras LSTM (Satzgenerierung)
Versuchen Sie MNIST mit Mehrwertsteuer (Virtual Adversarial Training) mit Keras
CIFAR-10-Tutorial mit Keras
Versuchen Sie SNN mit BindsNET
Versuchen Sie eine Regression mit TensorFlow
Implementieren Sie LSTM AutoEncoder mit Keras
Versuchen Sie, den Boden durch Rekursion herauszufordern
Versuchen Sie die Funktionsoptimierung mit Optuna
Versuchen Sie es mit TensorFlow
Versuchen Sie, PythonTex mit Texpad zu verwenden.
Keras-Installation (von Anaconda verwendet)
Versuchen Sie die Kantenerkennung mit OpenCV
Versuchen Sie, RBM mit Chainer zu implementieren.
Multiple Regressionsanalyse mit Keras
Versuchen Sie Google Mock mit C.
Versuchen Sie es mit matplotlib mit PyCharm
Versuchen Sie, mit einer Shell zu programmieren!
Versuchen Sie die GUI-Programmierung mit Hy
Versuchen Sie Auto Encoder mit Pytorch
Probieren Sie die Python-Ausgabe mit Haxe 3.2 aus
Versuchen Sie die Matrixoperation mit NumPy
AutoEncodder-Notizen mit Keras
Word2vec mit Theano + Keras implementiert
Versuchen Sie, XOR mit PyTorch zu implementieren
Versuchen Sie, CNN mit ChainerRL auszuführen
Satzerzeugung mit GRU (Keras)
Probieren Sie verschiedene Dinge mit PhantomJS aus
Optimieren von Keras-Parametern mit Keras Tuner
Versuchen Sie Deep Learning mit FPGA
Versuchen Sie, Python mit Try Jupyter auszuführen
Versuchen Sie, Parfüm mit Go zu implementieren
Effizientes GAN mit Keras implementiert
Probieren Sie Selenium Grid mit Docker aus
Versuchen Sie die Gesichtserkennung mit Python
Probieren Sie OpenCV mit Google Colaboratory aus
Web Scraping Anfänger mit Python
Versuchen Sie es mit Kaggle leicht maschinell
Versuchen Sie, Jupyter Hub mit Docker zu erstellen
Versuchen Sie es mit Folium mit Anakonda
Bilderkennung mit Keras + OpenCV
[Verbesserte Version] Versuchen Sie MNIST mit Mehrwertsteuer (Virtual Adversarial Training) auf Keras