MATLAB zlehka - Deep learning na tři řádky
Deep learning je využití hlubokých neuronových sítí pro úlohy jako je například klasifikace obrazu.
Neuronová síť Alexnet
Alexnet je jedna z prvních dobře fungujících neuronových sítí svého druhu. Můžeme pomocí ní např. zjistit, co se nachází na obrázku, již třemi řádky kódu. Zde jsou:
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 zřejmě upozorní na nenainstalovaný AlexNet Network support package. Instalace pomocí balíku je nejlepší způsob, jak dostat natrénovanou a popsanou neuronku do MATLABu. Pro instalaci balíku je třeba mít účet na MathWorks (zdarma).
URL adresa v kódu ukazuje na následující obrázek banánu:
Výstupem těch třech řádků kódu je úspěšné rozpoznání tohoto banánu:
CoTamJe = categorical banana
Proč je to úspěch snadněji pochopíme pomocí malé exkurze do nedaleké historie.
Stručná historie konvolučních neuronových sítí
V případě, že bychom pro detekci banánu nechtěli používat neuronové sítě, museli bychom vyřešit spoustu problémů. Obecně úloha rozpoznání něčeho v obraze je velmi netriviální.
Jak definujeme banán?
Můžeme začít s tím, že banán je žlutý, má jistý tvar, velikost a texturu. Ani jedna z těchto vlastností není u banánu pokaždé stejná a už vůbec není "banánově exkluzivní" (např. jablko může být také žluté). I v rozpoznávání čísel, kterých je jen 10 a jsou oproti objektům všedního světa jednoduchá, jsou klasické algoritmy značně nedokonalé. Při použití klasifikátoru založeném na konvolučních neuronových sítích je přesnost a rychlost lepší než u člověka samotného. Nevýhodou neuronek obecně je potřeba velkého množství dat a výpočetního výkonu pro učící fázi.
Soutěž LSVRC
Od roku 2010 existuje soutěž v klasifikaci obrázků do 1000 kategorií (ILSVRC). Jednou z těchto kategorií je i banán, nicméně objekty jsou ze širokého spektra – květiny, věci denní potřeby, psí plemena, atd... (celý list zde). V roce 2012 soutěž s výrazným náskokem vyhrála právě konvoluční neuronová síť Alexnet. Proč?
Konvoluce
Zjednodušeně řečeno – konvoluce umožňuje předzpracovat obrázky tak, že neuronová síť vyhodnocuje příznaky, které jsou zásadní pro rozpoznání objektů. Například hrany, světlost, apod. Všechny příznaky jdou těžko vyjádřit a pojmenovat a v tom je zásadní výhoda CNN (Convolutional Neural Network). Příznaky si totiž vytvoří síť sama podle toho, kterými obrázky ji naučíme. Neříkáme tedy neuronce "dívej se na vertikální hrany", ale pokud síť v procesu učení vyhodnotí, že vertikální hrany jsou důležitým příznakem pro rozpoznání bernardýna od iPodu, pak ano – neuronová síť patřičně upraví konvoluční filtry tak, aby hrany rozpoznávaly.
Sečteno podtrženo od té doby skoro všichni ILSVRC soutěžící okopírovali myšlenky, které Alexnet dokázala využít a každým rokem byla představena nová síť s novou a vylepšenou architekturou, která vedla zas o kousek blíže k přesným výsledkům. Spoustu těchto sítí můžete směte a bez zdlouhavých ceremonií v MATLABu využívat.
Také si povšimněte, že rok 2012 je přibližně doba, kdy se na scéně objevují samořídící auta a Facebook začíná s přehledem zvládat automatické označování lidí na fotografiích.
Klasifikace vlastního obrázku
Úvodní tři řádky je nutné trochu upravit, abychom zvládli klasifikovat jakýkoliv obrázek pomocí Alexnet.
Změna rozměrů
Prvním krokem je změna rozměrů obrázku na požadovaných
227x227
pixelů, což je prostě vstup celé sítě (banánový
obrázek má požadovaný rozměr, proto jsme tento krok vynechali). Ke změně
rozměrů slouží funkce imresize()
.
Pravděpodobnost
Dále by nebylo od věci rovnou vidět, jak moc si je neuronová síť
klasifikací jistá. Tato informace se dá vyčíst z druhého výstupního
parametru funkce classify()
. Jedná se o vektor o 1000 prvcích,
kteréžto se sčítají do jedničky. Maximum celého vektoru je tedy
pravděpodobnost, že klasifikace je správná.
Ukažme si náš program s těmito vylepšeními. Zbytek kódu slouží pro vypsání výsledku rovnou do obrázku:
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 je na 95,8 % jistá, že na obrázku se nachází kopretina... A ejhle, to je špatně. Na obrázku je ve skutečnosti květ Slunečnice topinambur. Když však zkusíme vyhledat v seznamu tříd Jerusalem artichoke (anglický název pro topinamburu), setkáme se s nezdarem. Topinambura prostě není jednou ze tříd, tak to neuronka namířila na kopretinu. Zde se dostáváme k jednomu z úskalí konvolučních neuronových sítí – co je nenaučíme, nevědí.
Jak vypadá a funguje Alexnet
Struktura sítě Alexnet není tajná informace. Chcete-li se na ní
podívat, slouží k tomu v MATLABu funkce analyzeNetwork()
:
net = alexnet; analyzeNetwork(net);
V následujícím textu je zjednodušující popis toho, za co jsou jednotlivé vrstvy sítě zodpovědné.
Vrstvy 1-5
- První vrstva sítě je vstupní, také má velikost,
která se rovná velikosti RGB obrázku (
227x227x3
). - Druhá vrstva je již zmíněná konvoluce neboli také
filtrace a to co se neuronka naučí jsou právě filtry (konvoluční jádra,
kernely). V tomto případě jich je 96 a mají rozměr
11x11x3
(3 protože 3 barevné kanály). - Třetí vrstvou – ReLU (Rectified Linear
Unit) projdou všechny hodnoty a pokud jsou nižší, než
0
, stane se z nich právě0
. Pokud jsou vyšší, k žádné změně nedojde. To má za následek zvýšení nelinearity (nelinearita znamená, že pokud vstup zvýšíme například 2x, výstup nebude zvětšen právě 2x). Sítě pak fungují lépe. - Čtvrtá vrstva - Normalizace umožňuje snížit odpověď neuronů, které vykazují příliš velkou aktivitu (aby to nebylo jen o nich).
- Snížení velikosti provede pátá vrstva a to tím způsobem, že z okolí (zde 3x3) vybere ten nejvyšší prvek (proto max pooling). Snížení velikosti vede ke snížení parametrů nutných k učení, tím pádem ke zvýšení rychlosti.
Vrstvy 17-25
- Vrstvy 6-16 jsou kombinací předešlých vrstev s různými parametry.
- Vrstva 17 obsahuje 4096 neuronů a každý z nich propojí s 9216 výstupy z vrstvy 16, proto se také nazývá Fully Connected.
- DropOut (vrstva 19) náhodně nastaví
jakýkoliv vstup s 50% pravděpodobností na
0
, což opět zvýší nelinearitu v systému. - Předposlední, 24. vrstva (SoftMax),
zařídí, že pravděpodobnosti klasifikace do jednotlivých tříd budou od
0
do1
a jejich součet bude také1
. - Poslední vrstva je vrstva výstupní, ze které nám vypadne kýžený výsledek.
Uvnitř sítě - Aktivace
Funkce classify()
vezme obrázek a pošle ho do Alexnet.
Obrázek postupně propadne všemi vrstvami, kde aktivuje dané neurony až do
poslední vrstvy. Tam každý neuron za sebou skýtá jednu možnou třídu
toho, co je na obrázku. Ta, která je nejvíce aktivována, je výstupem funkce
classify()
. Do celého procesu aktivace můžete nahlédnout
pomocí funkce 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, co se stalo s květinou v páté vrstvě Alexnet. Někdy je květ tmavý, někdy světlý, někdy není vidět vůbec, nebo pouze okraj. Ze souboru těchto vlastností Alexnet na konci vyhodnotí, že se jedná o kopretinu.
Závěr
Podívali jsme se na to, jak je v MATLABu jednoduché použít konvoluční neuronovou síť pro klasifikaci obrazu. Stručně jsme si vysvětlili jak a proč tyto sítě fungují. CNN se nevyužívají pouze ke klasifikaci obrázků, ale také k detekci objektů ("na souřadnicích x y se nachází chodec"), sémantické segmentaci ("tento pixel je chodec a tento pixel je jiné vozidlo"), ale také ke generování samotných obrázků apod. Pochopitelně jejich zaměření není pouze na obrazy. Používají se také u jednorozměrných signálů (zvuk, EKG, vývoj ceny Bitcoinu, a další) k podobným úlohám.
Příště si ukážeme jak neuronovou síť natrénovat na našich vlastních obrázcích.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 24x (53.64 kB)
Aplikace je včetně zdrojových kódů