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.

  • ๐Ÿ”˜ Minnesstatus: Varje รฅterkommande neuron tar emot den tidigare utsignalen tillsammans med ny insignal, vilket รคr det som ger nรคtverket dess tidsmรคssiga medvetenhet.
  • โ˜‘๏ธ Utdataform: En kรถrning av leksaksnรคtverket returnerar en (3, 2, 6) tensor: batcher, tidssteg och neuroner i den ordningen.
  • โœ… Batchningsregel: Tidsserieingรฅngar omformas till tre dimensioner och etikettmatrisen รคr samma serie fรถrskjuten en period framรฅt.
  • ๐Ÿงช Modellskelett: Platshรฅllare, en BasicRNNCell insvept i dynamic_rnn, en tรคt projektion, sedan medelkvadratfel med en Adam-optimerare.
  • ๐Ÿ› ๏ธ Trรคningspass: 1 500 epoker pรฅ 120 รฅterkommande neuroner minskar fรถrlusten frรฅn 502 893 till ungefรคr 1 385.
  • ๐Ÿ“‰ Kรคnd grรคns: Lรฅnga sekvenser utlรถser problemet med fรถrsvinnande gradienter, vilket LSTM och gated-varianter utformades fรถr att lรถsa.

RNN ร…terkommande neuralt nรคtverk

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.

Enskild รฅterkommande neuron som skickar sin utgรฅng vid t-1 tillbaka som ingรฅng fรถr nรคsta multiplikation

ร…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.

Utrullad RNN med fyra ingรฅngar, sex neuroner och tvรฅ tidssteg

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.

Annoterad RNN-utgรฅngstensor som mรคrker de tre batcherna, de sex neuronutgรฅngarna och (3, 2, 6)-formen

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

Genererade tidsserier till vรคnster och en tiostegstrรคningsinstans med fรถrskjutna mรฅl till hรถger

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:

  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.

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 plott med grรถna faktiska punkter och rรถda predikterade punkter

Prognos kontra faktisk

Vanliga frรฅgor

Bรถrja med ett fรถnster som tรคcker en hel cykel av mรถnstret och finjustera det sedan. Lรคngre fรถnster fรฅngar mer kontext men saktar ner trรคningen och fรถrvรคrrar gradientavklingningen. Tio steg fungerar fรถr den dagliga serien hรคr; veckovis sรคsongsvariation krรคver vanligtvis mer.

Ja, med en shim. Ersรคtt importen med tensorflow.compat.v1 och anropa disable_v2_behavior(), eftersom platshรฅllare, sessioner och rnn_cell flyttades under compat-namnrymden. Fรคrskt TensorFlow projekt bรถr anvรคnda tf.keras.layers.SimpleRNN istรคllet.

AI-assistenter fรถreslรฅr fรถnsterstorlekar, avvikelser i punktform fรถre en kรถrning och utkastar kod fรถr datainlรคsning frรฅn ett schema. De komprimerar trial-and-error-loopen som dominerar รฅterkommande modellarbete, รคven om de slutliga hyperparametervalen fortfarande behรถver valideras pรฅ utelรคmnad data.

Copilot hanterar repetitiv scaffolding bra: sessionsblock, flรถdesordbรถcker och periodisk fรถrlustutskrift. Tensorformer och etikettfรถrskjutning รคr fortfarande den riskabla delen, sรฅ bekrรคfta alltid batchdimensionerna sjรคlv innan du litar pรฅ en genererad loop.

ร…terkommande lager fรถrvรคntar sig (batch, tidssteg, funktion). Omformningen till (-1, fรถnster, indata) anger fรถr ramverket hur mรฅnga sekvenser som finns, hur lรฅngt tillbaka varje sekvens ser ut och hur mรฅnga vรคrden som anlรคnder per steg. En saknad dimension ger upphov till ett rangfel.

LSTM anvรคnder tre grindar plus ett separat celltillstรฅnd; GRU slรฅr samman glรถm- och ingรฅngsgrindarna och tar bort celltillstรฅndet. GRU trรคnas snabbare med fรคrre parametrar, medan LSTM ofta ligger i framkant vid mycket lรฅnga beroenden.

Kontinuerliga prognoser minimerar medelkvadratfelet, vilket den hรคr genomgรฅngen gรถr med reduce_sum av kvadrerade residualer. Sekvensklassificering, sรฅsom sentimentetiketter eller bilduppgifter som tรคcks i CNN handledning, anvรคnder korsentropi istรคllet.

Transformatorer dominerar sprรฅkarbete eftersom uppmรคrksamhet parallelliseras รถver en sekvens. ร…terkommande modeller รคr fortfarande konkurrenskraftiga fรถr strรถmmande signaler, korta univariata prognoser och enheter med lรฅgt minne, dรคr bearbetning ett steg i taget รคr en fรถrdel snarare รคn en flaskhals.

Sammanfatta detta inlรคgg med: