Knižnica keras¶
Knižnica keras
poskytuje jednotné rozhranie pre vytváranie modelov neurónových sietí rôznych architektúr. Pri vytváraní a učení modelu budeme zvyčajne postupovať podľa nasledujúcich krokov:
- Načítanie trénovacích a testovacích dát v podobe
numpy
polí. - Vytvorenie modelu neurónovej siete.
- Voľba optimalizačnej metódy a príprava modelu na učenie (kompilácia).
- Učenie modelu na trénovacích dátach.
- Vyhodnotenie modelu na testovacích dátach.
Viac informácií o knižnici keras
nájdete tu (v angličtine).
Načítanie dát¶
keras
poskytuje príklady dátových množín pre základné typy úloh. V nasledujúcom príklade načítame dátovú množinu Boston Housing, ktorá popisuje predaj nehnuteľností na predmestiach Bostonu. Dátová množina obsahuje 13 vstupných atribútov, ktoré popisujú napr. mieru kriminality, dopravné spojenie a služby v danej časti mesta. Cieľový atribút je číselný a popisuje priemernú cenu nehnuteľnosti.
from tensorflow.keras.datasets import boston_housing
# načítame dáta z dátovej množiny do `numpy` polí, dáta sú priamo rozdelené na vstupné a výstupné atribúty
# a trénovaciu a testovaciu množinu, aby bolo možné zreplikovať rovnaké rozdelenie dát, je potrebné nastaviť
# inicializáciu náhodných čísel (`seed`)
(x_train, y_train), (x_test, y_test) = boston_housing.load_data(seed=1234)
Dáta majú tvar (počet trénovacích/testovacích príkladov x počet vstupných/výstupných atribútov).
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)
Vytvorenie modelu¶
Základný model doprednej neurónovej siete je možné vytvoriť sekvenčným prepojením jednotlivých vrstiev. Sekvenčný model je reprezentovaný objektom Sequential
, do ktorého je možné pridať jednotlivé vrstvy. Základný typ vrstvy vytvára úplné prepojenie s predchádzajúcou vrstvou. V nasledujúcom príklade vytvoríme model s jednou skrytou vrstvou s 10 neurónmi a jednou výstupnou vrstvou s jedným výstupom pre cieľový atribút.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
# pre prvú vrstvu je potrebné zadať aj počet vstupov `input_dim`
# ako aktivačnú funkciu na skrytej vrstve definujeme hyperbolický tangens `tanh`
model.add(Dense(10, input_dim=13, activation='tanh'))
# pre regresiu nastavíme lineárnu výstupnú aktivačnú funkciu
# veľkosť priamo udáva počet výstupov (1)
model.add(Dense(1, activation='linear'))
Pomocou metódy summary
je možné vypísať štruktúru modelu vrátane počtu parametrov.
model.summary()
Inicializácia váh¶
Váhy je možné inicializovať pomocou objektov z modulu keras.initializers
. Pre základnú vrstvu doprednej siete je možné inicializovať samostatne váhy vstupov a váhy biasu.
from tensorflow.keras import initializers
# váhy pre vstupy inicializujeme podľa Glorot inicializácie (nastavíme inicializáciu náhodného generátora `seed`)
# váhy pre bias (konštantný vstup s hodnotou 1) nastavíme na 0
layer = Dense(10,
input_dim=13, kernel_initializer=initializers.glorot_normal(seed=1234),
bias_initializer=initializers.Zeros())
# skrátene môžeme zadať aj reťazec s názvom inicializátora (v tomto prípade sa použijú prednastavené hodnoty
# argumentov inicializátora)
layer = Dense(10,
input_dim=13, kernel_initializer="glorot_normal",
bias_initializer="zeros")
Konfigurácia optimalizačnej metódy¶
Knižnica keras
definuje v module keras.optimizers
rôzne typy optimalizačných metód. Typ SGD
implementuje základnú metódu stochastického gradientového zostupu.
from tensorflow.keras.optimizers import SGD
sgd = SGD(0.01) # parameter určuje rýchlosť učenia
# pred učením je potrebné model skompilovať pre danú optimalizačnú metódu
# pri kompilácii je potrebné vybrať optimalizovanú chybovú funkciu (pre regresiu priemernú kvadratický chybu
# `mean_squared_error`), voliteľne je možné zvoliť aj ďalšie metriky, ktoré sa vyhodnotia počas učenia na
# trénovacích dátach (napr. priemernú absolútnu chybu `mean_absolute_error`)
model.compile(loss='mean_squared_error', optimizer=sgd, metrics=['mean_absolute_error'])
Po skompilovaní je možné model naučiť metódou fit
. Ako argumenty je potrebné určiť počet epoch (argument epochs
) a počet príkladov, ktoré sa zahrnú do výpočtu gradientu pri každom kroku batch_size
.
f = model.fit(x_train, y_train, epochs=25, batch_size=10)
Priebeh učenia si môžeme vizualizovať pomocou knižnice matplotlib
.
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(1)
plt.subplot(211)
plt.plot(f.history['loss'])
plt.subplot(212)
p = plt.plot(f.history['mean_absolute_error'])
Testovanie modelu¶
Model je možné otestovať na testovacej množine príkladov pomocou metódy evaluate
. Výsledok je pole, ktoré obsahuje hodnotu chybovej funkcie a všetkých metrík definovaných pri kompilácii modelu vyhodnotených na testovacej množine.
scores = model.evaluate(x_test, y_test)
print('MSE: {:.4f}, MAE: {:.4f}'.format(scores[0], scores[1]))