RNN (Recurrent Neural Network) Tutorial: TensorFlow Eksempel
Hvorfor har vi brug for et tilbagevendende neuralt netvรฆrk (RNN)?
Recurrent Neural Network (RNN) giver dig mulighed for at modellere hukommelsesenheder til at bevare data og modellere kortsigtede afhรฆngigheder. Det bruges ogsรฅ i tidsserieprognoser til identifikation af datakorrelationer og -mรธnstre. Det hjรฆlper ogsรฅ med at producere prรฆdiktive resultater for sekventielle data ved at levere lignende adfรฆrd som en menneskelig hjerne.
Strukturen af โโet kunstigt neuralt netvรฆrk er relativt enkel og handler hovedsageligt om matrixmultiplikation. I lรธbet af det fรธrste trin multipliceres inputs med initialt tilfรฆldige vรฆgte, og bias transformeres med en aktiveringsfunktion, og outputvรฆrdierne bruges til at lave en forudsigelse. Dette trin giver en idรฉ om, hvor langt netvรฆrket er fra virkeligheden.
Den anvendte metrik er tabet. Jo hรธjere tabsfunktion, jo dummere er modellen. For at forbedre kendskabet til netvรฆrket krรฆves der en vis optimering ved at justere nettets vรฆgte. Den stokastiske gradientnedstigning er den metode, der anvendes til at รฆndre vรฆgtens vรฆrdier i den rigtige retning. Nรฅr justeringen er foretaget, kan netvรฆrket bruge endnu en batch af data til at teste sin nye viden.
Fejlen er heldigvis lavere end fรธr, men alligevel ikke lille nok. Optimeringstrinnet udfรธres iterativt, indtil fejlen er minimeret, dvs. der ikke kan udtrรฆkkes mere information.
Problemet med denne type model er, at den ikke har nogen hukommelse. Det betyder, at input og output er uafhรฆngige. Modellen er med andre ord ligeglad med, hvad der kom fรธr. Det rejser nogle spรธrgsmรฅl, nรฅr du skal forudsige tidsserier eller sรฆtninger, fordi netvรฆrket skal have information om de historiske data eller tidligere ord.
For at lรธse dette problem er der udviklet en ny type arkitektur: Recurrent Neural Network (RNN herefter)
Hvad er et tilbagevendende neuralt netvรฆrk (RNN)?
A Recurrent Neural Network (RNN) er en klasse af Kunstigt neuralt netvรฆrk hvor forbindelsen mellem forskellige noder danner en rettet graf for at give en tidsmรฆssig dynamisk adfรฆrd. Det hjรฆlper med at modellere sekventielle data, der stammer fra feedforward-netvรฆrk. Det fungerer pรฅ samme mรฅde som menneskelige hjerner til at levere forudsigelige resultater.
Et tilbagevendende neuralt netvรฆrk ligner et traditionelt neuralt netvรฆrk, bortset fra at en hukommelsestilstand tilfรธjes til neuronerne. Beregningen for at inkludere en hukommelse er enkel.
Forestil dig en simpel model med kun รฉn neuron, der fรธdes af en batch af data. I et traditionelt neuralt net producerer modellen outputtet ved at gange inputtet med vรฆgten og aktiveringsfunktionen. Med en RNN sendes dette output tilbage til sig selv et antal gange. Vi ringer tidstrin den tid, outputtet bliver input til den nรฆste matrixmultiplikation.
For eksempel, pรฅ billedet nedenfor, kan du se netvรฆrket er sammensat af en neuron. Netvรฆrket beregner matrixmultiplikationen mellem input og vรฆgt og tilfรธjer ikke-linearitet med aktiveringsfunktionen. Det bliver udgangen ved t-1. Dette output er input til den anden matrixmultiplikation.

Nedenfor koder vi en simpel RNN i TensorFlow for at forstรฅ trinnet og ogsรฅ formen pรฅ outputtet.
Netvรฆrket er sammensat af:
- Fire indgange
- Seks neuroner
- 2-gange trin
Netvรฆrket fortsรฆtter som vist pรฅ billedet nedenfor.
Netvรฆrket kaldes 'tilbagevendende', fordi det udfรธrer den samme operation i hver aktiveret firkant. Netvรฆrket beregnede vรฆgten af โโinput og det tidligere output fรธr for at bruge en aktiveringsfunktion.
import numpy as np
import tensorflow as tf
n_inputs = 4
n_neurons = 6
n_timesteps = 2
The data is a sequence of a number from 0 to 9 and divided into three batches of data.
## Data
X_batch = np.array([
[[0, 1, 2, 5], [9, 8, 7, 4]], # Batch 1
[[3, 4, 5, 2], [0, 0, 0, 0]], # Batch 2
[[6, 7, 8, 5], [6, 5, 4, 2]], # Batch 3
])
Vi kan bygge netvรฆrket med en pladsholder for data, det tilbagevendende trin og output.
- Definer pladsholderen for dataene
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])
Her:
- Ingen: Ukendt og vil tage stรธrrelsen pรฅ batchen
- n_timesteps: Antal gange netvรฆrket vil sende output tilbage til neuronen
- n_inputs: Antal input pr. batch
- Definer det tilbagevendende netvรฆrk
Som nรฆvnt pรฅ billedet ovenfor er netvรฆrket sammensat af 6 neuroner. Netvรฆrket vil beregne produkt med to prikker:
- Inputdata med det fรธrste sรฆt vรฆgte (dvs. 6: lig med antallet af neuroner)
- Tidligere output med et andet sรฆt vรฆgte (dvs. 6: svarende til antallet af output)
Bemรฆrk, at under den fรธrste feedforward, er vรฆrdierne af det forrige output lig med nuller, fordi vi ikke har nogen vรฆrdi tilgรฆngelig.
Objektet til at bygge et RNN er tf.contrib.rnn.BasicRNNCell med argumentet num_units for at definere antallet af input
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
Nu hvor netvรฆrket er defineret, kan du beregne output og tilstande
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
Dette objekt bruger en intern slรธjfe til at gange matricerne det passende antal gange.
Bemรฆrk, at det tilbagevendende neuron er en funktion af alle input fra de foregรฅende tidstrin. Sรฅdan bygger netvรฆrket sin egen hukommelse. Oplysningerne fra forrige gang kan forplante sig i fremtidig tid. Dette er magien ved tilbagevendende neurale netvรฆrk
## Define the shape of the tensor
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])
## Define the network
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
outputs_val = outputs.eval(feed_dict={X: X_batch})
print(states.eval(feed_dict={X: X_batch}))
[[ 0.38941205 -0.9980438 0.99750966 0.7892596 0.9978241 0.9999997 ]
[ 0.61096436 0.7255889 0.82977575 -0.88226104 0.29261455 -0.15597084]
[ 0.62091285 -0.87023467 0.99729395 -0.58261937 0.9811445 0.99969864]]
Til forklaringsformรฅl udskriver du vรฆrdierne for den tidligere tilstand. Outputtet trykt ovenfor viser output fra den sidste tilstand. Udskriv nu alt output, du kan bemรฆrke, at tilstandene er det forrige output for hver batch. Det vil sige, at det forrige output indeholder informationen om hele sekvensen.e
print(outputs_val)
print(outputs_val.shape)
[[[-0.75934666 -0.99537754 0.9735819 -0.9722234 -0.14234993
-0.9984044 ]
[ 0.99975264 -0.9983206 0.9999993 -1. -0.9997506
-1. ]]
[[ 0.97486496 -0.98773265 0.9969686 -0.99950117 -0.7092863
-0.99998885]
[ 0.9326837 0.2673438 0.2808514 -0.7535883 -0.43337247
0.5700631 ]]
[[ 0.99628735 -0.9998728 0.99999213 -0.99999976 -0.9884324
-1. ]
[ 0.99962527 -0.9467421 0.9997403 -0.99999714 -0.99929446
-0.9999795 ]]]
(3, 2, 6)
Outputtet har formen (3, 2, 6):
- 3: Antal partier
- 2: Nummer pรฅ tidstrinnet
- 6: Antal neuroner
Optimeringen af โโet tilbagevendende neuralt netvรฆrk er identisk med et traditionelt neuralt netvรฆrk. Du vil se mere detaljeret, hvordan du koder optimering i den nรฆste del af denne tutorial om tilbagevendende neuralt netvรฆrk.
Ansรธgninger af RNN
RNN har flere anvendelser, isรฆr nรฅr det kommer til at forudsige fremtiden. I den finansielle industri kan RNN vรฆre behjรฆlpelig med at forudsige aktiekurser eller tegnet pรฅ aktiemarkedets retning (dvs. positiv eller negativ).
RNN er nyttigt for en autonom bil, da det kan undgรฅ en bilulykke ved at forudse kรธretรธjets bane.
RNN er meget brugt i tekstanalyse, billedtekstning, sentimentanalyse og maskinoversรฆttelse. For eksempel kan man bruge en filmanmeldelse til at forstรฅ den fรธlelse, tilskueren opfattede efter at have set filmen. Automatisering af denne opgave er meget nyttig, nรฅr filmselskabet ikke har tid nok til at gennemgรฅ, mรฆrke, konsolidere og analysere anmeldelserne. Maskinen kan udfรธre arbejdet med en hรธjere grad af nรธjagtighed.
Begrรฆnsninger af RNN
I teorien formodes RNN at bรฆre informationen op til tider. Det er dog ret udfordrende at udbrede al denne information, nรฅr tidstrinnet er for langt. Nรฅr et netvรฆrk har for mange dybe lag, bliver det utrรฆneligt. Dette problem kaldes: forsvindende gradientproblem. Hvis du husker det, opdaterer det neurale netvรฆrk vรฆgten ved hjรฆlp af gradient descent-algoritmen. Gradienterne bliver mindre, nรฅr netvรฆrket gรฅr ned til lavere lag.
Som konklusion forbliver gradienterne konstante, hvilket betyder, at der ikke er plads til forbedringer. Modellen lรฆrer af en รฆndring i gradienten; denne รฆndring pรฅvirker netvรฆrkets output. Men hvis forskellen i gradienten er for lille (dvs. vรฆgten รฆndrer sig lidt), kan netvรฆrket ikke lรฆre noget, og sรฅ outputtet. Derfor kan et netvรฆrk, der stรฅr over for et forsvindende gradientproblem, ikke konvergere mod en god lรธsning.
Forbedring LSTM
For at overvinde det potentielle problem med forsvindende gradient, som RNN stรฅr over for, forbedrede tre forskere, Hochreiter, Schmidhuber og Bengio RNN med en arkitektur kaldet Long Short-Term Memory (LSTM). Kort sagt giver LSMT netvรฆrket relevant tidligere information til nyere tid. Maskinen bruger en bedre arkitektur til at vรฆlge og transportere information tilbage til senere tid.
LSTM-arkitektur er tilgรฆngelig i TensorFlow, tf.contrib.rnn.LSTMCell. LSTM er uden for selvstudiets omfang. Du kan henvise til embedsmanden dokumentation for mere information
RNN i tidsserier
I denne TensorFlow RNN-tutorial skal du bruge en RNN med tidsseriedata. Tidsserier er afhรฆngige af tidligere tid, hvilket betyder, at tidligere vรฆrdier inkluderer relevant information, som netvรฆrket kan lรฆre af. Ideen bag forudsigelse af tidsserier er at estimere den fremtidige vรฆrdi af en serie, lad os sige aktiekurs, temperatur, BNP og sรฅ videre.
Dataforberedelsen til Keras RNN og tidsserier kan vรฆre en lille smule vanskelig. Fรธrst og fremmest er mรฅlet at forudsige den nรฆste vรฆrdi af serien, hvilket betyder, at du vil bruge den tidligere information til at estimere vรฆrdien ved t + 1. Etiketten er lig med inputsekvensen og flyttet en periode frem. For det andet sรฆttes antallet af input til 1, dvs. รฉn observation pr. gang. Endelig er tidstrinnet lig med rรฆkkefรธlgen af โโden numeriske vรฆrdi. For eksempel, hvis du indstiller tidstrinnet til 10, vil inputsekvensen returnere ti pรฅ hinanden fรธlgende gange.
Se pรฅ grafen nedenfor, vi har reprรฆsenteret tidsseriedata til venstre og en fiktiv inputsekvens til hรธjre. Du opretter en funktion til at returnere et datasรฆt med tilfรฆldig vรฆrdi for hver dag fra januar 2001 til december 2016
# To plot pretty figures
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
def create_ts(start = '2001', n = 201, freq = 'M'):
rng = pd.date_range(start=start, periods=n, freq=freq)
ts = pd.Series(np.random.uniform(-18, 18, size=len(rng)), rng).cumsum()
return ts
ts= create_ts(start = '2001', n = 192, freq = 'M')
ts.tail(5)
Produktion
2016-08-31 -93.459631 2016-09-30 -95.264791 2016-10-31 -95.551935 2016-11-30 -105.879611 2016-12-31 -123.729319 Freq: M, dtype: float64
ts = create_ts(start = '2001', n = 222)
# Left
plt.figure(figsize=(11,4))
plt.subplot(121)
plt.plot(ts.index, ts)
plt.plot(ts.index[90:100], ts[90:100], "b-", linewidth=3, label="A training instance")
plt.title("A time series (generated)", fontsize=14)
# Right
plt.subplot(122)
plt.title("A training instance", fontsize=14)
plt.plot(ts.index[90:100], ts[90:100], "b-", markersize=8, label="instance")
plt.plot(ts.index[91:101], ts[91:101], "bo", markersize=10, label="target", markerfacecolor='red')
plt.legend(loc="upper left")
plt.xlabel("Time")
plt.show()
Den hรธjre del af grafen viser alle serier. Det startede fra 2001 og slutter i 2019. Det giver ingen mening at fodre alle data i netvรฆrket, i stedet skal du oprette en batch af data med en lรฆngde svarende til tidstrinnet. Denne batch vil vรฆre X-variablen. Y-variablen er den samme som X, men forskudt med รฉn periode (dvs. du รธnsker at forudsige t+1).
Begge vektorer har samme lรฆngde. Du kan se det i hรธjre del af ovenstรฅende graf. Linjen reprรฆsenterer de ti vรฆrdier af X-inputtet, mens de rรธde prikker er de ti vรฆrdier af etiketten, Y. Bemรฆrk, at etiketten starter en periode foran X og slutter en periode efter.
Byg en RNN til at forudsige tidsserier i TensorFlow
Nu i denne RNN-trรฆning er det tid til at bygge dit fรธrste RNN til at forudsige serien ovenfor. Du skal angive nogle hyperparametre (modellens parametre, dvs. antal neuroner osv.) for modellen:
- Antal input: 1
- Tidstrin (vinduer i tidsserier): 10
- Antal neuroner: 120
- Antal output: 1
Dit netvรฆrk vil lรฆre af en sekvens pรฅ 10 dage og indeholde 120 tilbagevendende neuroner. Du fodrer modellen med รฉt input, dvs. รฉn dag. Du er velkommen til at รฆndre vรฆrdierne for at se, om modellen er blevet bedre.
Fรธr du konstruerer modellen, skal du opdele datasรฆttet i et togsรฆt og testsรฆt. Det fulde datasรฆt har 222 datapunkter; du skal bruge de fรธrste 201 point til at trรฆne modellen og de sidste 21 point til at teste din model.
Nรฅr du har defineret et tog- og testsรฆt, skal du oprette et objekt, der indeholder batchene. I denne batches har du X-vรฆrdier og Y-vรฆrdier. Husk, at X-vรฆrdierne er en periode forsinket. Derfor bruger du de fรธrste 200 observationer og tidstrinnet er lig med 10. X_batches objektet skal indeholde 20 batches af stรธrrelsen 10*1. y_batches har samme form som X_batches objektet, men med en periode forud.
Trin 1) Opret toget og test
Fรธrst og fremmest konverterer du serien til en bedรธvet matrix; derefter definerer du vinduerne (dvs. antallet af gange netvรฆrket vil lรฆre af), antallet af input, output og stรธrrelsen pรฅ togsรฆttet som vist i TensorFlow RNN-eksemplet nedenfor.
series = np.array(ts) n_windows = 20 n_input = 1 n_output = 1 size_train = 201
Derefter opdeler du simpelthen arrayet i to datasรฆt.
## Split data train = series[:size_train] test = series[size_train:] print(train.shape, test.shape) (201,) (21,)
Trin 2) Opret funktionen til at returnere X_batches og y_batches
For at gรธre det nemmere kan du oprette en funktion, der returnerer to forskellige arrays, en for X_batches og en for y_batches.
Lad os skrive en RNN TensorFlow-funktion til at konstruere batchene.
Bemรฆrk, at X-batcherne er forsinket med รฉn periode (vi tager vรฆrdien t-1). Funktionens output skal have tre dimensioner. De fรธrste dimensioner svarer til antallet af partier, den anden stรธrrelsen af โโvinduerne og den sidste er antallet af input.
Den vanskelige del er at vรฆlge datapunkterne korrekt. For X-datapunkterne vรฆlger du observationerne fra t = 1 til t =200, mens du for Y-datapunktet returnerer observationerne fra t = 2 til 201. Nรฅr fรธrst du har de rigtige datapunkter, er det ligetil at omforme serien.
For at konstruere objektet med batcherne skal du opdele datasรฆttet i ti batches af samme lรฆngde (dvs. 20). Du kan bruge omformningsmetoden og sende -1, sรฅ serien svarer til batchstรธrrelsen. Vรฆrdien 20 er antallet af observationer pr. batch og 1 er antallet af input.
Du skal gรธre det samme trin undtagen for etiketten.
Bemรฆrk, at du skal flytte dataene til det antal gange, du vil prognose. For eksempel, hvis du vil forudsige รฉn tid frem, sรฅ flytter du serien med 1. Hvis du vil forudse to dage, skal du flytte dataene med 2.
x_data = train[:size_train-1]: Select all the training instance minus one day
X_batches = x_data.reshape(-1, windows, input): create the right shape for the batch e.g (10, 20, 1)
def create_batches(df, windows, input, output):
## Create X
x_data = train[:size_train-1] # Select the data
X_batches = x_data.reshape(-1, windows, input) # Reshape the data
## Create y
y_data = train[n_output:size_train]
y_batches = y_data.reshape(-1, windows, output)
return X_batches, y_batches
Nu hvor funktionen er defineret, kan du kalde den for at oprette batcherne som vist i nedenstรฅende RNN-eksempel.
X_batches, y_batches = create_batches(df = train,
windows = n_windows,
input = n_input,
output = n_output)
Du kan udskrive formen for at sikre dig, at dimensionerne er korrekte.
print(X_batches.shape, y_batches.shape) (10, 20, 1) (10, 20, 1)
Du skal oprette testsรฆttet med kun รฉn batch af data og 20 observationer.
Bemรฆrk, at du forudsiger dage efter dage, betyder det, at den anden forudsagte vรฆrdi vil vรฆre baseret pรฅ den sande vรฆrdi af den fรธrste dag (t+1) af testdatasรฆttet. Faktisk vil den sande vรฆrdi vรฆre kendt.
Hvis du รธnsker at forudsige t+2 (dvs. to dage frem), skal du bruge den forudsagte vรฆrdi t+1; hvis du skal forudsige t+3 (tre dage frem), skal du bruge den forudsagte vรฆrdi t+1 og t+2. Det giver mening, at det er svรฆrt at forudsige prรฆcist t+n dage frem.
X_test, y_test = create_batches(df = test, windows = 20,input = 1, output = 1) print(X_test.shape, y_test.shape) (10, 20, 1) (10, 20, 1)
Okay, din batchstรธrrelse er klar, du kan bygge RNN-arkitekturen. Husk, du har 120 tilbagevendende neuroner.
Trin 3) Byg modellen
For at oprette modellen skal du definere tre dele:
- Variablen med tensorerne
- RNN
- Tabet og optimeringen
Trin 3.1) Variabler
Du skal angive X- og y-variablerne med den passende form. Dette trin er trivielt. Tensoren har samme dimension som objekterne X_batches og y_batches.
For eksempel er tensoren X en pladsholder (tjek selvstudiet om Introduktion til Tensorflow for at genopfriske dit sind om variabel deklaration) har tre dimensioner:
- Bemรฆrk: batchens stรธrrelse
- n_windows: Lรฆngde pรฅ vinduerne. dvs. antallet af gange, modellen kigger bagud
- n_input: Antal input
Resultatet er:
tf.placeholder(tf.float32, [None, n_windows, n_input])
## 1. Construct the tensors X = tf.placeholder(tf.float32, [None, n_windows, n_input]) y = tf.placeholder(tf.float32, [None, n_windows, n_output])
Trin 3.2) Opret RNN
I den anden del af dette RNN TensorFlow-eksempel skal du definere netvรฆrkets arkitektur. Som fรธr bruger du objektet BasicRNNCell og dynamic_rnn fra TensorFlow estimator.
## 2. create the model basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu) rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
Den nรฆste del er en smule vanskeligere, men tillader hurtigere beregning. Du skal transformere kรธrselsoutputtet til et tรฆt lag og derefter konvertere det igen for at have samme dimension som inputtet.
stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron]) stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output) outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output])
Trin 3.3) Skab tabet og optimeringen
Modeloptimeringen afhรฆnger af den opgave, du udfรธrer. I den forrige tutorial vedr CNN, dit mรฅl var at klassificere billeder, i denne RNN-tutorial er mรฅlet lidt anderledes. Du bliver bedt om at lave en forudsigelse pรฅ en kontinuert variabel sammenlignet med en klasse.
Denne forskel er vigtig, fordi den vil รฆndre optimeringsproblemet. Optimeringsproblemet for en kontinuert variabel er at minimere den gennemsnitlige kvadratiske fejl. For at konstruere disse metrics i TF kan du bruge:
- tf.reduce_sum(tf.square(output โ y))
Resten af โโRNN-koden er den samme som fรธr; du bruger en Adam optimizer til at reducere tabet (dvs. MSE):
- tf.train.AdamOptimizer(learning_rate=learning_rate)
- optimizer.minimize(tab)
Det er det, du kan pakke alt sammen, og din model er klar til at trรฆne.
tf.reset_default_graph() r_neuron = 120 ## 1. Construct the tensors X = tf.placeholder(tf.float32, [None, n_windows, n_input]) y = tf.placeholder(tf.float32, [None, n_windows, n_output]) ## 2. create the model basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu) rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32) stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron]) stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output) outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output]) ## 3. Loss + optimization learning_rate = 0.001 loss = tf.reduce_sum(tf.square(outputs - y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_op = optimizer.minimize(loss) init = tf.global_variables_initializer()
Du trรฆner modellen ved at bruge 1500 epoker og udskriver tabet hver 150 iterationer. Nรฅr modellen er trรฆnet, evaluerer du modellen pรฅ testsรฆttet og opretter et objekt, der indeholder forudsigelserne som vist i nedenstรฅende eksempel pรฅ Recurrent Neural Network.
iteration = 1500
with tf.Session() as sess:
init.run()
for iters in range(iteration):
sess.run(training_op, feed_dict={X: X_batches, y: y_batches})
if iters % 150 == 0:
mse = loss.eval(feed_dict={X: X_batches, y: y_batches})
print(iters, "\tMSE:", mse)
y_pred = sess.run(outputs, feed_dict={X: X_test})
0 MSE: 502893.34
150 MSE: 13839.129
300 MSE: 3964.835
450 MSE: 2619.885
600 MSE: 2418.772
750 MSE: 2110.5923
900 MSE: 1887.9644
1050 MSE: 1747.1377
1200 MSE: 1556.3398
1350 MSE: 1384.6113
Endelig i denne RNN Deep Learning-tutorial kan du plotte den faktiske vรฆrdi af serien med den forudsagte vรฆrdi. Hvis din model er rettet, skal de forudsagte vรฆrdier sรฆttes oven pรฅ de faktiske vรฆrdier.
Som du kan se, har modellen plads til forbedringer. Det er op til dig at รฆndre hyperparametrene som windows, batchstรธrrelsen af โโantallet af tilbagevendende neuroner.
plt.title("Forecast vs Actual", fontsize=14)
plt.plot(pd.Series(np.ravel(y_test)), "bo", markersize=8, label="Actual", color='green')
plt.plot(pd.Series(np.ravel(y_pred)), "r.", markersize=8, label="Forecast", color='red')
plt.legend(loc="lower left")
plt.xlabel("Time")
plt.show()
Resumรฉ
Et tilbagevendende neuralt netvรฆrk er en robust arkitektur til at hรฅndtere tidsserier eller tekstanalyse. Outputtet fra den tidligere tilstand er feedback for at bevare netvรฆrkets hukommelse over tid eller sekvens af ord.
I TensorFlow kan du bruge fรธlgende koder til at trรฆne et TensorFlow Recurrent Neural Network til tidsserier:
Parametre for modellen
n_windows = 20 n_input = 1 n_output = 1 size_train = 201
Definer modellen
X = tf.placeholder(tf.float32, [None, n_windows, n_input]) y = tf.placeholder(tf.float32, [None, n_windows, n_output]) basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu) rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32) stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron]) stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output) outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output])
Konstruer optimeringen
learning_rate = 0.001 loss = tf.reduce_sum(tf.square(outputs - y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_op = optimizer.minimize(loss)
Trรฆn modellen
init = tf.global_variables_initializer()
iteration = 1500
with tf.Session() as sess:
init.run()
for iters in range(iteration):
sess.run(training_op, feed_dict={X: X_batches, y: y_batches})
if iters % 150 == 0:
mse = loss.eval(feed_dict={X: X_batches, y: y_batches})
print(iters, "\tMSE:", mse)
y_pred = sess.run(outputs, feed_dict={X: X_test})



