RNN (Recurrent Neural Network) -opetusohjelma: TensorFlow-esimerkki
Miksi tarvitsemme toistuvan hermoverkon (RNN)?
Recurrent Neural Network (RNN) mahdollistaa muistiyksikรถiden mallintamisen pysyviรค tietoja varten ja lyhytaikaisten riippuvuuksien mallintamisen. Sitรค kรคytetรครคn myรถs aikasarjaennusteissa tietojen korrelaatioiden ja kuvioiden tunnistamiseen. Se auttaa myรถs tuottamaan ennustavia tuloksia perรคkkรคisille tiedoille toimittamalla samanlaista kรคyttรคytymistรค kuin ihmisen aivot.
Keinotekoisen hermoverkon rakenne on suhteellisen yksinkertainen ja liittyy pรครคasiassa matriisikertomiseen. Ensimmรคisessรค vaiheessa tulot kerrotaan alun perin satunnaisilla painoilla ja bias, muunnetaan aktivointifunktiolla ja lรคhtรถarvoja kรคytetรครคn ennusteen tekemiseen. Tรคmรค vaihe antaa kรคsityksen siitรค, kuinka kaukana verkko on todellisuudesta.
Kรคytetty mittari on tappio. Mitรค suurempi hรคviรถfunktio, sitรค typerรคmpi malli on. Verkon tuntemuksen parantamiseksi tarvitaan jonkin verran optimointia sรครคtรคmรคllรค verkon painoja. Stokastinen gradienttilasku on menetelmรค, jota kรคytetรครคn painojen arvojen muuttamiseksi oikeaan suuntaan. Kun sรครคtรถ on tehty, verkko voi testata uutta tietoaan toisella tietoerรคllรค.
Virhe on onneksi pienempi kuin ennen, mutta ei kuitenkaan tarpeeksi pieni. Optimointivaihetta tehdรครคn iteratiivisesti, kunnes virhe on minimoitu, eli informaatiota ei voida poimia enempรครค.
Tรคmรคn tyyppisen mallin ongelmana on, ettรค siinรค ei ole muistia. Se tarkoittaa, ettรค tulo ja lรคhtรถ ovat riippumattomia. Toisin sanoen malli ei vรคlitรค siitรค, mitรค oli ennen. Se herรคttรครค kysymyksiรค, kun sinun tรคytyy ennustaa aikasarjoja tai lauseita, koska verkossa on oltava tietoa historiallisista tiedoista tai menneistรค sanoista.
Tรคmรคn ongelman ratkaisemiseksi on kehitetty uudenlainen arkkitehtuuri: Recurrent Neural network (RNN, jรคljempรคnรค)
Mikรค on toistuva hermoverkko (RNN)?
A Toistuva hermoverkko (RNN) on luokkaa Keinotekoinen hermoverkko jossa eri solmujen vรคlinen yhteys muodostaa suunnatun graafin antamaan ajallisen dynaamisen kรคyttรคytymisen. Se auttaa mallintamaan perรคkkรคistรค dataa, joka on johdettu myรถtรคkytkentรคverkoista. Se toimii samalla tavalla kuin ihmisen aivot ja tuottaa ennakoivia tuloksia.
Toistuva hermoverkko nรคyttรครค melko samanlaiselta kuin perinteinen hermoverkko, paitsi ettรค neuroneille lisรคtรครคn muistitila. Muistin lisรครคminen on yksinkertaista.
Kuvittele yksinkertainen malli, jossa vain yksi neuroni syรถttรครค dataerรคn. Perinteisessรค hermoverkossa malli tuottaa lรคhdรถn kertomalla syรถtteen painolla ja aktivointifunktiolla. RNN:llรค tรคmรค lรคhtรถ lรคhetetรครคn takaisin itselleen monta kertaa. Kutsumme aika askel aika, jonka lรคhdรถstรค tulee seuraavan matriisin kertolaskutulo.
Esimerkiksi alla olevassa kuvassa nรคet, ettรค verkko koostuu yhdestรค neuronista. Verkko laskee syรถtteen ja painon vรคliset matriisikertoimet ja lisรครค epรคlineaarisuuden aktivointifunktiolla. Siitรค tulee lรคhtรถ t-1:ssรค. Tรคmรค lรคhtรถ on toisen matriisikertolaskun tulo.

Alla koodaamme yksinkertaisen RNN:n TensorFlow'ssa ymmรคrtรครคksemme vaiheen ja myรถs lรคhdรถn muodon.
Verkko koostuu:
- Neljรค tuloa
- Kuusi neuronia
- 2-kertaiset askeleet
Verkko toimii alla olevan kuvan mukaisesti.
Verkkoa kutsutaan "toistuvaksi", koska se suorittaa saman toiminnon jokaisessa aktivointiruudussa. Verkko laski tulojen ja edellisen lรคhdรถn painot ennen aktivointitoiminnon kรคyttรถรค.
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
])
Voimme rakentaa verkon kรคyttรคmรคllรค paikkamerkkiรค datalle, toistuvalle vaiheelle ja ulostulolle.
- Mรครคritรค tiedoille paikkamerkki
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])
Tรคssรค:
- Ei mitรครคn: Tuntematon ja kestรครค erรคn koon
- n_timesteps: Kuinka monta kertaa verkko lรคhettรครค ulostulon takaisin neuroniin
- n_inputs: Syรถtteiden lukumรครคrรค erรครค kohti
- Mรครคritรค toistuva verkko
Kuten yllรค olevassa kuvassa mainittiin, verkko koostuu kuudesta neuronista. Verkko laskee kahden pisteen tuotteen:
- Syรถtรค tiedot ensimmรคisellรค painosarjalla (eli 6: yhtรค suuri kuin neuronien lukumรครคrรค)
- Edellinen tulos toisella painosarjalla (eli 6: vastaa tulosteiden mรครคrรครค)
Huomaa, ettรค ensimmรคisen myรถtรคkytkennรคn aikana edellisen lรคhdรถn arvot ovat nollia, koska arvoja ei ole saatavilla.
RNN:n luomisobjekti on tf.contrib.rnn.BasicRNNCell argumentilla num_units, joka mรครคrittรครค syรถtteiden mรครคrรคn
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
Nyt kun verkko on mรครคritetty, voit laskea lรคhdรถt ja tilat
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
Tรคmรค objekti kรคyttรครค sisรคistรค silmukkaa kertomaan matriisit sopivan mรครคrรคn kertoja.
Huomaa, ettรค toistuva neuroni on kaikkien edellisten aikavaiheiden syรถtteiden funktio. Nรคin verkko rakentaa oman muistinsa. Edellisen ajan tiedot voivat levitรค tulevassa ajassa. Tรคmรค on toistuvan hermoverkon taika
## 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]]
Selvitystarkoituksessa tulostat edellisen tilan arvot. Yllรค tulostettu tulos nรคyttรครค tulosteen viimeisestรค tilasta. Tulosta nyt kaikki tulosteet, voit huomata, ettรค tilat ovat kunkin erรคn edellinen tulos. Eli edellinen tulos sisรคltรครค tiedot koko sekvenssistรค.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)
Tulosteen muoto on (3, 2, 6):
- 3: Erien lukumรครคrรค
- 2: Aikavaiheen numero
- 6: Hermosolujen lukumรครคrรค
Toistuvan hermoverkon optimointi on identtinen perinteisen hermoverkon kanssa. Nรคet yksityiskohtaisemmin kuinka optimoida koodi tรคmรคn toistuvan hermoverkon opetusohjelman seuraavassa osassa.
RNN:n sovellukset
RNN:llรค on useita kรคyttรถtarkoituksia, varsinkin kun on kyse tulevaisuuden ennustamisesta. Rahoitusalalla RNN:stรค voi olla apua osakekurssien tai osakemarkkinoiden suunnan (eli positiivisen tai negatiivisen) merkkien ennustamisessa.
RNN on hyรถdyllinen autonomiselle autolle, koska se voi vรคlttรครค auto-onnettomuuden ennakoimalla ajoneuvon liikeradan.
RNN:tรค kรคytetรครคn laajalti tekstianalyysissรค, kuvien tekstityksissรค, tunneanalyysissรค ja konekรครคnnรถksissรค. Esimerkiksi elokuva-arvostelun avulla voidaan ymmรคrtรครค tunnetta, jonka katsoja koki elokuvan katsomisen jรคlkeen. Tรคmรคn tehtรคvรคn automatisointi on erittรคin hyรถdyllistรค, kun elokuvayhtiรถllรค ei ole tarpeeksi aikaa arvioida, merkitรค, yhdistรครค ja analysoida arvosteluja. Kone pystyy suorittamaan tyรถn korkeammalla tarkkuudella.
RNN:n rajoitukset
Teoriassa RNN:n oletetaan kuljettavan tietoa aikojaan. On kuitenkin melko haastavaa levittรครค kaikkea tรคtรค tietoa, kun aikavaihe on liian pitkรค. Kun verkossa on liian monta syvรครค kerrosta, siitรค tulee kouluttamaton. Tรคtรค ongelmaa kutsutaan: hรคviรคvรค kaltevuusongelma. Jos muistat, hermoverkko pรคivittรครค painon gradientin laskeutumisalgoritmin avulla. Gradientit pienenevรคt, kun verkko etenee alemmille tasoille.
Yhteenvetona voidaan todeta, ettรค gradientit pysyvรคt vakiona, mikรค tarkoittaa, ettรค parantamisen varaa ei ole. Malli oppii gradientin muutoksesta; tรคmรค muutos vaikuttaa verkon lรคhtรถรถn. Jos ero gradientissa on kuitenkin liian pieni (eli painot muuttuvat hieman), verkko ei voi oppia mitรครคn ja siten tulos. Siksi verkko, joka kohtaa katoavan gradienttiongelman, ei voi konvergoida kohti hyvรครค ratkaisua.
LSTM:n parannus
Kolme tutkijaa, Hochreiter, Schmidhuber ja Bengio, paransivat RNN:รครค arkkitehtuurilla, jota kutsutaan nimellรค Long Short-Term Memory (LSTM). Lyhyesti sanottuna LSMT tarjoaa verkolle relevanttia menneisyyttรค uudempaan aikaan. Kone kรคyttรครค parempaa arkkitehtuuria tietojen valitsemiseen ja siirtรคmiseen myรถhempรครคn aikaan.
LSTM-arkkitehtuuri on saatavilla TensorFlow:ssa, tf.contrib.rnn.LSTMCell. LSTM ei kuulu opetusohjelman piiriin. Voit viitata virkamiehelle dokumentointi lisรคtietoja
RNN aikasarjassa
Tรคssรค TensorFlow RNN -opetusohjelmassa kรคytรคt RNN:tรค aikasarjatietojen kanssa. Aikasarjat ovat riippuvaisia โโedellisestรค ajasta, mikรค tarkoittaa, ettรค aikaisemmat arvot sisรคltรคvรคt oleellista tietoa, josta verkko voi oppia. Aikasarjaennustuksen ideana on arvioida sarjan tuleva arvo, esimerkiksi osakekurssi, lรคmpรถtila, BKT ja niin edelleen.
Keras RNN:n ja aikasarjojen tietojen valmistelu voi olla hieman hankalaa. Ensinnรคkin tavoitteena on ennustaa sarjan seuraava arvo, mikรค tarkoittaa, ettรค kรคytรคt aiempia tietoja arvon estimoimiseen kohdassa t + 1. Tunniste on yhtรค suuri kuin syรถttรถsekvenssi ja siirretty jakso eteenpรคin. Toiseksi syรถtteiden mรครคrรคksi asetetaan 1, eli yksi havainto kerrallaan. Lopuksi aikaaskel on yhtรค suuri kuin numeerisen arvon sekvenssi. Jos esimerkiksi asetat aikaaskeleeksi 10, syรถttรถsekvenssi palauttaa kymmenen kertaa perรคkkรคin.
Katso alla olevaa kaaviota, olemme esittรคneet aikasarjadataa vasemmalla ja kuvitteellista syรถttรถsekvenssiรค oikealla. Luot funktion, joka palauttaa tietojoukon satunnaisella arvolla jokaiselle pรคivรคlle tammikuusta 2001 joulukuuhun 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)
ulostulo
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()
Kaavion oikea osa nรคyttรครค kaikki sarjat. Se alkoi vuodesta 2001 ja pรครคttyy vuonna 2019 Ei ole mitรครคn jรคrkeรค syรถttรครค kaikkea verkossa olevaa dataa, vaan sinun on luotava tietojoukko, jonka pituus on yhtรค pitkรค kuin aika-askel. Tรคmรค erรค on X-muuttuja. Y-muuttuja on sama kuin X, mutta siirtynyt yhdellรค jaksolla (ts. haluat ennustaa t+1).
Molemmilla vektoreilla on sama pituus. Nรคet sen yllรค olevan kaavion oikealla puolella. Viiva edustaa X-syรถtteen kymmentรค arvoa, kun taas punaiset pisteet ovat tunnisteen Y kymmentรค arvoa. Huomaa, ettรค tarra alkaa yhden pisteen X:n edellรค ja pรครคttyy yhden pisteen jรคlkeen.
Rakenna RNN ennustaaksesi aikasarjan TensorFlow'ssa
Nyt tรคssรค RNN-koulutuksessa on aika rakentaa ensimmรคinen RNN ennustaaksesi yllรค olevan sarjan. Sinun on mรครคritettรคvรค mallille joitain hyperparametreja (mallin parametrit, eli neuronien lukumรครคrรค jne.):
- Tulojen mรครคrรค: 1
- Aikaaskel (ikkunat aikasarjassa): 10
- Hermosolujen lukumรครคrรค: 120
- Tulosteiden mรครคrรค: 1
Verkkosi oppii 10 pรคivรคn jaksosta ja sisรคltรครค 120 toistuvaa neuronia. Syรถtรคt mallin yhdellรค syรถtteellรค eli yhdellรค pรคivรคllรค. Voit vapaasti muuttaa arvoja nรคhdรคksesi, onko malli parantunut.
Ennen mallin rakentamista sinun on jaettava tietojoukko junajoukoksi ja testijoukoksi. Koko tietojoukossa on 222 datapistettรค; kรคytรคt ensimmรคistรค 201 pistettรค mallin kouluttamiseen ja viimeiset 21 pistettรค mallin testaamiseen.
Kun olet mรครคrittรคnyt junan ja testijoukon, sinun on luotava erรคt sisรคltรคvรค objekti. Tรคssรค erรคssรค sinulla on X-arvot ja Y-arvot. Muista, ettรค X-arvot ovat yhden jakson jรคlkeen. Siksi kรคytรคt ensimmรคiset 200 havaintoa ja aikaaskel on 10. X_batches-objektin tulee sisรคltรครค 20 erรครค, joiden koko on 10*1. Y_batches-objektilla on sama muoto kuin X_batches-objektilla, mutta siinรค on yksi jakso eteenpรคin.
Vaihe 1) Luo juna ja testaa
Ensinnรคkin muutat sarjan a numpy joukko; sitten mรครคritรคt ikkunat (eli kuinka monta kertaa verkko oppii), syรถtteiden, lรคhdรถn ja junajoukon koon alla olevan TensorFlow RNN -esimerkin mukaisesti.
series = np.array(ts) n_windows = 20 n_input = 1 n_output = 1 size_train = 201
Sen jรคlkeen jaat taulukon kahdeksi tietojoukoksi.
## Split data train = series[:size_train] test = series[size_train:] print(train.shape, test.shape) (201,) (21,)
Vaihe 2) Luo funktio palauttamaan X_batches ja y_batches
Helpottaaksesi voit luoda funktion, joka palauttaa kaksi erilaista taulukkoa, yhden X_batchesille ja toisen y_batchesille.
Kirjoitetaan RNN TensorFlow -funktio erรคiden muodostamiseksi.
Huomaa, ettรค X erรคt ovat yhden jakson viiveellรค (otamme arvon t-1). Funktion tulosteen tulee olla kolmiulotteinen. Ensimmรคiset mitat vastaavat erien mรครคrรครค, toinen ikkunoiden kokoa ja viimeinen syรถtteiden lukumรครคrรครค.
Hankala osa on valita datapisteet oikein. X-datapisteille valitset havainnot vรคlillรค t = 1 - t =200, kun taas Y-datapisteelle palautat havainnot arvosta t = 2 arvoon 201. Kun sinulla on oikeat datapisteet, on helppo muotoilla uudelleen. sarja.
Jotta voit rakentaa objektin erien kanssa, sinun on jaettava tietojoukko kymmeneen yhtรค pitkรคksi erรคksi (eli 20). Voit kรคyttรครค uudelleenmuotoilumenetelmรครค ja ohittaa -1, jotta sarja on samanlainen kuin erรคkoko. Arvo 20 on havaintojen mรครคrรค erรครค kohti ja 1 on syรถtteiden lukumรครคrรค.
Sinun on tehtรคvรค sama vaihe, mutta etikettiรค varten.
Huomaa, ettรค sinun on siirrettรคvรค tietoja niin monta kertaa kuin haluat ennustaa. Jos esimerkiksi haluat ennustaa yhden ajan eteenpรคin, siirrรค sarjaa 1:llรค. Jos haluat ennustaa kaksi pรคivรครค, siirrรค tietoja kahdella.
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
Nyt kun funktio on mรครคritetty, voit kutsua sitรค luodaksesi erรคt alla olevan RNN-esimerkin mukaisesti.
X_batches, y_batches = create_batches(df = train,
windows = n_windows,
input = n_input,
output = n_output)
Voit tulostaa muodon varmistaaksesi, ettรค mitat ovat oikein.
print(X_batches.shape, y_batches.shape) (10, 20, 1) (10, 20, 1)
Sinun on luotava testisarja, jossa on vain yksi tietoerรค ja 20 havaintoa.
Huomaa, ettรค ennustat pรคivistรค toiseen, se tarkoittaa, ettรค toinen ennustettu arvo perustuu testitietojoukon ensimmรคisen pรคivรคn todelliseen arvoon (t+1). Itse asiassa todellinen arvo tiedetรครคn.
Jos haluat ennustaa t+2 (eli kaksi pรคivรครค eteenpรคin), sinun on kรคytettรคvรค ennustettua arvoa t+1; jos aiot ennustaa t+3 (kolme pรคivรครค eteenpรคin), sinun on kรคytettรคvรค ennustettua arvoa t+1 ja t+2. On jรคrkevรครค, ettรค on vaikea ennustaa tarkasti t+n pรคivรครค eteenpรคin.
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)
Selvรค, erรคkokosi on valmis, voit rakentaa RNN-arkkitehtuurin. Muista, ettรค sinulla on 120 toistuvaa neuronia.
Vaihe 3) Rakenna malli
Mallin luomiseksi sinun on mรครคritettรคvรค kolme osaa:
- Muuttuja tensoreiden kanssa
- RNN
- Hรคviรถ ja optimointi
Vaihe 3.1) Muuttujat
Sinun on mรครคritettรคvรค X- ja y-muuttujat sopivalla muodolla. Tรคmรค vaihe on triviaali. Tensorilla on sama ulottuvuus kuin objekteilla X_batches ja y_batches.
Esimerkiksi tensori X on paikkamerkki (Katso opetusohjelma kohdasta Johdanto Tensorflow virkistรครคksesi mieltรคsi muuttujamรครคrityksestรค) on kolme ulottuvuutta:
- Huomautus: erรคn koko
- n_windows: Ikkunoiden pituus. eli kuinka monta kertaa malli katsoo taaksepรคin
- n_input: Tulon mรครคrรค
Tulos on:
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])
Vaihe 3.2) Luo RNN
Tรคmรคn RNN TensorFlow -esimerkin toisessa osassa sinun on mรครคritettรคvรค verkon arkkitehtuuri. Kuten ennenkin, kรคytรคt TensorFlow-estimaattorin objektia BasicRNNCell ja dynamic_rnn.
## 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)
Seuraava osa on hieman hankalampi, mutta mahdollistaa nopeamman laskennan. Sinun on muutettava ajon tulos tiheรคksi kerrokseksi ja muutettava se sitten uudelleen niin, ettรค sillรค on sama mitta kuin tulolla.
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])
Vaihe 3.3) Luo menetys ja optimointi
Mallin optimointi riippuu suorittamastasi tehtรคvรคstรค. Edellisessรค opetusohjelmassa CNN, tavoitteesi oli luokitella kuvat, tรคssรค RNN-opetusohjelmassa tavoite on hieman erilainen. Sinua pyydetรครคn tekemรครคn ennuste jatkuvasta muuttujasta verrattuna luokkaan.
Tรคmรค ero on tรคrkeรค, koska se muuttaa optimointiongelman. Jatkuvan muuttujan optimointiongelma on minimoida keskineliรถvirhe. Nรคiden mittareiden muodostamiseksi TF:ssรค voit kรคyttรครค:
- tf.reduce_sum(tf.square(ulostulot โ y))
Loppuosa RNN-koodista on sama kuin ennen; kรคytรคt Adam-optimointiohjelmaa hรคviรถn vรคhentรคmiseksi (eli MSE):
- tf.train.AdamOptimizer(learning_rate=oppimisnopeus)
- optimoija.minimize(tappio)
Siinรค kaikki, voit pakata kaiken yhteen ja mallisi on valmis harjoitteluun.
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()
Harjoittelet mallia kรคyttรคmรคllรค 1500 jaksoa ja tulostat hรคviรถn joka 150. iteraatio. Kun malli on koulutettu, arvioit mallin testijoukossa ja luot objektin, joka sisรคltรครค ennusteet alla olevan Toistuvan hermoverkon esimerkin mukaisesti.
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
Viimeinkin tรคssรค RNN Deep Learning -opetusohjelmassa voit piirtรครค sarjan todellisen arvon ennustetulla arvolla. Jos malliasi korjataan, ennustetut arvot tulee laittaa todellisten arvojen pรครคlle.
Kuten nรคette, mallissa on parantamisen varaa. Sinun tehtรคvรคsi on muuttaa hyperparametrejรค, kuten ikkunoita, toistuvien hermosolujen lukumรครคrรคn erรคkokoa.
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()
Yhteenveto
Toistuva neuroverkko on vankka arkkitehtuuri, joka kรคsittelee aikasarjoja tai tekstianalyysiรค. Edellisen tilan tulos on palaute verkon muistin sรคilyttรคmiseksi ajan tai sanajonon aikana.
TensorFlow'ssa voit kรคyttรครค seuraavia koodeja kouluttaaksesi TensorFlow'n toistuvaa hermoverkkoa aikasarjoille:
Mallin parametrit
n_windows = 20 n_input = 1 n_output = 1 size_train = 201
Mรครคrittele malli
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])
Rakenna optimointi
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)
Harjoittele mallia
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})



