Výukový program umělé neuronové sítě s příklady TensorFlow ANN
Co je to umělá neuronová síť?
An Umělá neuronová síť (ANN) je počítačový systém inspirovaný biologickými neuronovými sítěmi pro vytváření umělých mozků založených na sběru propojených jednotek nazývaných umělé neurony. Je navržen tak, aby analyzoval a zpracovával informace jako lidé. Umělá neuronová síť má schopnosti samoučení, které poskytuje lepší výsledky, protože je k dispozici více dat.

Umělá neuronová síť (ANN) se skládá ze čtyř hlavních objektů:
- Vrstvy: veškeré učení probíhá ve vrstvách. K dispozici jsou 3 vrstvy 1) Vstup, 2) Skrytá a 3) Výstupní
- Funkce a štítek: Vstupní data do sítě (funkce) a výstup ze sítě (štítky)
- Ztrátová funkce: Metrika používaná k odhadu výkonu fáze učení
- Optimalizátor: Zlepšete učení aktualizací znalostí v síti
Neuronová síť vezme vstupní data a vloží je do souboru vrstev. Síť potřebuje vyhodnotit svůj výkon pomocí funkce ztráty. Ztrátová funkce dává síti představu o cestě, kterou musí projít, než si osvojí znalosti. Síť potřebuje zlepšit své znalosti pomocí optimalizátoru.
Pokud se podíváte na obrázek výše, pochopíte základní mechanismus.
Program vezme nějaké vstupní hodnoty a vloží je do dvou plně propojených vrstev. Představte si, že máte matematický problém, první věc, kterou uděláte, je přečíst si odpovídající kapitolu a problém vyřešit. Aplikujete své nové znalosti k vyřešení problému. Je velká šance, že nebudete moc dobře skórovat. Pro síť je to stejné. Když poprvé uvidí data a provede předpověď, nebude se dokonale shodovat se skutečnými daty.
Pro zlepšení znalostí síť používá optimalizátor. V naší analogii lze optimalizátor považovat za přečtení kapitoly. Opětovným čtením získáte nové poznatky/lekci. Podobně síť používá optimalizátor, aktualizuje své znalosti a testuje své nové znalosti, aby zjistila, kolik se ještě potřebuje učit. Program bude tento krok opakovat, dokud neudělá nejmenší možnou chybu.
V naší analogii s matematickými úlohami to znamená, že čtete kapitolu učebnice mnohokrát, dokud důkladně neporozumíte obsahu kurzu. Pokud i po přečtení vícekrát budete dělat chyby, znamená to, že jste s aktuálním materiálem dosáhli znalostní kapacity. Ke zlepšení skóre musíte použít jinou učebnici nebo vyzkoušet jinou metodu. U neuronové sítě je to stejný proces. Pokud chyba není ani zdaleka 100 %, ale křivka je plochá, znamená to se současnou architekturou; nemůže se naučit nic jiného. Síť musí být lépe optimalizována pro zlepšení znalostí.
Nervová síť Architecture
Umělá neuronová síť Architecture se skládá z následujících komponent:
- Vrstvy
- Aktivační funkce
- Ztrátová funkce
- Optimalizátor
Vrstvy
Vrstva je místo, kde probíhá veškeré učení. Uvnitř vrstvy je nekonečné množství závaží (neuronů). Typická neuronová síť je často zpracovávána hustě propojenými vrstvami (nazývanými také plně propojené vrstvy). To znamená, že všechny vstupy jsou připojeny k výstupu.
Typická neuronová síť bere vektor vstupu a skalár, který obsahuje popisky. Nejpohodlnější nastavení je binární klasifikace pouze se dvěma třídami: 0 a 1.
Síť vezme vstup, pošle ho do všech připojených uzlů a vypočítá signál s a aktivace funkce.

Obrázek výše ukazuje tuto myšlenku. První vrstva je vstupními hodnotami pro druhou vrstvu, nazývanou skrytá vrstva, přijímá vážený vstup z předchozí vrstvy
- Prvním uzlem jsou vstupní hodnoty
- Neuron se rozloží na vstupní část a aktivační funkci. Levá část přijímá veškerý vstup z předchozí vrstvy. Pravá část je součtem vstupů přecházejících do aktivační funkce.
- Výstupní hodnota vypočítaná ze skrytých vrstev a použitá k předpovědi. Pro klasifikaci se rovná počtu tříd. Pro regresi se předpovídá pouze jedna hodnota.
Aktivační funkce
Aktivační funkce uzlu definuje výstup daný sadou vstupů. Potřebujete aktivační funkci, která umožní síti naučit se nelineární vzor. Běžnou aktivační funkcí je a Relu, Rektifikovaná lineární jednotka. Funkce dává nulu pro všechny záporné hodnoty.
Další aktivační funkce jsou:
- Po částech lineární
- Sigmoid
- Tanh
- Děravý Relu
Při budování neuronové sítě je důležité se rozhodnout:
- Kolik vrstev v neuronové síti
- Kolik skrytých jednotek pro každou vrstvu
Neuronová síť se spoustou vrstev a skrytých jednotek se může naučit komplexní reprezentaci dat, ale to velmi prodražuje výpočet sítě.
Ztrátová funkce
Poté, co jste definovali skryté vrstvy a aktivační funkci, musíte specifikovat ztrátovou funkci a optimalizátor.
Pro binární klasifikaci je běžnou praxí používat funkci ztráty binární zkřížené entropie. V lineární regresi se používá střední kvadratická chyba.
Ztrátová funkce je důležitou metrikou pro odhad výkonu optimalizátoru. Během školení bude tato metrika minimalizována. Toto množství musíte pečlivě vybrat v závislosti na typu problému, se kterým se potýkáte.
Optimalizátor
Ztrátová funkce je měřítkem výkonnosti modelu. Optimalizátor pomůže zlepšit váhy sítě, aby se snížila ztráta. K dispozici jsou různé optimalizátory, ale nejběžnějším z nich je Stochastic Gradient Descent.
Konvenční optimalizátory jsou:
- Momentum optimalizace,
- Nesterov zrychlený gradient,
- AdaGrad,
- Adam optimalizace
Omezení neuronové sítě
Níže jsou uvedena omezení neuronové sítě:
Přetížení
Častým problémem komplexní neuronové sítě jsou potíže při zobecňování neviditelných dat. Neuronová síť s velkým množstvím závaží dokáže velmi dobře identifikovat konkrétní detaily ve vlakové soupravě, ale často vede k nadměrnému vybavení. Pokud jsou data v rámci skupin nevyvážená (tj. v některých skupinách není k dispozici dostatek dat), síť se během trénování velmi dobře naučí, ale nebude mít schopnost zobecnit takový vzorec na data, která dosud nebyla vidět.
Ve strojovém učení existuje kompromis mezi optimalizací a zobecněním.
Optimalizace modelu vyžaduje nalezení nejlepších parametrů, které minimalizují ztrátu trénovací sady.
Zobecnění však říká, jak se model chová pro neviditelná data.
Chcete-li zabránit tomu, aby model zachytil specifické detaily nebo nechtěné vzory trénovacích dat, můžete použít různé techniky. Nejlepší metodou je mít vyvážený soubor dat s dostatečným množstvím dat. Umění omezit nadměrné vybavení se nazývá regulace. Podívejme se na některé konvenční techniky.
Velikost sítě
Je známo, že neuronová síť s příliš mnoha vrstvami a skrytými jednotkami je vysoce sofistikovaná. Přímým způsobem, jak snížit složitost modelu, je zmenšit jeho velikost. Neexistuje žádný osvědčený postup pro definování počtu vrstev. Musíte začít s malým množstvím vrstvy a zvětšovat její velikost, dokud nezjistíte, že model přerostl.
Regulace hmotnosti
Standardní technikou, jak zabránit nadměrnému vybavení, je přidat omezení k hmotnosti sítě. Omezení nutí velikost sítě nabývat pouze malých hodnot. Omezení je přidáno ke ztrátové funkci chyby. Existují dva druhy regularizace:
L1: Lasso: Cena je úměrná absolutní hodnotě váhových koeficientů
L2: Ridge: Cena je úměrná druhé mocnině hodnoty váhových koeficientů
Výpadek
Dropout je zvláštní, ale užitečná technika. Síť s výpadkem znamená, že některé váhy budou náhodně nastaveny na nulu. Představte si, že máte pole závaží [0.1, 1.7, 0.7, -0.9]. Pokud má neuronová síť výpadek, stane se [0.1, 0, 0, -0.9] s náhodně rozdělenou 0. Parametr, který řídí výpadek, je míra výpadků. Sazba určuje, kolik vah se má nastavit na nuly. Běžná je míra mezi 0.2 a 0.5.
Příklad neuronové sítě v TensorFlow
Podívejme se na příklad umělé neuronové sítě v akci, jak neuronová síť funguje pro typický klasifikační problém. Jsou zde dva vstupy, x1 a x2 s náhodnou hodnotou. Výstupem je binární třída. Cílem je klasifikovat štítek na základě dvou vlastností. K provedení tohoto úkolu je architektura neuronové sítě definována následovně:
- Dvě skryté vrstvy
- První vrstva má čtyři plně propojené neurony
- Druhá vrstva má dva plně propojené neurony
- Aktivační funkce je Relu
- Přidejte regulaci L2 s rychlostí učení 0.003
Síť bude optimalizovat váhu během 180 epoch s velikostí dávky 10. Na ukázkovém videu ANN níže můžete vidět, jak se váhy vyvíjejí a jak síť zlepšuje mapování klasifikace.
Za prvé, síť všem vahám přiřadí náhodné hodnoty.
- S náhodnými vahami, tj. bez optimalizace, je výstupní ztráta 0.453. Obrázek níže znázorňuje síť v různých barvách.
- Obecně platí, že oranžová barva představuje záporné hodnoty, zatímco modré barvy představují kladné hodnoty.
- Datové body mají stejnou reprezentaci; modré jsou pozitivní štítky a oranžové negativní štítky.
Uvnitř druhé skryté vrstvy jsou čáry barevné podle znaménka vah. Oranžové čáry přidělují záporné váhy a modré kladné váhy
Jak vidíte, ve výstupním mapování dělá síť poměrně velkou chybu. Podívejme se, jak se síť chová po optimalizaci.
Níže uvedený obrázek příkladu ANN znázorňuje výsledky optimalizované sítě. Nejprve si všimnete, že se síť úspěšně naučila klasifikovat datový bod. Můžete vidět z předchozího obrázku; počáteční hmotnost byla -0.43, zatímco po optimalizaci je výsledkem hmotnost -0.95.
Myšlenku lze zobecnit pro sítě s více skrytými vrstvami a neurony. Můžete si hrát v https://trials.autocruitment.com.
Jak trénovat neuronovou síť pomocí TensorFlow
Zde je postup krok za krokem, jak trénovat neuronovou síť pomocí TensorFlow ANN pomocí odhadu API DNNClassifier.
Dataset MNIST použijeme k trénování vaší první neuronové sítě. Trénink neuronové sítě s TensorFlow není příliš složité. Krok předběžného zpracování vypadá přesně stejně jako v předchozích tutoriálech. Budete postupovat následovně:
- Krok 1: Importujte data
- Krok 2: Transformujte data
- Krok 3: Sestrojte tenzor
- Krok 4: Sestavte model
- Krok 5: Trénujte a vyhodnoťte model
- Krok 6: Vylepšete model
Krok 1) Importujte data
Nejprve je potřeba naimportovat potřebnou knihovnu. Datovou sadu MNIST můžete importovat pomocí scikit learn, jak je znázorněno v příkladu neuronové sítě TensorFlow níže.
Datová sada MNIST je běžně používaná datová sada k testování nových technik nebo algoritmů. Tato datová sada je sbírka obrázku 28×28 pixelů s ručně psanou číslicí od 0 do 9. V současné době je nejnižší chyba v testu 0.27 procenta s výborem 7 konvolučních neuronových sítí.
import numpy as np import tensorflow as tf np.random.seed(1337)
Scikit learn si můžete dočasně stáhnout na této adrese. Zkopírujte a vložte datovou sadu do vhodné složky. Chcete-li importovat data do pythonu, můžete použít fetch_mldata ze scikit learn. Chcete-li načíst data, vložte cestu k souboru do fetch_mldata.
from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)
Poté naimportujete data a získáte tvar obou datových sad.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )
Krok 2) Transformujte data
V předchozím kurzu jste se naučili, že je třeba transformovat data, abyste omezili účinek odlehlých hodnot. V tomto tutoriálu Neural Networks budete transformovat data pomocí min-max scaleru. Vzorec je:
(X-min_x)/(max_x - min_x)
Scikit se učí, že na to již má funkci: MinMaxScaler()
## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
Krok 3) Sestrojte tenzor
Nyní jste obeznámeni se způsobem vytvoření tenzoru v Tensorflow. Vlakovou soupravu můžete převést na číselný sloupec.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Krok 4) Sestavte model
Architektura neuronové sítě obsahuje 2 skryté vrstvy s 300 jednotkami pro první vrstvu a 100 jednotkami pro druhou vrstvu. Tyto hodnoty využíváme na základě vlastních zkušeností. Tyto hodnoty můžete vyladit a uvidíte, jak to ovlivní přesnost sítě.
K sestavení modelu použijete estimátor DNNClassifier. Do argumentů feature_columns můžete přidat počet vrstev. Musíte nastavit počet tříd na 10, protože v tréninkové sadě je deset tříd. Již jste obeznámeni se syntaxí objektu estimator. Vlastnosti argumentů sloupce, počet tříd a model_dir jsou přesně stejné jako v předchozím tutoriálu. Nový argument hidden_unit řídí počet vrstev a kolik uzlů se má připojit k neuronové síti. V níže uvedeném kódu jsou dvě skryté vrstvy, z nichž první spojuje 300 uzlů a druhá se 100 uzly.
Chcete-li sestavit odhad, použijte tf.estimator.DNNClassifier s následujícími parametry:
- feature_columns: Definujte sloupce pro použití v síti
- hidden_units: Definuje počet skrytých neuronů
- n_classes: Definuje počet tříd, které se mají předpovídat
- model_dir: Definuje cestu k TensorBoard
estimator = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
n_classes=10,
model_dir = '/train/DNN')
Krok 5) Trénujte a vyhodnoťte model
K trénování modelu a jeho vyhodnocení můžete použít metodu numpy
# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
x={"x": X_train_scaled},
y=y_train,
batch_size=50,
shuffle=False,
num_epochs=None)
estimator.train(input_fn = train_input,steps=1000)
eval_input = tf.estimator.inputs.numpy_input_fn(
x={"x": X_test_scaled},
y=y_test,
shuffle=False,
batch_size=X_test_scaled.shape[0],
num_epochs=1)
estimator.evaluate(eval_input,steps=None)
Výstup:
{'accuracy': 0.9637143,
'average_loss': 0.12014342,
'loss': 1682.0079,
'global_step': 1000}
Současná architektura vede k přesnosti sady hodnocení 96 procent.
Krok 6) Vylepšete model
Můžete se pokusit vylepšit model přidáním parametrů regularizace.
Použijeme optimalizátor Adam s mírou výpadků 0.3, L1 z X a L2 z y. V TensorFlow Neural Network můžete optimalizátor ovládat pomocí sledu objektů, za kterým následuje název optimalizátoru. TensorFlow je vestavěné API pro optimalizátor Proximal AdaGrad.
Chcete-li přidat regularizaci do hluboké neuronové sítě, můžete použít tf.train.ProximalAdagradOptimizer s následujícím parametrem
- Rychlost učení: rychlost_učení
- Regularizace L1: l1_regularization_síla
- Regularizace L2: l2_regularization_síla
estimator_imp = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
dropout=0.3,
n_classes = 10,
optimizer=tf.train.ProximalAdagradOptimizer(
learning_rate=0.01,
l1_regularization_strength=0.01,
l2_regularization_strength=0.01
),
model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000)
estimator_imp.evaluate(eval_input,steps=None)
Výstup:
{'accuracy': 0.95057142,
'average_loss': 0.17318928,
'loss': 2424.6499,
'global_step': 2000}
Hodnoty zvolené pro snížení překrytí nezlepšily přesnost modelu. Váš první model měl přesnost 96 %, zatímco model s regularizerem L2 má přesnost 95 %. Můžete vyzkoušet různé hodnoty a zjistit, jak to ovlivní přesnost.
Shrnutí
V tomto tutoriálu se naučíte, jak vytvořit neuronovou síť. Neuronová síť vyžaduje:
- Počet skrytých vrstev
- Počet plně připojeného uzlu
- Aktivační funkce
- Optimalizátor
- Počet tříd
V TensorFlow ANN můžete trénovat neuronovou síť pro klasifikační problém s:
- tf.estimator.DNNCklasifikátor
Odhadce vyžaduje specifikovat:
- feature_columns=feature_columns,
- skryté_jednotky=[300, 100]
- n_tříd=10
- model_dir
Model můžete vylepšit pomocí různých optimalizátorů. V tomto tutoriálu jste se naučili používat optimalizátor Adam Grad s rychlostí učení a přidat ovládací prvek, který zabrání nadměrnému přizpůsobení.




