MATLAB zľahka - Deep learning na tri riadky
Deep learning je využitie hlbokých neurónových sietí pre úlohy ako je napríklad klasifikácia obrazu.
Neurónové siete Alexnet
Alexnet je jedna z prvých dobre fungujúcich neurónových sietí svojho druhu. Môžeme pomocou nej napr. Zistiť, čo sa nachádza na obrázku, už tromi riadky kódu. Tu sú:
net = alexnet; %načtení neuronové sítě
Obrazek = imread('https://itnetwork.cz/images/17395/matlabzlehka04/banan.jpg'); %načtení obrázku z webu
CoTamJe=classify(net,Obrazek) % klasifikace obrázku pomocí neuronky
MATLAB vás zrejme upozorní na nenainštalovanú AlexNet Network support package. Inštalácia pomocou balíka je najlepší spôsob, ako dostať natrénované a popísanú neuronku do MATLABu. Pre inštaláciu balíka je potrebné mať účet na MATHWORKS (zdarma).
URL adresa v kóde ukazuje na nasledujúci obrázok banánu:
Výstupom tých troch riadkov kódu je úspešné rozpoznanie tohto banánu:
CoTamJe = categorical banana
Prečo je to úspech ľahšie pochopíme pomocou malej exkurzie do neďalekej histórie.
Stručná história konvolučná neurónových sietí
V prípade, že by sme pre detekciu banánu nechceli používať neurónové siete, museli by sme vyriešiť veľa problémov. Všeobecne úloha rozpoznanie niečoho v obraze je veľmi netriviálne.
Ako definujeme banán?
Môžeme začať s tým, že banán je žltý, má istý tvar, veľkosť a textúru. Ani jedna z týchto vlastností sa pre banánu zakaždým rovnaká a už vôbec nie je "banánovo exkluzívne" (napr. Jablko môže byť tiež žlté). Aj v rozpoznávania čísel, ktorých je len 10 a sú oproti objektom všedného sveta jednoduchá, sú klasické algoritmy značne nedokonalé. Pri použití klasifikátora založeného na konvolučná neurónových sieťach je presnosť a rýchlosť lepšia ako u človeka samotného. Nevýhodou neuronek všeobecne je potreba veľkého množstva dát a výpočtového výkonu pre učiaci fázu.
Súťaž LSVRC
Od roku 2010 existuje súťaž v klasifikácii obrázkov do 1000 kategórií ( ILSVRC). Jednou z týchto kategórií je aj banán, však objekty sú zo širokého spektra - kvety, veci dennej potreby, psie plemená, atď ... (celý hárok tu). V roku 2012 súťaž s výrazným náskokom vyhrala práve konvolučná neurónové siete Alexnet. Prečo?
Konvolúcie
Zjednodušene povedané - konvolúcie umožňuje predspracovať obrázky tak, že neurónová sieť vyhodnocuje príznaky, ktoré sú zásadné pre rozpoznanie objektov. Napríklad hrany, svetlosť, pod. Všetky príznaky idú ťažko vyjadriť a pomenovať a v tom je zásadný výhoda CNN (Convolutional Neural Network). Príznaky si totiž vytvorí sieť sama podľa toho, ktorými obrázky ju naučíme. Nehovoríme teda neuronce "pozeraj sa na vertikálne hrany", ale ak sieť v procese učenia vyhodnotí, že vertikálne hrany sú dôležitým príznakom pre rozpoznanie bernardína od iPodu, potom áno - neurónová sieť patrične upraví konvolučná filtre tak, aby hrany identifikovali.
Zrátané podčiarknuté odvtedy skoro všetci ILSVRC súťažiaci okopírovali myšlienky, ktoré Alexnet dokázala využiť a každým rokom bola predstavená nová sieť s novou a vylepšenou architektúrou, ktorá viedla zas o kúsok bližšie k presným výsledkom. Veľa týchto sietí môžete smeti a bez zdĺhavých ceremónií v MATLABe využívať.
Tiež si všimnite, že rok 2012 je približne doba, kedy sa na scéne objavujú samořídící autá a Facebook začína s prehľadom zvládať automatické označovanie ľudí na fotografiách.
Klasifikácia vlastného obrázka
Úvodné tri riadky je nutné trochu upraviť, aby sme zvládli klasifikovať akýkoľvek obrázok pomocou Alexnet.
Zmena rozmerov
Prvým krokom je zmena rozmerov obrázku na požadovaných
227x227
pixelov, čo je jednoducho vstup celej siete (banánový
obrázok má požadovaný rozmer, preto sme tento krok vynechali). K zmene
rozmerov slúži funkcia imresize()
.
Pravdepodobnosť
Ďalej by nebolo od veci rovno vidieť, ako veľmi si ich neurónové siete
klasifikáciou istá. Táto informácia sa dá vyčítať z druhého
výstupného parametra funkcie classify()
. Jedná sa o vektor o
1000 prvkoch, pričom tieto sa sčítajú do jedničky. Maximum celého vektora
je teda pravdepodobnosť, že klasifikácia je správna.
Ukážme si náš program s týmito vylepšeniami. Zvyšok kódu slúži pre vypísanie výsledku rovno do obrázka:
A = imread('kytka256.jpg'); %(obrázek součástí .zip souboru) A_227x227 = imresize(A,[227 227]); %změnit velikost [label,score] = classify(net,A_227x227); % klasifikovat A_s_textem = insertText(A,[1 1],...% přidat text cellstr(string(label) + " "+ num2str(max(score)*100)+" %"),'FontSize',26,'boxcolor','magenta'); imshow(A_s_textem)
Alexnet si ich na 95,8% istá, že na obrázku sa nachádza margarétka ... A ajhľa, to je zle. Na obrázku je v skutočnosti kvet Slnečnica topinambur. Keď však skúsime vyhľadať v zozname tried Jerusalem artichoke (anglický názov pre topinambur), stretneme sa s neúspechom. Topinambura jednoducho nie je jednou z tried, tak to neuronka namierila na margaréty. Tu sa dostávame k jednému z úskalia konvolučná neurónových sietí - čo je nenaučíme, nevedia.
Ako vyzerá a funguje Alexnet
Štruktúra siete Alexnet nie je tajná informácia. Ak chcete sa na nej
pozrieť, slúži k tomu v MATLABe funkcie analyzeNetwork()
:
net = alexnet; analyzeNetwork(net);
V nasledujúcom texte je zjednodušujúce opis toho, za čo sú jednotlivé vrstvy siete zodpovedné.
Vrstvy 1-5
- Prvá vrstva siete je vstupná, tiež má veľkosť, ktorá
sa rovná veľkosti RGB obrázku (
227x227x3
). - Druhá vrstva je už spomínaná konvolúcie čiže tiež
filtrácia a to čo sa neuronka naučia sú práve filtre (konvolučná jadrá,
jadrá). V tomto prípade ich je 96 a majú rozmer
11x11x3
(3 pretože 3 farebné kanály). - Tretia vrstvou - ReLU (Rectified Linear
Unit) prejdú všetky hodnoty a ak sú nižšie, než
0
, stane sa z nich práve0
. Ak sú vyššie, k žiadnej zmene nedôjde. To má za následok zvýšenie nelinearity (nelinearita znamená, že ak vstup zvýšime napríklad 2x, výstup nebude zväčšený práve 2x). Siete potom fungujú lepšie. - Štvrtá vrstva - Normalizácia umožňuje znížiť odpoveď neurónov, ktoré vykazujú príliš veľkú aktivitu (aby to nebolo len o nich).
- Zníženie veľkosti vykoná piata vrstva a to tým spôsobom, že z okolia (tu 3x3) vyberie ten najvyšší prvok (preto max pooling). Zníženie veľkosti vedie k zníženiu parametrov nutných k učeniu, tým pádom k zvýšeniu rýchlosti.
Vrstvy 17-25
- Vrstvy 6-16 sú kombináciou predošlých vrstiev s rôznymi parametrami.
- Vrstva 17 obsahuje 4096 neurónov a každý z nich prepojí s 9216 výstupmi z vrstvy 16, preto sa tiež nazýva Fully Connected.
- Dropout (vrstva 19) náhodne nastaví
akýkoľvek vstup s 50% pravdepodobnosťou na
0
, čo opäť zvýši nelinearitu v systéme. - Predposledný, 24. vrstva (SoftMax),
zariadi, že pravdepodobnosti klasifikácia do jednotlivých tried budú od
0
do1
a ich súčet bude tiež1
. - Posledná vrstva je vrstva výstupné, z ktorej nám vypadne želaný výsledok.
Vnútri siete - Aktivácia
Funkcia classify()
vezme obrázok a pošle ho do Alexnet.
Obrázok postupne prepadne všetkými vrstvami, kde aktivuje dané neuróny až
do poslednej vrstvy. Tam každý neurón za sebou skrýva jednu možnú triedu
toho, čo je na obrázku. Tá, ktorá je najviac aktivovaná, je výstupom
funkcia classify()
. Do celého procesu aktivácie môžete
nahliadnuť pomocou funkcie activations()
:
aktivace = activations(net,A_227x227,5);%aktivace z 5. vrstvy aktivace_4d = reshape(aktivace,size(aktivace,1) , size(aktivace,2) , 1 , size(aktivace,3) ); aktivace_4d = imadjustn (mat2gray (aktivace_4d));%upravy pro lepsi zobrazeni montage(aktivace_4d (:,:,:,1:16));%zobrazeni prvnich 16 aktivaci (pro lepsi zobrazeni)
Na obrázku vidíme, čo sa stalo s kvetinou v piatej vrstve Alexnet. Niekedy je kvet tmavý, niekedy svetlý, niekedy nie je vidieť vôbec, alebo len okraj. Zo súboru týchto vlastností Alexnet na konci vyhodnotí, že sa jedná o margaréty.
Záver
Pozreli sme sa na to, ako je v MATLABe jednoduché použiť konvolučná neurónovou sieť pre klasifikáciu obrazu. Stručne sme si vysvetlili ako a prečo tieto siete fungujú. CNN sa nevyužívajú iba ku klasifikácii obrázkov, ale aj na detekciu objektov ( "na súradniciach xy sa nachádza chodec"), sémantickej segmentáciu ( "tento pixel je chodec a tento pixel je iné vozidlo"), ale aj na generovanie samotných obrázkov a pod. Pochopiteľne ich zameranie nie je iba na obrazy. Používajú sa aj u jednorozmerných signálov (zvuk, EKG, vývoj ceny Bitcoin, a ďalšie) k podobným úlohám.
Nabudúce si ukážeme ako neurónovou sieť natrénovať na našich vlastných obrázkoch.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 24x (53.64 kB)
Aplikácia je vrátane zdrojových kódov