RNN (Recurrent Neural Network) Handledning: TensorFlow Exempel
โก Smart sammanfattning
ร terkommande neurala nรคtverk lรคgger till ett minnestillstรฅnd till vanliga neuroner och matar varje utdata tillbaka som nรคsta indata sรฅ att modellen kan lรคra sig av ordningen. Den hรคr genomgรฅngen bygger ett minnestillstรฅnd i TensorFlow och prognostiserar en tidsserie.
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 en Artificiellt neuralt nรคtverk รคr relativt enkelt och handlar huvudsakligen om matrismultiplikation. Under det fรถrsta steget multipliceras ingรฅngarna med initialt slumpmรคssiga vikter och bias, transformeras med en aktiveringsfunktion och utdatavรค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 inte tillrรคckligt litet. Optimeringssteget gรถrs iterativt tills felet minimeras, dvs. ingen mer information kan utlรคsas.tracted.
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)?
Ett รฅterkommande neuralt nรคtverk (RNN) รคr en klass av artificiella neurala 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รฅ liknande 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.
Tรคnk dig en enkel modell med endast en neuron som matas av en databatch. I ett traditionellt neuralt nรคtverk producerar modellen utdata genom att multiplicera indata med vikten och aktiveringsfunktionen. Med ett RNN skickas denna utdata tillbaka till sig sjรคlv ett antal gรฅnger. Vi kallar det. tidssteg den tid som utdata 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)
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.
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.
Versionsnotering: Koden i den hรคr handledningen riktar sig mot TensorFlow 1.x graf-API. Pรฅ TensorFlow 2.x kรถrs samma skript fortfarande efter import tensorflow.compat.v1 as tf plus tf.disable_v2_behavior(), eftersom platshรฅllare, sessioner och rnn_cell-modulen nu finns under tf.compat.v1Den idiomatiska 2.x-ekvivalenten รคr tf.keras.layers.SimpleRNN.
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.
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
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)
- Fรถregรฅende 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 insignaler frรฅn fรถregรฅende tidssteg. Det รคr sรฅ nรคtverket bygger sitt eget minne. Informationen frรฅn fรถregรฅende tidpunkt kan fortplanta sig i framtida tid. Detta รคr magin med det รฅterkommande neurala nรคtverket.
## 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]]
Fรถr att fรถrklara detta skriver du ut vรคrdena fรถr det fรถregรฅende tillstรฅndet. Utdata som skrivs ut ovan visar utdata frรฅn det senaste tillstรฅndet. Skriv nu ut all utdata, du kan se att tillstรฅnden รคr den fรถregรฅende utdatan fรถr varje batch. Det vill sรคga, den fรถregรฅende utdatan innehรฅller information om hela sekvensen.
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)
Den kommenterade vyn nedan delar upp samma utskrivna tensor batch fรถr batch.
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 utrymme fรถr fรถrbรคttring. 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 dรคrmed inte utdata. Dรคrfรถr kan ett nรคtverk som stรฅr infรถr ett problem med fรถrsvinnande gradienter inte konvergera mot en bra lรถsning.
Fรถrbรคttring LSTM
Fรถr att รถvervinna det potentiella problemet med fรถrsvinnande gradienter 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). Kortfattat fรถrser LSTM nรคtverket med relevant information frรฅn det fรถrflutna till en senare tid. Maskinen anvรคnder en bรคttre arkitektur fรถr att vรคlja och fรถra information tillbaka till en senare tidpunkt.
LSTM-arkitekturen finns tillgรคnglig i TensorFlow, tf.contrib.rnn.LSTMCell. LSTM omfattas inte av handledningen. Du kan hรคnvisa till den officiella dokumentation fรถr mer information
Pรฅ TensorFlow 2.x nรฅs den cellen som tf.compat.v1.nn.rnn_cell.LSTMCell, medan ny kod normalt anvรคnder tf.keras.layers.LSTM eller den tรคndare-grindade tf.keras.layers.GRU, vilket uppnรฅr jรคmfรถrbar noggrannhet med fรคrre parametrar.
RNN i tidsserier
I den hรคr handledningen fรถr TensorFlow RNN kommer du att anvรคnda ett 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. Idรฉn bakom tidsserieprognoser รค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()
Den hรถgra delen av grafen visar alla serier. Den startade frรฅn 2001 och slutar 2019. Det รคr meningslรถst att mata in all data i nรคtverket, istรคllet behรถver du skapa en databatch med en lรคngd som รคr 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 frรฅn en sekvens pรฅ 10 dagar och innehรฅlla 120 รฅterkommande neuroner. Du matar modellen med en inmatning, dvs. en dag. Du kan gรคrna รคndra vรคrdena fรถr att se om modellen fรถrbรคttrades.
Innan du konstruerar modellen mรฅste du dela upp datamรคngden i en tรฅguppsรคttning och en testuppsรคttning. Hela datamรคngden har 222 datapunkter; du kommer att anvรคnda de fรถrsta 201 punkterna fรถr att trรคna modellen och de sista 21 punkterna fรถr att testa din modell.
Nรคr du har definierat ett tรฅg och en testuppsรคttning mรฅste du skapa ett objekt som innehรฅller batcherna. I dessa batchar har du X-vรคrden och Y-vรคrden. Kom ihรฅg att X-vรคrdena รคr fรถrdrรถjda med en period. Dรคrfรถr anvรคnder du de fรถrsta 200 observationerna och tidssteget รคr lika med 10. X_batches-objektet ska innehรฅlla 20 batchar av storleken 10*1. y_batches har samma form som X_batches-objektet men med en period fรถre.
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 fรถrskjuta data till det antal gรฅnger du vill prognostisera. Om du till exempel vill fรถrutspรฅ en tid framรฅt, fรถrskjuter du serien med 1. Om du vill prognostisera tvรฅ dagar, fรถrskjuter du 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:
- Variabeln med tensorerna
- RNN
- 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.
Till exempel รคr tensorn X en platshรฅllare (se handledningen pรฅ Introduktion till TensorFlow 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 den fรถregรฅende handledningen om CNN, ditt mรฅl var att klassificera bilder, i den hรคr RNN-handledningen รคr mรฅlet nรฅgot annorlunda. Du ombeds att 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 finns det utrymme fรถr fรถrbรคttringar i modellen. Det รคr upp till dig att รคndra hyperparametrar som fรถnster, batchstorlek eller 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





