Úvod do neuronových sítí III

09.12.2022 Machine Learning #neuron #machine #learning

Implementace neuronové sítě v Pythonu.


5 Implementace neuronové sítě v Pythonu
5.1 Škálování dat
5.2 Vytváření testovacích a trénovacích datových sad
5.3 Nastavení výstupní vrstvy
5.4 Vytvoření neuronové sítě 
5.5 Přesnost trénovacího modelu

5 Implementace neuronové sítě v Pythonu

V poslední části jsme se podívali na teorii týkající se tréninku gradientového sestupu v neuronových sítích a metodu zpětného šíření. V tomto článku použijeme tuto teorii k vývoji nějakého kódu pro provádění školení a predikce na datové sadě MNIST. Datový soubor MNIST je druhem go-to datasetu v neuronových sítích a příkladech hlubokého učení, takže u něj zůstaneme i zde. To, z čeho se skládá, je záznam obrázků ručně psaných číslic s přidruženými štítky, které nám říkají, o jakou číslici se jedná. Každý obrázek má velikost 8 x 8 pixelů a vzorek dat obrázku je reprezentován 64 datovými body, které označují intenzitu pixelů. V tomto příkladu použijeme datovou sadu MNIST poskytovanou v knihovně Python Machine Learning s názvem scikit learn. Příklad obrázku (a extrakce dat z datové sady scikit learn) je uveden v kódu níže (pro obrázek 1):

from sklearn.datasets import load_digits
digits = load_digits()
print(digits.data.shape)
import matplotlib.pyplot as plt 
plt.gray() 
plt.matshow(digits.images[1]) 
plt.show()


Obrázek 13. Číslice MNIST „1“

Výše uvedený kód se vytiskne (1797, 64), aby ukázal tvar matice vstupních dat a pixelovanou číslici „1“ na obrázku výše. Kód, který napíšeme v tomto tutoriálu o neuronových sítích, se pokusí odhadnout číslice, které tyto pixely představují (samozřejmě pomocí neuronových sítí). Nejprve musíme dostat vstupní data do tvaru. K tomu musíme udělat dvě věci:

  1. Měřítko dat
  2. Rozdělte data na testovací a vlakové sady

5.1 Údaje o měřítku

Proč potřebujeme škálovat vstupní data? Nejprve se podívejte na jednu z reprezentací pixelů datové sady:

digits.data[0,:]
Out[2]:
array([0.,  0.,  5., 13.,  9., 1., 0., 0., 0., 0.,13.,
      15., 10., 15.,  5.,  0., 0., 3.,15., 2., 0.,11.,
       8 ., 0.,  0.,  4., 12., 0., 0., 8., 8., 0., 0.,
       5.,  8.,  0.,  0.,  9., 8., 0., 0., 4.,11., 0. ,
       1., 12.,  7.,  0.,  0., 2.,14., 5.,10.,12., 0.,
       0.,  0.,  0.,  6., 13., 10.,0., 0., 0.])

Všimněte si, že rozsah vstupních dat je od 0 do 15? Je standardní praxí škálovat vstupní data tak, aby se všechna vešla většinou mezi 0 až 1 nebo s malým rozsahem se středem kolem 0, tj. -1 až 1. Proč? Může pomoci konvergenci neuronové sítě a je zvláště důležitá, pokud kombinujeme různé typy dat. Naštěstí to lze snadno provést pomocí sci-kit learn:

 

Standardní scaler scikit learn standardně normalizuje data odečtením průměru a dělením směrodatnou odchylkou. Jak lze pozorovat, většina datových bodů je vycentrována kolem nuly a je obsažena v rozmezí -2 a 2. To je dobrý výchozí bod. Není potřeba škálovat výstupní data $y$.

5.2 Vytváření testovacích a tréninkových datových sad

Ve strojovém učení existuje fenomén zvaný „overfitting“. K tomu dochází, když se modely během tréninku stanou příliš komplexními – stanou se opravdu dobře přizpůsobenými k předpovídání tréninkových dat, ale když jsou požádány, aby předpověděly něco na základě nových dat, která předtím „neviděly“, fungují špatně. Jinými slovy, modely moc dobře nezobecňují . Abychom se ujistili, že nevytváříme příliš složité modely, je běžnou praxí rozdělit datovou sadu na trénovací sadu a test .soubor. Trénovací sada jsou samozřejmě data, na kterých bude model trénován, a testovací sada jsou data, na kterých bude model testován poté, co byl trénován. Množství trénovacích dat je vždy větší než testovacích dat a obvykle se pohybuje mezi 60-80 % celkového datového souboru.

Opět platí, že scikit learn usnadňuje toto rozdělení dat do školicích a testovacích sad:

[pastacode lang=”python” manual=”from%20sklearn.model_selection%20import%20train_test_split%0Ay%20%3D%20digits.target%0AX_train%2C%20X_test%2C%20y_train%2C%20y_20y_test%2 X%2C%20y%2C%20test_size%3D0.4)” message=”” highlight=”” provider=”manual”/]

V tomto případě jsme vytvořili testovací sadu tak, aby tvořila 40 % celkových dat, takže 60 % zbývá na trénování. Funkce train_test_split ve scikit learn vkládá data náhodně do různých datových sad – jinými slovy, nebere prvních 60 % řádků jako trénovací sadu a druhých 40 % řádků jako testovací sadu. Tím se zabrání tomu, aby artefakty sběru dat zhoršovaly výkon modelu.

5.3 Nastavení výstupní vrstvy

Jak byste byli schopni shromáždit, potřebujeme výstupní vrstvu k předpovědi, zda číslice reprezentované vstupními pixely je mezi 0 a 9. Proto by rozumná architektura neuronové sítě měla mít výstupní vrstvu s 10 uzly, přičemž každý z těchto uzlů reprezentujících číslici od 0 do 9. Chceme síť natrénovat tak, aby při předání řekněme obrazu číslice „5“ do neuronové sítě měl uzel ve výstupní vrstvě reprezentující 5 nejvyšší hodnotu. . V ideálním případě bychom chtěli vidět výstup vypadat takto: [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]. Ve skutečnosti se však můžeme spokojit s něčím takovým: [0,01, 0,1, 0,2, 0,05, 0,3, 0,8, 0,4, 0,03, 0,25, 0,02]. V tomto případě můžeme vzít maximální index výstupního pole a nazvat to naše predikovaná číslice.

Pro data MNIST dodávaná v datovém souboru scikit learn jsou „cíle“ nebo klasifikace ručně psaných číslic ve formě jediného čísla. Potřebujeme toto jediné číslo převést na vektor tak, aby odpovídalo naší výstupní vrstvě 10 uzlů. Jinými slovy, pokud je cílová hodnota v datové sadě „1“, chceme ji převést na vektor: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]. Níže uvedený kód dělá právě to:

[pastacode lang=”python” manual=”import%20numpy%20as%20np%0Adef%20convert_y_to_vect(y)%3A%0A%20%20%20%20y_vect%20%3D%20np.zeros((len(y) %2C%2010))%0A%20%20%20%20for%20i%20in%20range(len(y))%3A%0A%20%20%20%20%20%20%20%20y_vect%5Bi %2C%20y%5Bi%5D%5D%20%3D%201%0A%20%20%20%20return%20y_vect%0Ay_v_train%20%3D%20convert_y_to_vect(y_train)%0Ay_v_test%20_converty_to_test%20%3 %0Ay_train%5B0%5D%2C%20y_v_train%5B0%5D%0AOout%5B8%5D%3A%0A(1%2C%20array(%5B%200.%2C%201.%2C%200.%2C%200 .%2C%200.%2C%200.%2C%200.%2C%200.%2C%200.%2C%200.%5D))” message=”” highlight=”” provider=”manual”/ ]

 

Jak lze pozorovat výše, cíl MNIST (1) byl převeden na vektor [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], což je to, co chceme.

5.4 Vytvoření neuronové sítě

Dalším krokem je upřesnění struktury neuronové sítě. U vstupní vrstvy víme, že potřebujeme 64 uzlů k pokrytí 64 pixelů v obrázku. Jak bylo uvedeno, potřebujeme 10 uzlů výstupní vrstvy k predikci číslic. Budeme také potřebovat skrytou vrstvu v naší síti, abychom umožnili složitost úkolu. Obvykle je počet uzlů skrytých vrstev někde mezi počtem vstupních vrstev a počtem výstupních vrstev. Pojďme definovat jednoduchý seznam Python, který určuje strukturu naší sítě:

[pastacode lang=”python” manual=”nn_structure%20%3D%20%5B64%2C%2030%2C%2010%5D” message=”” highlight=”” provider=”manual”/]

Znovu použijeme funkce aktivace sigmoidu, takže nastavíme funkci sigmoid a její derivaci:

[pastacode lang=”python” manual=”def%20f(x)%3A%0A%20%20%20%20return%201%20%2F%20(1%20%2B%20np.exp(-x) )%0Adef%20f_deriv(x)%3A%0A%20%20%20%20return%20f(x)%20*%20(1%20-%20f(x))” message=”” highlight=”” provider=”manual”/]

Dobře, takže nyní máme představu, jak bude naše neuronová síť vypadat. Jak to trénujeme? Zapamatujte si algoritmus z části 4.9 , který zde zopakujeme pro usnadnění přístupu a kontroly:

Náhodně inicializujte váhy pro každou vrstvu $W^{(l)}$
Zatímco iterace < iterační limit:
1. Nastavte $\Delta W$ a $\Delta b$ na nulu
2. Pro vzorky 1 až m:
a. Proveďte průchod vpřed skrz všechny $n_l$ vrstvy. Uložte výstupy aktivační funkce $h^{(l)}$
b. Vypočítejte hodnotu $\delta^{(n_l)}$ pro výstupní vrstvu
c. Použijte backpropagation k výpočtu hodnot $\delta^{(l)}$ pro vrstvy 2 až $n_l-1$
d. Aktualizujte $\Delta W^{(l)}$ a $\Delta b^{(l)}$ pro každou vrstvu
3. Proveďte krok sestupu s přechodem pomocí:

$W^{(l)} = W^{(l)} – \alpha \left[\frac{1}{m} \Delta W^{(l)} \right]$
$b^{(l) } = b^{(l)} – \alpha \left[\frac{1}{m} \Delta b^{(l)}\right]$

Prvním krokem je tedy inicializace vah pro každou vrstvu. Abychom usnadnili organizaci různých vrstev, použijeme objekty slovníku Pythonu (inicializované {}). Nakonec musí být váhy inicializovány náhodnými hodnotami – to má zajistit, že neuronová síť bude během tréninku správně konvergovat. K tomu používáme funkci numpy library random_sample. Inicializační kód hmotnosti je uveden níže:

[pastacode lang=”python” manual=”import%20numpy.random%20as%20r%0Adef%20setup_and_init_weights(nn_structure)%3A%0A%20%20%20%20W%20%3D%20%7B%7D%0A %20%20%20%20b%20%3D%20%7B%7D%0A%20%20%20%20pro%20l%20in%20range(1%2C%20len(nn_structure))%3A%0A%20 %20%20%20%20%20%20%20W%5Bl%5D%20%3D%20r.random_sample((nn_structure%5Bl%5D%2C%20nn_structure%5Bl-1%5D))%0A%20% 20%20%20%20%20%20%20b%5Bl%5D%20%3D%20r.random_sample((nn_structure%5Bl%5D%2C))%0A%20%20%20%20return%20W%2C %20b” message=”” highlight=”” provider=”manual”/]

Dalším krokem je nastavení středních hodnot akumulace $\Delta W$ a $\Delta b$ na nulu (musí mít stejnou velikost jako matice váhy a zkreslení):

[pastacode lang=”python” manual=”def%20init_tri_values(nn_structure)%3A%0A%20%20%20%20tri_W%20%3D%20%7B%7D%0A%20%20%20%20tri_b%20 %3D%20%7B%7D%0A%20%20%20%20for%20l%20in%20range(1%2C%20len(nn_structure))%3A%0A%20%20%20%20%20%20 %20%20tri_W%5Bl%5D%20%3D%20np.zeros((nn_structure%5Bl%5D%2C%20nn_structure%5Bl-1%5D))%0A%20%20%20%20%20%20% 20%20tri_b%5Bl%5D%20%3D%20np.zeros((nn_structure%5Bl%5D%2C))%0A%20%20%20%20return%20tri_W%2C%20tri_b” message=”” highlight=” ” provider=”manual”/]

Pokud nyní vstoupíme do gradientní sestupové smyčky, prvním krokem je provést dopředný průchod sítí. Níže uvedený kód je variantou funkce feed forward vytvořené v sekci 3 :

[pastacode lang=”python” manual=”def%20feed_forward(x%2C%20W%2C%20b)%3A%0A%20%20%20%20h%20%3D%20%7B1%3A%20x%7D %0A%20%20%20%20z%20%3D%20%7B%7D%0A%20%20%20%20pro%20l%20in%20range(1%2C%20len(W)%20%2B% 201)%3A%0A%20%20%20%20%20%20%20%20%23%20if%20it%20je%20%20první%20vrstva%2C%20potom%20%20vstup%20do%20%20závaží %20je%20x%2C%20jinak%2C%20%0A%20%20%20%20%20%20%20%20%23%20it%20je%20%20výstup%20z%20%20poslední%20vrstvy%0A %20%20%20%20%20%20%20%20if%20l%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20 %20%20node_in%20%3D%20x%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20 %20%20%20uzel_in%20%3D%20h%5Bl%5D%0A%20%20%20%20%20%20%20%20z%5Bl%2B1%5D%20%3D%20W%5Bl%5D .tečka(uzel_in)%20%2B%20b%5Bl%5D%20%23%20z%5E(l%2B1)%20%3D%20W%5E(l)*h%5E(l)%20%2B% 20b%5E(l)%20%20%0A%20%20%20%20%20%20%20%20h%5Bl%2B1%5D%20%3D%20f(z%5Bl%2B1%5D)% 20%23%20h%5E(l)%20%3D%20f(z%5E(l))%20%0A%20%20%20%20return%20h%2C%20z” message=”” highlight=” ” provider=”manual”/]

Nakonec musíme vypočítat delta výstupní vrstvy $\delta^{(n_l)}$ a jakékoli hodnoty delta skryté vrstvy $\delta^{(l)}$, abychom provedli průchod zpětné propagace:

[pastacode lang=”python” manual=”def%20calculate_out_layer_delta(y%2C%20h_out%2C%20z_out)%3A%0A%20%20%20%20%23%20delta%5E(nl)%20%3D% 20-(y_i%20-%20h_i%5E(nl))%20*%20f'(z_i%5E(nl))%0A%20%20%20%20return%20-(y-h_out)%20* %20f_deriv(z_out)%0A%0Adef%20calculate_hidden_delta(delta_plus_1%2C%20w_l%2C%20z_l)%3A%0A%20%20%20%20%23%20delta%5E(l)%20%3D%20 transponovat (W%5E(l))%20*%20delta%5E(l%2B1))%20*%20f'(z%5E(l))%0A%20%20%20%20return%20np.dot (np.transpose(w_l)%2C%20delta_plus_1)%20*%20f_deriv(z_l)” message=”” highlight=”” provider=”manual”/]

Nyní můžeme všechny kroky spojit do konečné funkce:

[pastacode lang=”python” manual=”def%20train_nn(nn_structure%2C%20X%2C%20y%2C%20iter_num%3D3000%2C%20alpha%3D0.25)%3A%0A%20%20%20%20W %2C%20b%20%3D%20setup_and_init_weights(nn_structure)%0A%20%20%20%20cnt%20%3D%200%0A%20%20%20%20m%20%3D%20len(y)%0A %20%20%20%20avg_cost_func%20%3D%20%5B%5D%0A%20%20%20%20print('Počáteční%20gradient%20descent%20for%20%7B%7D%20iterations'.format(iter_num ))%0A%20%20%20%20while%20cnt%20%3C%20iter_num%3A%0A%20%20%20%20%20%20%20%20if%20cnt%251000%20%3D%3D %200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print('Iterace%20%7B%7D%20of%20%7B%7D'.format(cnt%2C%20iter_num))%0A%20%20%20%20%20%20%20%20tri_W%2C%20tri_b%20%3D%20init_tri_values(nn_structure)%0A%20%20%20%20 %20%20%20%20avg_cost%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(len(y))%3A%0A%20 %20%20%20%20%20%20%20%20%20%20%20delta%20%3D%20%7B%7D%0A%20%20%20%20%20%20%20%20 %20%20%20%20%23%20proveďte%20posuv%20vpřed%20přejděte%20a%20vraťte%20uložené%20h%20a%20z%20hodnoty%2C%20k%20být%20použito%20v%20 %20%20%20%20%20%20%20%20%20%20%20%20%23%20gradient%20sestup%20krok%0A%20%20%20%20%20%20%20%20 %20%20%20%20h%2C%20z%20%3D%20feed_forward(X%5Bi%2C%20%3A%5D%2C%20W%2C%20b)%0A%20%20%20%20% 20%20%20%20%20%20%20%20%23%20smyčka%20od%20nl-1%20do%201%20zpětné šíření%20chyby%20A%20%20%20%20%20%20% 20%20%20%20%20%20pro%20l%20v%20rozsah(délka(nn_struktura)%2C%200%2C%20-1)%3A%0A%20%20%20%20%20%20% 20%20%20%20%20%20%20%20%20%20if%20l%20%3D%3D%20len(nn_structure)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20% 20%20%20%20delta%5Bl%5D%20%3D%20calculate_out_layer_delta(y%5Bi%2C%3A%5D%2C%20h%5Bl%5D%2C%20z%5Bl%5D)%0A%20%20 %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20avg_cost%20%2B%3D%20np.linalg.norm(( y%5Bi%2C%3A%5D-h%5Bl%5D))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20% 20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20l%20% 3E%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20% 20%20%20delta%5Bl%5D%20%3D%20calculate_hidden_delta(delta%5Bl%2B1%5D%2C%20W%5Bl%5D%2C%20z%5Bl%5D)%0A%20%20%20%20 %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20triW%5E(l)%20%3D%20triW%5E( l)%20%2B%20delta%5E(l%2B1)%20*%20transpose(h%5E(l))%0A%20%20%20%20%20%20%20%20%20%20 %20%20%20%20%20%20%20%20%20%20tri_W%5Bl%5D%20%2B%3D%20np.tečka(delta%5Bl%2B1%5D%5B%3A%2Cnp.newaxis%5D%2C%20np.transpose(h%5Bl%5D%5B%3A%2Cnp.newaxis%5D))%20%0A%20% 20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20trib%5E(l)%20%3D %20kmen%5E(l)%20%2B%20delta%5E(l%2B1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20 %20%20%20%20%20%20tri_b%5Bl%5D%20%2B%3D%20delta%5Bl%2B1%5D%0A%20%20%20%20%20%20%20%20%23 %20proveďte%20proveďte%20přechod%20sestup%20krok%20pro%20%20závaží%20v%20každé%20vrstvě%0A%20%20%20%20%20%20%20%20pro%20l%20v%20rozsah(len(nn_structure) )%20-%201%2C%200%2C%20-1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20W%5Bl%5D% 20%2B%3D%20-alpha%20*%20(1,0%2Fm%20*%20tri_W%5Bl%5D)%0A%20%20%20%20%20%20%20%20%20%20 %20%20b%5Bl%5D%20%2B%3D%20-alpha%20*%20(1,0%2Fm%20*%20tri_b%5Bl%5D)%0A%20%20%20%20%20% 20%20%20%23%20úplné%20průměrné%20náklady%20výpočet%0A%20%20%20%20%20%20%20%20průměrné_náklady%20%3D%201.0%2Fm%20*%20avg_cost%0A%20%20%20%20%20%20%20%20avg_cost_func.append(avg_cost)%0A%20%20%20%20%20%20%20%20cnt% 20%2B%3D%201%0A%20%20%20%20return%20W%2C%20b%2C%20avg_cost_func” message=”” highlight=”” provider=”manual”/]

Výše uvedená funkce si zaslouží trochu vysvětlení. Za prvé, nenastavujeme ukončení procesu sestupu gradientu na základě nějaké změny nebo přesnosti nákladové funkce. Spíše to jen spouštíme na stanovený počet iterací (v tomto případě 3 000) a budeme sledovat, jak se mění funkce průměrných nákladů, jak postupujeme školením (seznam avg_cost_func ve výše uvedeném kódu). V každé iteraci sestupu gradientu procházíme každý trénovací vzorek (rozsah(délka(y)) a provádíme dopředný průchod a poté zpětné šíření. Krok zpětného šíření je iterace přes vrstvy začínající na výstupní vrstvě a pracující zpět – range(len(nn_structure), 0, -1) Vypočítáme průměrné náklady, které sledujeme během školení, na výstupní vrstvě (l == len(nn_structure)).

Nakonec, poté, co jsme prošli všechny tréninkové vzorky a nashromáždili hodnoty tri_W a tri_b, provedeme skokovou změnu gradientu v hodnotách hmotnosti a vychýlení:
$$W^{(l)} = W^{(l)} – \alpha \left[\frac{1}{m} \Delta W^{(l)} \right]$$
$$b^{(l)} = b^{(l)} – \alpha \left [\frac{1}{m} \Delta b^{(l)}\right]$$

Po dokončení procesu vrátíme natrénované hodnoty hmotnosti a zkreslení spolu s našimi sledovanými průměrnými náklady pro každou iteraci. Nyní je čas spustit funkci – POZNÁMKA: V závislosti na možnostech vašeho počítače to může trvat několik minut.

[pastacode lang=”python” manual=”W%2C%20b%2C%20avg_cost_func%20%3D%20train_nn(nn_structure%2C%20X_train%2C%20y_v_train)” message=”” highlight=”” provider=”manual” /]

Nyní se můžeme podívat na to, jak se funkce průměrných nákladů snížila, když jsme procházeli iteracemi sestupu gradientu tréninku a pomalu konvergovali k minimu ve funkci:

[pastacode lang=”python” manual=”plt.plot(avg_cost_func)%0Aplt.ylabel('Average%20J')%0Aplt.xlabel('Iteration%20number')%0Aplt.show()” message=”” zvýraznění =”” provider=”manual”/]

Ve výše uvedeném grafu můžeme vidět, že po 3 000 iteracích našeho sestupu gradientu naše průměrná hodnota nákladové funkce začala „plató“, a proto jakékoli další zvýšení počtu iterací pravděpodobně nezlepší výkon sítě o mnoho. .

5.5 Posouzení přesnosti natrénovaného modelu

Nyní, když jsme trénovali naši neuronovou síť MNIST, chceme vidět, jak funguje na testovací sadě. Je náš model dobrý? Vzhledem k testovacímu vstupu (64 pixelů) potřebujeme zjistit, jaký je výstup naší neuronové sítě – to uděláme jednoduše provedením dopředného průchodu sítí pomocí našich natrénovaných hodnot hmotnosti a zkreslení. Jak bylo diskutováno dříve, posuzujeme predikci výstupní vrstvy tak, že jako predikovanou číslici vezmeme uzel s maximálním výstupem. Můžeme k tomu použít funkci numpy.argmax, která vrátí index hodnoty pole s nejvyšší hodnotou:

[pastacode lang=”python” manual=”def%20predict_y(W%2C%20b%2C%20X%2C%20n_layers)%3A%0A%20%20%20%20m%20%3D%20X.shape%5B0 %5D%0A%20%20%20%20y%20%3D%20np.nuly((m%2C))%0A%20%20%20%20for%20i%20in%20range(m)%3A%0A %20%20%20%20%20%20%20%20h%2C%20z%20%3D%20feed_forward(X%5Bi%2C%20%3A%5D%2C%20W%2C%20b)%0A% 20%20%20%20%20%20%20%20y%5Bi%5D%20%3D%20np.argmax(h%5Bn_layers%5D)%0A%20%20%20%20return%20y” message=” ” highlight=”” provider=”manual”/]

Nakonec můžeme zhodnotit přesnost předpovědi (tj. procento případů, kdy síť správně předpověděla ručně psanou číslici), pomocí funkce scikit learn attention_score:

[pastacode lang=”python” manual=”from%20sklearn.metrics%20import%20accuracy_score%0Ay_pred%20%3D%20predict_y(W%2C%20b%2C%20X_test%2C%203)%0Aaccuracy_score%20y )*100″ message=”” highlight=”” provider=”manual”/]

To poskytuje 86% přesnost předpovídání číslic. Zní to docela dobře, že? No vlastně ne, je to dost špatné. Současné nejmodernější algoritmy hlubokého učení dosahují skóre přesnosti 99,7 % (viz zde ), takže od tohoto druhu přesnosti jsme o dost vzdáleni. Existuje mnoho dalších vzrušujících věcí, které se můžete naučit – můj další příspěvek se bude týkat několika tipů a triků, jak podstatně zlepšit přesnost na této jednoduché neuronové síti. Kromě toho však máme k dispozici celou oblast nejmodernějších algoritmů hlubokého učení, které se můžeme učit a zkoumat, od konvolučních neuronových sítí po sítě hlubokého přesvědčení a opakující se neuronové sítě. Pokud jste se řídili tímto příspěvkem v pořádku, budete v dobré pozici pro postup k těmto novějším technikám.

Zůstaňte poblíž a zjistěte více o této rychle se rozvíjející oblasti strojového učení. Pro začátek se podívejte na tyto příspěvky:
Výukový program Python TensorFlow – Vybudujte neuronovou síť
Vylepšete své neuronové sítě – Část 1 [TIPY A TRIKY]
Stochastický sestup gradientu – Mini-dávka a další