RNN (Recurrent Neural Network) Handledning: TensorFlow Exempel

Varfรถr behรถver vi ett รฅterkommande neuralt nรคtverk (RNN)?

Recurrent Neural Network (RNN) lรฅter dig modellera minnesenheter fรถr att bevara data och modellera kortsiktiga beroenden. Det anvรคnds ocksรฅ i tidsserieprognoser fรถr identifiering av datakorrelationer och mรถnster. Det hjรคlper ocksรฅ till att producera prediktiva resultat fรถr sekventiell data genom att leverera liknande beteende som en mรคnsklig hjรคrna.

Strukturen fรถr ett artificiellt neuralt nรคtverk รคr relativt enkel och handlar frรคmst om matrismultiplikation. Under det fรถrsta steget multipliceras indata med initialt slumpmรคssiga vikter, och bias, transformeras med en aktiveringsfunktion och utgรฅngsvรคrdena anvรคnds fรถr att gรถra en fรถrutsรคgelse. Detta steg ger en uppfattning om hur lรฅngt nรคtverket รคr frรฅn verkligheten.

Det mรฅtt som anvรคnds รคr fรถrlusten. Ju hรถgre fรถrlustfunktion, desto dummare รคr modellen. Fรถr att fรถrbรคttra kunskapen om nรคtverket krรคvs viss optimering genom att justera nรคtets vikter. Den stokastiska gradientnedgรฅngen รคr metoden som anvรคnds fรถr att รคndra vikternas vรคrden i rรคtt riktning. Nรคr justeringen รคr gjord kan nรคtverket anvรคnda ytterligare en sats data fรถr att testa sin nya kunskap.

Felet รคr lyckligtvis lรคgre รคn tidigare, men รคndรฅ inte tillrรคckligt litet. Optimeringssteget gรถrs iterativt tills felet minimeras, dvs ingen mer information kan extraheras.

Problemet med denna typ av modell รคr att den inte har nรฅgot minne. Det betyder att ingรฅngen och utgรฅngen รคr oberoende. Modellen bryr sig med andra ord inte om vad som kom innan. Det vรคcker vissa frรฅgor nรคr du behรถver fรถrutsรคga tidsserier eller meningar eftersom nรคtverket behรถver ha information om historiska data eller tidigare ord.

Fรถr att lรถsa detta problem har en ny typ av arkitektur utvecklats: Recurrent Neural Network (RNN hรคrefter)

Vad รคr ett รฅterkommande neuralt nรคtverk (RNN)?

A ร…terkommande neurala nรคtverk (RNN) รคr en klass av Artificiellt neuralt nรคtverk dรคr kopplingen mellan olika noder bildar en riktad graf fรถr att ge ett temporalt dynamiskt beteende. Det hjรคlper till att modellera sekventiell data som hรคrrรถr frรฅn feedforward-nรคtverk. Det fungerar pรฅ samma sรคtt som mรคnskliga hjรคrnor fรถr att leverera prediktiva resultat.

Ett รฅterkommande neuralt nรคtverk ser ganska likt ett traditionellt neuralt nรคtverk fรถrutom att ett minnestillstรฅnd lรคggs till neuronerna. Berรคkningen fรถr att inkludera ett minne รคr enkel.

Fรถrestรคll dig en enkel modell med bara en neuron som matas av en mรคngd data. I ett traditionellt neuralt nรคt producerar modellen utsignalen genom att multiplicera inmatningen med vikten och aktiveringsfunktionen. Med en RNN skickas denna utdata tillbaka till sig sjรคlv ett antal gรฅnger. Vi ringer tidssteg den tid som utgรฅngen blir indata fรถr nรคsta matrismultiplikation.

Pรฅ bilden nedan kan du till exempel se att nรคtverket bestรฅr av en neuron. Nรคtverket berรคknar matrismultiplikationen mellan ingรฅngen och vikten och lรคgger till icke-linjรคritet med aktiveringsfunktionen. Det blir utgรฅngen vid t-1. Denna utsignal รคr ingรฅngen fรถr den andra matrismultiplikationen.

ร…terkommande neurala nรคtverk (RNN)
ร…terkommande neurala nรคtverk (RNN)

Nedan kodar vi en enkel RNN i TensorFlow fรถr att fรถrstรฅ steget och รคven formen pรฅ utdata.

Nรคtverket bestรฅr av:

  • Fyra ingรฅngar
  • Sex neuroner
  • 2-gรฅngssteg

Nรคtverket kommer att fortsรคtta som bilden nedan visar.

ร…terkommande neurala nรคtverk (RNN)

Nรคtverket kallas "รฅterkommande" eftersom det utfรถr samma operation i varje aktiveringsruta. Nรคtverket berรคknade vikterna av ingรฅngarna och den tidigare utsignalen innan fรถr att anvรคnda 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 bygga nรคtverket med en platshรฅllare fรถr data, det รฅterkommande steget och utdata.

  1. Definiera platshรฅllaren fรถr data
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])

Hรคr:

  • Ingen: Okรคnd och kommer att ta storleken pรฅ batchen
  • n_timesteps: Antal gรฅnger nรคtverket kommer att skicka utdata tillbaka till neuronen
  • n_inputs: Antal input per batch
  1. Definiera det รฅterkommande nรคtverket

Som nรคmnts i bilden ovan bestรฅr nรคtverket av 6 neuroner. Nรคtverket kommer att berรคkna produkt med tvรฅ punkter:

  • Indata med den fรถrsta uppsรคttningen vikter (dvs 6: lika med antalet neuroner)
  • Tidigare utdata med en andra uppsรคttning vikter (dvs 6: motsvarande antalet utdata)

Observera att, under den fรถrsta feedforwarden, รคr vรคrdena fรถr fรถregรฅende utdata lika med nollor eftersom vi inte har nรฅgot tillgรคngligt vรคrde.

Objektet fรถr att bygga ett RNN รคr tf.contrib.rnn.BasicRNNCell med argumentet num_units fรถr att definiera antalet indata

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)

Nu nรคr nรคtverket รคr definierat kan du berรคkna utdata och tillstรฅnd

outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)

Detta objekt anvรคnder en intern loop fรถr att multiplicera matriserna ett lรคmpligt antal gรฅnger.

Observera att den รฅterkommande neuronen รคr en funktion av alla ingรฅngar frรฅn de tidigare tidsstegen. Sรฅ bygger nรคtverket sitt eget minne. Informationen frรฅn fรถregรฅende tid kan spridas i framtida tid. Detta รคr magin med รฅterkommande neurala nรคtverk

## 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]]

I fรถrklaringssyfte skriver du ut vรคrdena fรถr det tidigare tillstรฅndet. Utmatningen ovan visar utdata frรฅn det senaste tillstรฅndet. Skriv nu ut alla utdata, du kan mรคrka att tillstรฅnden รคr den fรถregรฅende utmatningen fรถr varje batch. Det vill sรคga, den fรถregรฅende utdatan innehรฅller informationen om hela 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)

ร…terkommande neurala nรคtverk (RNN)

Utgรฅngen har formen av (3, 2, 6):

  • 3: Antal partier
  • 2: Tidsstegets nummer
  • 6: Antal neuroner

Optimeringen av ett รฅterkommande neuralt nรคtverk รคr identiskt med ett traditionellt neuralt nรคtverk. Du kommer att se mer i detalj hur du kodar optimering i nรคsta del av denna sjรคlvstudie fรถr รฅterkommande neurala nรคtverk.

Tillรคmpningar av RNN

RNN har flera anvรคndningsomrรฅden, sรคrskilt nรคr det gรคller att fรถrutsรคga framtiden. Inom finansbranschen kan RNN vara till hjรคlp fรถr att fรถrutsรคga aktiekurser eller tecken pรฅ bรถrsriktningen (dvs. positiv eller negativ).

RNN รคr anvรคndbart fรถr en autonom bil eftersom det kan undvika en bilolycka genom att fรถrutse fordonets bana.

RNN anvรคnds flitigt inom textanalys, bildtextning, sentimentanalys och maskinรถversรคttning. Till exempel kan man anvรคnda en filmrecension fรถr att fรถrstรฅ kรคnslan รฅskรฅdaren upplevde efter att ha sett filmen. Att automatisera denna uppgift รคr mycket anvรคndbart nรคr filmbolaget inte har tillrรคckligt med tid att granska, mรคrka, konsolidera och analysera recensionerna. Maskinen kan gรถra jobbet med hรถgre noggrannhet.

Begrรคnsningar fรถr RNN

I teorin รคr RNN tรคnkt att bรคra informationen upp till tider. Det รคr dock ganska utmanande att sprida all denna information nรคr tidssteget รคr fรถr lรฅngt. Nรคr ett nรคtverk har fรถr mรฅnga djupa lager blir det otrรคningsbart. Detta problem kallas: fรถrsvinnande gradientproblem. Om du kommer ihรฅg uppdaterar det neurala nรคtverket vikten med algoritmen fรถr gradientnedstigning. Gradienterna blir mindre nรคr nรคtverket gรฅr ner till lรคgre lager.

Sammanfattningsvis fรถrblir gradienterna konstanta vilket innebรคr att det inte finns nรฅgot utrymme fรถr fรถrbรคttringar. Modellen lรคr sig av en fรถrรคndring i gradienten; denna fรถrรคndring pรฅverkar nรคtverkets utdata. Men om skillnaden i gradienten รคr fรถr liten (dvs vikterna รคndras lite) kan nรคtverket inte lรคra sig nรฅgonting och sรฅ resultatet. Dรคrfรถr kan ett nรคtverk som stรฅr infรถr ett fรถrsvinnande gradientproblem inte konvergera mot en bra lรถsning.

Fรถrbรคttring LSTM

Fรถr att รถvervinna den potentiella frรฅgan om fรถrsvinnande gradient som RNN stรฅr infรถr, fรถrbรคttrade tre forskare, Hochreiter, Schmidhuber och Bengio RNN med en arkitektur som kallas Long Short-Term Memory (LSTM). I korthet ger LSMT nรคtverket relevant tidigare information till nyare tid. Maskinen anvรคnder en bรคttre arkitektur fรถr att vรคlja och fรถra information tillbaka till senare tid.

LSTM-arkitektur รคr tillgรคnglig i TensorFlow, tf.contrib.rnn.LSTMCell. LSTM รคr utanfรถr handledningens omfattning. Du kan hรคnvisa till tjรคnstemannen dokumentation fรถr mer information

RNN i tidsserier

I den hรคr TensorFlow RNN-handledningen kommer du att anvรคnda en RNN med tidsseriedata. Tidsserier รคr beroende av tidigare tid, vilket innebรคr att tidigare vรคrden inkluderar relevant information som nรคtverket kan lรคra sig av. Tanken bakom tidsserieprediktion รคr att uppskatta det framtida vรคrdet av en serie, lรฅt oss sรคga aktiekurs, temperatur, BNP och sรฅ vidare.

Datafรถrberedelsen fรถr Keras RNN och tidsserier kan vara lite knepig. Fรถrst och frรคmst รคr mรฅlet att fรถrutsรคga nรคsta vรคrde i serien, vilket innebรคr att du kommer att anvรคnda den tidigare informationen fรถr att uppskatta vรคrdet till t + 1. Etiketten รคr lika med inmatningssekvensen och flyttas en period framรฅt. Fรถr det andra sรคtts antalet inmatningar till 1, dvs en observation per gรฅng. Slutligen รคr tidssteget lika med sekvensen av det numeriska vรคrdet. Om du till exempel stรคller in tidssteget till 10 kommer inmatningssekvensen tillbaka tio gรฅnger i fรถljd.

Titta pรฅ grafen nedan, vi har representerat tidsseriedata till vรคnster och en fiktiv inmatningssekvens till hรถger. Du skapar en funktion fรถr att returnera en datauppsรคttning med slumpmรคssigt vรคrde fรถr varje dag frรฅn januari 2001 till 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()

RNN i tidsserien

Den hรถgra delen av grafen visar alla serier. Det bรถrjade frรฅn 2001 och slutar 2019. Det รคr ingen mening att mata all data i nรคtverket, istรคllet mรฅste du skapa ett parti data med en lรคngd lika med tidssteget. Denna batch kommer att vara X-variabeln. Y-variabeln รคr densamma som X men fรถrskjuten med en period (dvs du vill prognostisera t+1).

Bรฅda vektorerna har samma lรคngd. Du kan se det i den hรถgra delen av grafen ovan. Linjen representerar de tio vรคrdena fรถr X-inmatningen, medan de rรถda prickarna รคr de tio vรคrdena fรถr etiketten, Y. Observera att etiketten bรถrjar en period fรถre X och slutar en period efter.

Bygg ett RNN fรถr att fรถrutsรคga tidsserier i TensorFlow

Nu i denna RNN-utbildning รคr det dags att bygga ditt fรถrsta RNN fรถr att fรถrutsรคga serien ovan. Du mรฅste ange nรฅgra hyperparametrar (modellens parametrar, dvs antal neuroner, etc.) fรถr modellen:

  • Antal ingรฅngar: 1
  • Tidssteg (fรถnster i tidsserier): 10
  • Antal neuroner: 120
  • Antal utdata: 1

Ditt nรคtverk kommer att lรคra sig av en sekvens pรฅ 10 dagar och innehรฅlla 120 รฅterkommande neuroner. Du matar modellen med en ingรฅng, dvs en dag. ร„ndra gรคrna vรคrdena fรถr att se om modellen fรถrbรคttrats.

Innan du konstruerar modellen mรฅste du dela upp datauppsรคttningen i en tรฅguppsรคttning och testuppsรคttning. Den fullstรคndiga datamรคngden har 222 datapunkter; du kommer att anvรคnda de fรถrsta 201 poรคngen fรถr att trรคna modellen och de sista 21 poรคngen fรถr att testa din modell.

Nรคr du har definierat ett tรฅg- och testset mรฅste du skapa ett objekt som innehรฅller satserna. I dessa partier har du X-vรคrden och Y-vรคrden. Kom ihรฅg att X-vรคrdena รคr en period fรถrdrรถjd. Dรคrfรถr anvรคnder du de fรถrsta 200 observationerna och tidssteget รคr lika med 10. X_batches-objektet ska innehรฅlla 20 batcher av storleken 10*1. y_batches har samma form som X_batches-objektet men med en punkt framรฅt.

Steg 1) Skapa tรฅget och testa

Fรถrst och frรคmst konverterar du serien till en numpy array; sedan definierar du fรถnstren (dvs. antalet gรฅnger nรคtverket kommer att lรคra sig av), antalet ingรฅngar, utdata och storleken pรฅ tรฅgsetet som visas i TensorFlow RNN-exemplet nedan.

series = np.array(ts)
n_windows = 20   
n_input =  1
n_output = 1
size_train = 201

Efter det delar du helt enkelt upp arrayen i tvรฅ datamรคngder.

## Split data
train = series[:size_train]
test = series[size_train:]
print(train.shape, test.shape)
(201,) (21,)

Steg 2) Skapa funktionen fรถr att returnera X_batches och y_batches

Fรถr att gรถra det enklare kan du skapa en funktion som returnerar tvรฅ olika arrayer, en fรถr X_batches och en fรถr y_batches.

Lรฅt oss skriva en RNN TensorFlow-funktion fรถr att konstruera satserna.

Observera att X-satserna รคr fรถrdrรถjda med en period (vi tar vรคrdet t-1). Funktionens utdata ska ha tre dimensioner. De fรถrsta mรฅtten motsvarar antalet partier, den andra storleken pรฅ fรถnstren och den sista รคr antalet inmatade.

Det knepiga รคr att vรคlja datapunkterna korrekt. Fรถr X-datapunkterna vรคljer du observationerna frรฅn t = 1 till t =200, medan fรถr Y-datapunkten returnerar du observationerna frรฅn t = 2 till 201. Nรคr du vรคl har rรคtt datapunkter รคr det enkelt att omforma serien.

Fรถr att konstruera objektet med satserna mรฅste du dela upp datasetet i tio satser av samma lรคngd (dvs. 20). Du kan anvรคnda omformningsmetoden och skicka -1 sรฅ att serien liknar batchstorleken. Vรคrdet 20 รคr antalet observationer per batch och 1 รคr antalet indata.

Du mรฅste gรถra samma steg utom fรถr etiketten.

Observera att du mรฅste flytta data till det antal gรฅnger du vill prognostisera. Om du till exempel vill fรถrutsรคga en tid framรฅt, flyttar du serien med 1. Om du vill prognostisera tvรฅ dagar, flytta sedan data 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 nรคr funktionen รคr definierad kan du anropa den fรถr att skapa batcherna som visas i nedanstรฅende RNN-exempel.

X_batches, y_batches = create_batches(df = train,
                                      windows = n_windows,
                                      input = n_input,
                                      output = n_output)

Du kan skriva ut formen fรถr att se till att mรฅtten รคr korrekta.

print(X_batches.shape, y_batches.shape)
(10, 20, 1) (10, 20, 1)

Du behรถver skapa testsetet med endast en batch data och 20 observationer.

Observera att du prognostiserar dagar efter dagar betyder att det andra fรถrutsagda vรคrdet kommer att baseras pรฅ det sanna vรคrdet fรถr den fรถrsta dagen (t+1) i testdatauppsรคttningen. Faktum รคr att det verkliga vรคrdet kommer att vara kรคnt.

Om du vill prognostisera t+2 (dvs tvรฅ dagar framรฅt), mรฅste du anvรคnda det fรถrutsagda vรคrdet t+1; om du ska fรถrutsรคga t+3 (tre dagar framรฅt), mรฅste du anvรคnda det fรถrutsagda vรคrdet t+1 och t+2. Det รคr logiskt att det รคr svรฅrt att fรถrutsรคga exakt t+n dagar framรฅt.

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)

Okej, din batchstorlek รคr klar, du kan bygga RNN-arkitekturen. Kom ihรฅg att du har 120 รฅterkommande neuroner.

Steg 3) Bygg modellen

Fรถr att skapa modellen mรฅste du definiera tre delar:

  1. Variabeln med tensorerna
  2. RNN
  3. Fรถrlusten och optimeringen

Steg 3.1) variabler

Du mรฅste ange X- och y-variablerna med lรคmplig form. Detta steg รคr trivialt. Tensorn har samma dimension som objekten X_batches och y_batches.

Tensor X รคr till exempel en platshรฅllare (kolla handledningen om Introduktion till Tensorflรถde fรถr att frรคscha upp ditt sinne om variabeldeklaration) har tre dimensioner:

  • Obs: satsens storlek
  • n_windows: Fรถnstrens lรคngd. dvs hur mรฅnga gรฅnger modellen tittar bakรฅt
  • n_input: Antal ingรฅngar

Resultatet รคr:

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])

Steg 3.2) Skapa RNN

I den andra delen av detta RNN TensorFlow-exempel mรฅste du definiera nรคtverkets arkitektur. Som tidigare anvรคnder du objektet BasicRNNCell och dynamic_rnn frรฅn 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)   

Nรคsta del รคr lite knepigare men mรถjliggรถr snabbare berรคkning. Du mรฅste omvandla kรถrutdata till ett tรคtt lager och sedan konvertera det igen fรถr att ha samma dimension som indata.

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])  

Steg 3.3) Skapa fรถrlusten och optimering

Modelloptimeringen beror pรฅ vilken uppgift du utfรถr. I fรถregรฅende handledning pรฅ CNN, ditt mรฅl var att klassificera bilder, i denna RNN-handledning รคr mรฅlet nรฅgot annorlunda. Du ombeds gรถra en fรถrutsรคgelse pรฅ en kontinuerlig variabel jรคmfรถrt med en klass.

Denna skillnad รคr viktig eftersom den kommer att fรถrรคndra optimeringsproblemet. Optimeringsproblemet fรถr en kontinuerlig variabel รคr att minimera medelkvadratfelet. Fรถr att konstruera dessa mรคtvรคrden i TF kan du anvรคnda:

  • tf.reduce_sum(tf.square(utgรฅngar โ€“ y))

Resten av RNN-koden รคr densamma som tidigare; du anvรคnder en Adam-optimerare fรถr att minska fรถrlusten (dvs. MSE):

  • tf.train.AdamOptimizer(learning_rate=learning_rate)
  • optimizer.minimize(fรถrlust)

Det รคr allt, du kan packa ihop allt och din modell รคr redo att trรคna.

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 kommer att trรคna modellen med 1500 epoker och skriva ut fรถrlusten var 150:e iteration. Nรคr modellen รคr trรคnad utvรคrderar du modellen pรฅ testsetet och skapar ett objekt som innehรฅller fรถrutsรคgelserna som visas i exemplet nedan fรถr รฅterkommande neurala nรคtverk.

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

ร„ntligen i denna RNN Deep Learning-handledning kan du plotta det faktiska vรคrdet av serien med det fรถrutsagda vรคrdet. Om din modell รคr korrigerad bรถr de fรถrutsagda vรคrdena lรคggas ovanpรฅ de faktiska vรคrdena.

Som du kan se har modellen utrymme fรถr fรถrbรคttringar. Det รคr upp till dig att รคndra hyperparametrarna som windows, batchstorleken pรฅ antalet รฅterkommande 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()
Prognos kontra faktisk

Prognos kontra faktisk

Sammanfattning

Ett รฅterkommande neuralt nรคtverk รคr en robust arkitektur fรถr att hantera tidsserier eller textanalys. Utsignalen frรฅn det tidigare tillstรฅndet รคr รฅterkoppling fรถr att bevara nรคtverkets minne รถver tid eller sekvens av ord.

I TensorFlow kan du anvรคnda fรถljande koder fรถr att trรคna ett TensorFlow Recurrent Neural Network fรถr tidsserier:

Modellens parametrar

n_windows = 20   
n_input =  1
n_output = 1
size_train = 201

Definiera 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])

Konstruera 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รคna 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})

Sammanfatta detta inlรคgg med: