Výukový program RNN (Recurrent Neural Network): Příklad TensorFlow

Proč potřebujeme rekurentní neuronovou síť (RNN)?

Rekurentní neuronová síť (RNN) vám umožňuje modelovat paměťové jednotky pro zachování dat a modelovat krátkodobé závislosti. Používá se také v prognózování časových řad pro identifikaci datových korelací a vzorů. Pomáhá také vytvářet prediktivní výsledky pro sekvenční data tím, že poskytuje podobné chování jako lidský mozek.

Struktura umělé neuronové sítě je poměrně jednoduchá a spočívá hlavně v násobení matic. Během prvního kroku jsou vstupy vynásobeny původně náhodnými váhami a vychýlení, transformované aktivační funkcí a výstupní hodnoty jsou použity k předpovědi. Tento krok poskytuje představu o tom, jak daleko je síť od reality.

Použitou metrikou je ztráta. Čím vyšší je ztrátová funkce, tím je model hloupější. Pro zlepšení znalostí sítě je nutná určitá optimalizace úpravou vah sítě. Stochastický gradient klesání je metoda používaná ke změně hodnot vah ve směru doprava. Jakmile je úprava provedena, může síť použít další dávku dat k testování svých nových znalostí.

Chyba je naštěstí nižší než dříve, ale ne dostatečně malá. Optimalizační krok se provádí iterativně, dokud není chyba minimalizována, tj. nelze extrahovat žádné další informace.

Problémem tohoto typu modelu je, že nemá žádnou paměť. To znamená, že vstup a výstup jsou nezávislé. Jinými slovy, model se nestará o to, co bylo předtím. Vyvolává to určitou otázku, když potřebujete předpovídat časové řady nebo věty, protože síť potřebuje mít informace o historických datech nebo minulých slovech.

K překonání tohoto problému byl vyvinut nový typ architektury: Recurrent Neural Network (dále RNN)

Co je to rekurentní neuronová síť (RNN)?

A Rekurentní neuronová síť (RNN) je třída Umělá neuronová síť ve kterém spojení mezi různými uzly tvoří směrovaný graf, který dává časové dynamické chování. Pomáhá modelovat sekvenční data, která jsou odvozena z dopředných sítí. Funguje podobně jako lidský mozek a poskytuje prediktivní výsledky.

Rekurentní neuronová síť vypadá docela podobně jako tradiční neuronová síť, kromě toho, že k neuronům je přidán stav paměti. Výpočet pro zahrnutí paměti je jednoduchý.

Představte si jednoduchý model s pouze jedním neuronem napájeným dávkou dat. V tradiční neuronové síti model vytváří výstup vynásobením vstupu váhou a aktivační funkcí. U RNN je tento výstup poslán zpět sobě samému kolikrát. voláme časový krok doba, po kterou se výstup stane vstupem dalšího násobení matice.

Například na obrázku níže můžete vidět, že síť se skládá z jednoho neuronu. Síť vypočítá násobení matic mezi vstupem a váhou a přidá nelinearitu s aktivační funkcí. Stane se výstupem v t-1. Tento výstup je vstupem druhého násobení matice.

Rekurentní neuronová síť (RNN)
Rekurentní neuronová síť (RNN)

Níže kódujeme jednoduchý RNN v TensorFlow, abychom pochopili krok a také tvar výstupu.

Síť se skládá z:

  • Čtyři vstupy
  • Šest neuronů
  • 2-násobné kroky

Síť bude probíhat tak, jak je znázorněno na obrázku níže.

Rekurentní neuronová síť (RNN)

Síť se nazývá 'rekurentní', protože provádí stejnou operaci v každém aktivačním čtverci. Síť před použitím aktivační funkce vypočítala váhy vstupů a předchozího výstupu.

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

Můžeme vytvořit síť se zástupným symbolem pro data, rekurentní stupeň a výstup.

  1. Definujte zástupný symbol pro data
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])

Zde:

  • Žádný: Neznámý a bude mít velikost dávky
  • n_timesteps: Kolikrát síť pošle výstup zpět neuronu
  • n_inputs: Počet vstupů na dávku
  1. Definujte opakující se síť

Jak je uvedeno na obrázku výše, síť se skládá ze 6 neuronů. Síť vypočítá součin dvou teček:

  • Vstupní data s první sadou vah (tj. 6: rovno počtu neuronů)
  • Předchozí výstup s druhou sadou vah (tj. 6: odpovídající počtu výstupů)

Všimněte si, že během prvního dopředného kanálu se hodnoty předchozího výstupu rovnají nulám, protože nemáme k dispozici žádnou hodnotu.

Objekt pro vytvoření RNN je tf.contrib.rnn.BasicRNNCell s argumentem num_units pro definování počtu vstupů

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

Nyní, když je síť definována, můžete vypočítat výstupy a stavy

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

Tento objekt používá vnitřní smyčku k vynásobení matic odpovídajícím počtem opakování.

Všimněte si, že rekurentní neuron je funkcí všech vstupů z předchozích časových kroků. Takto si síť buduje vlastní paměť. Informace z předchozího času se mohou šířit v budoucím čase. To je kouzlo rekurentní neuronové sítě

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

Pro účely vysvětlení vytisknete hodnoty předchozího stavu. Výstup vytištěný výše ukazuje výstup z posledního stavu. Nyní vytiskněte celý výstup, můžete si všimnout, že stavy jsou předchozím výstupem každé dávky. To znamená, že předchozí výstup obsahuje informace o celé sekvenci.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)

Rekurentní neuronová síť (RNN)

Výstup má tvar (3, 2, 6):

  • 3: Počet šarží
  • 2: Číslo časového kroku
  • 6: Počet neuronů

Optimalizace rekurentní neuronové sítě je totožná s tradiční neuronovou sítí. Podrobněji uvidíte, jak optimalizovat kód v další části tohoto tutoriálu Recurrent Neuron Network.

Aplikace RNN

RNN má mnohostranné využití, zejména pokud jde o předpovídání budoucnosti. Ve finančním průmyslu může být RNN užitečné při předpovídání cen akcií nebo znamení směru akciového trhu (tj. kladného nebo záporného).

RNN je užitečné pro autonomní auto, protože se může vyhnout dopravní nehodě tím, že předvídá trajektorii vozidla.

RNN je široce používán v textové analýze, popisování obrázků, analýze sentimentu a strojovém překladu. Například filmovou recenzi lze použít k pochopení pocitu, který divák po zhlédnutí filmu vnímal. Automatizace tohoto úkolu je velmi užitečná, když filmová společnost nemá dostatek času na přezkoumání, označení, konsolidaci a analýzu recenzí. Stroj může dělat práci s vyšší úrovní přesnosti.

Omezení RNN

Teoreticky má RNN přenášet informace až do nekonečna. Je však poměrně náročné šířit všechny tyto informace, když je časový krok příliš dlouhý. Když má síť příliš mnoho hlubokých vrstev, stává se netrénovatelnou. Tento problém se nazývá: mizející problém s gradientem. Pokud si pamatujete, neuronová síť aktualizuje váhu pomocí gradientu sestupného algoritmu. Gradienty se zmenšují, když síť postupuje dolů do nižších vrstev.

Závěrem lze říci, že gradienty zůstávají konstantní, což znamená, že není prostor pro zlepšení. Model se učí ze změny gradientu; tato změna ovlivní výkon sítě. Pokud je však rozdíl v gradientu příliš malý (tj. váhy se trochu změní), síť se nemůže nic naučit a tím i výstup. Proto síť čelící problému mizejícího gradientu nemůže konvergovat k dobrému řešení.

Vylepšení LSTM

K překonání potenciálního problému mizejícího gradientu, kterému čelí RNN, tři výzkumníci, Hochreiter, Schmidhuber a Bengio, vylepšili RNN architekturou nazvanou Long Short-Term Memory (LSTM). Stručně řečeno, LSMT poskytuje síti relevantní minulé informace do novější doby. Stroj používá lepší architekturu k výběru a přenosu informací zpět do pozdější doby.

Architektura LSTM je dostupná v TensorFlow, tf.contrib.rnn.LSTMCell. LSTM je mimo rozsah výukového programu. Můžete se obrátit na úředníka dokumentace další informace

RNN v časové řadě

V tomto tutoriálu TensorFlow RNN budete používat RNN s daty časové řady. Časové řady jsou závislé na předchozím čase, což znamená, že minulé hodnoty zahrnují relevantní informace, ze kterých se síť může učit. Myšlenkou predikce časové řady je odhadnout budoucí hodnotu řady, řekněme cenu akcií, teplotu, HDP a tak dále.

Příprava dat pro Keras RNN a časové řady může být trochu složitější. Za prvé, cílem je předpovědět další hodnotu řady, což znamená, že použijete minulé informace k odhadu hodnoty v t + 1. Označení se rovná vstupní sekvenci a je posunuto o jednu periodu dopředu. Za druhé, počet vstupů je nastaven na 1, tj. jedno pozorování za čas. Nakonec se časový krok rovná posloupnosti číselné hodnoty. Pokud například nastavíte časový krok na 10, vstupní sekvence se vrátí desetkrát za sebou.

Podívejte se na graf níže, nalevo jsme znázornili data časové řady a napravo fiktivní vstupní sekvenci. Vytvoříte funkci pro vrácení datové sady s náhodnou hodnotou pro každý den od ledna 2001 do prosince 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)

Výstup

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 v časové řadě

V pravé části grafu jsou zobrazeny všechny řady. Začalo to v roce 2001 a skončí v roce 2019 Nemá smysl dodávat všechna data v síti, místo toho musíte vytvořit dávku dat o délce rovné časovému kroku. Tato dávka bude proměnná X. Proměnná Y je stejná jako X, ale je posunuta o jedno období (tj. chcete předpovídat t+1).

Oba vektory mají stejnou délku. Můžete to vidět v pravé části výše uvedeného grafu. Řádek představuje deset hodnot vstupu X, zatímco červené tečky představují deset hodnot štítku Y. Všimněte si, že štítek začíná jednu tečku před X a končí jednu tečku poté.

Vytvořte RNN pro předpovídání časových řad v TensorFlow

Nyní v tomto tréninku RNN je čas postavit si svůj první RNN, abyste mohli předpovídat sérii výše. Musíte zadat některé hyperparametry (parametry modelu, tj. počet neuronů atd.) pro model:

  • Počet vstupů: 1
  • Časový krok (okna v časové řadě): 10
  • Počet neuronů: 120
  • Počet výstupů: 1

Vaše síť se bude učit ze sekvence 10 dnů a bude obsahovat 120 opakujících se neuronů. Nakrmíte model jedním vstupem, tj. jeden den. Neváhejte změnit hodnoty, abyste viděli, zda se model zlepšil.

Před vytvořením modelu musíte rozdělit datovou sadu na vlakovou a testovací sadu. Úplný datový soubor má 222 datových bodů; prvních 201 bodů použijete k trénování modelu a posledních 21 bodů k otestování modelu.

Poté, co definujete vlakovou a testovací sadu, musíte vytvořit objekt obsahující dávky. V těchto dávkách máte hodnoty X a hodnoty Y. Pamatujte, že hodnoty X jsou zpožděné o jednu periodu. Proto použijete prvních 200 pozorování a časový krok je roven 10. Objekt X_batches by měl obsahovat 20 dávek o velikosti 10*1. y_batches má stejný tvar jako objekt X_batches, ale s jednou tečkou dopředu.

Krok 1) Vytvořte vlak a vyzkoušejte

Nejprve převedete řadu na a otupělý pole; poté definujete okna (tj. počet časů, kdy se síť bude učit), počet vstupů, výstupů a velikost vlakové soupravy, jak je znázorněno v příkladu TensorFlow RNN níže.

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

Poté pole jednoduše rozdělíte na dvě datové sady.

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

Krok 2) Vytvořte funkci, která vrátí X_batches a y_batches

Aby to bylo jednodušší, můžete vytvořit funkci, která vrací dvě různá pole, jedno pro X_batches a druhé pro y_batches.

Pojďme napsat funkci RNN TensorFlow pro konstrukci dávek.

Všimněte si, že dávky X jsou zpožděny o jednu periodu (bereme hodnotu t-1). Výstup funkce by měl mít tři rozměry. První rozměr se rovná počtu dávek, druhý rozměru oken a poslední počet vstupů.

Ošemetná část je správně vybrat datové body. Pro datové body X zvolíte pozorování od t = 1 do t = 200, zatímco pro datový bod Y vrátíte pozorování od t = 2 do 201. Jakmile máte správné datové body, je snadné je přetvořit série.

Chcete-li vytvořit objekt s dávkami, musíte datovou sadu rozdělit do deseti dávek stejné délky (tj. 20). Můžete použít metodu reshape a předat -1, aby série byla podobná velikosti dávky. Hodnota 20 je počet pozorování na dávku a 1 je počet vstupů.

Musíte udělat stejný krok, ale pro štítek.

Všimněte si, že je třeba posunout data na tolikrát, kolikrát chcete prognózovat. Pokud například chcete předpovídat jeden čas dopředu, posunete řadu o 1. Pokud chcete předpovídat dva dny, posuňte data o 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

Nyní, když je funkce definována, můžete ji zavolat k vytvoření dávek, jak je znázorněno v níže uvedeném příkladu RNN.

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

Tvar můžete vytisknout, abyste se ujistili, že rozměry jsou správné.

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

Musíte vytvořit testovací sadu pouze s jednou dávkou dat a 20 pozorováními.

Všimněte si, že předpovídáte dny po dnech, to znamená, že druhá předpokládaná hodnota bude založena na skutečné hodnotě prvního dne (t+1) testovací datové sady. Ve skutečnosti bude známa skutečná hodnota.

Pokud chcete předpovídat t+2 (tj. dva dny dopředu), musíte použít předpovídanou hodnotu t+1; pokud budete předpovídat t+3 (tři dny dopředu), musíte použít předpovídanou hodnotu t+1 a t+2. Dává to smysl, že je obtížné přesně předpovědět t+n dní dopředu.

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)

Dobře, velikost vaší dávky je připravena, můžete vytvořit architekturu RNN. Pamatujte, že máte 120 opakujících se neuronů.

Krok 3) Sestavte model

Chcete-li vytvořit model, musíte definovat tři části:

  1. Proměnná s tenzory
  2. RNN
  3. Ztráta a optimalizace

Krok 3.1) Proměnné

Je třeba zadat proměnné X a y s příslušným tvarem. Tento krok je triviální. Tenzor má stejný rozměr jako objekty X_batches a y_batches.

Například tenzor X je zástupný symbol (podívejte se na tutoriál Úvod do tenzorový tok pro osvěžení mysli ohledně deklarace proměnné) má tři rozměry:

  • Poznámka: velikost šarže
  • n_windows: Délka oken. tj. kolikrát se model dívá dozadu
  • n_input: Číslo vstupu

Výsledek je:

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

Krok 3.2) Vytvořte RNN

Ve druhé části tohoto příkladu RNN TensorFlow musíte definovat architekturu sítě. Stejně jako dříve použijete objekt BasicRNNCell a dynamic_rnn z estimátoru TensorFlow.

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

Další část je trochu složitější, ale umožňuje rychlejší výpočet. Musíte transformovat výstup běhu na hustou vrstvu a poté ji znovu převést, aby měla stejný rozměr jako vstup.

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

Krok 3.3) Vytvořte ztrátu a optimalizaci

Optimalizace modelu závisí na úloze, kterou provádíte. V předchozím tutoriálu na CNN, vaším cílem bylo klasifikovat obrázky, v tomto tutoriálu RNN je cíl mírně odlišný. Jste požádáni, abyste provedli předpověď pro spojitou proměnnou ve srovnání s třídou.

Tento rozdíl je důležitý, protože změní problém optimalizace. Optimalizačním problémem pro spojitou proměnnou je minimalizace střední kvadratické chyby. Chcete-li vytvořit tyto metriky v TF, můžete použít:

  • tf.reduce_sum(tf.square(výstupy – y))

Zbývající kód RNN je stejný jako dříve; používáte optimalizátor Adam ke snížení ztráty (tj. MSE):

  • tf.train.AdamOptimizer(learning_rate=learning_rate)
  • optimalizátor.minimalizovat (ztráta)

To je vše, můžete vše zabalit dohromady a váš model je připraven k tréninku.

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

Budete trénovat model pomocí 1500 epoch a tisknout ztrátu každých 150 iterací. Jakmile je model trénován, vyhodnotíte model na testovací sadě a vytvoříte objekt obsahující předpovědi, jak je znázorněno v níže uvedeném příkladu rekurentní neuronové sítě.

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

Konečně v tomto tutoriálu RNN Deep Learning můžete vykreslit skutečnou hodnotu série s předpokládanou hodnotou. Pokud je váš model opraven, předpokládané hodnoty by měly být umístěny nad skutečné hodnoty.

Jak vidíte, model má co zlepšovat. Je na vás, abyste změnili hyperparametry, jako jsou okna, velikost dávky počtu rekurentních neuronů.

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()
Předpověď vs skutečnost

Předpověď vs skutečnost

Shrnutí

Rekurentní neuronová síť je robustní architektura pro práci s časovými řadami nebo textovou analýzou. Výstupem předchozího stavu je zpětná vazba pro zachování paměti sítě v průběhu času nebo sekvence slov.

V TensorFlow můžete použít následující kódy k trénování rekurentní neuronové sítě TensorFlow pro časové řady:

Parametry modelu

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

Definujte model

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

Vytvořte optimalizaci

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énujte model

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