Poslední aktualizace 17. dubna 2020
Konvoluční vrstvy jsou hlavními stavebními kameny používanými v konvolučních neuronových sítích.
Konvoluce je jednoduchá aplikace filtru na vstup, která vede k aktivaci. Opakovaná aplikace stejného filtru na vstup vede k mapě aktivací, která se nazývá mapa prvků, což naznačuje umístění a sílu detekovaného prvku ve vstupu, jako je obrázek.
Inovace konvolučního neurálu Networks je schopnost automaticky se učit velké množství filtrů paralelně specifických pro tréninkovou datovou sadu v rámci omezení konkrétního problému prediktivního modelování, jako je klasifikace obrázků. Výsledkem jsou vysoce specifické funkce, které lze detekovat kdekoli na vstupních obrázcích.
V tomto výukovém programu zjistíte, jak konvoluce fungují v konvoluční neuronové síti.
Po dokončení tohoto výukového programu budete vědět:
- Konvoluční neuronové sítě použijí filtr na vstup a vytvoří mapu prvků, která shrnuje přítomnost detekovaných prvků na vstupu.
- Filtry lze ručně vytvořit , jako jsou detektory čar, ale inovace konvolučních neuronových sítí spočívá v osvojení filtrů během tréninku v kontextu konkrétního problému predikce.
- Jak vypočítat mapu funkcí pro jednorozměrné a dvourozměrné konvoluční vrstvy v konvoluční neuronové síti.
Zahajte svůj projekt svou novou knihou Deep Learning for Computer Vision, včetně podrobných návodů a souborů zdrojových kódů Pythonu pro všechny příklady.
Začněme.
Jemný Úvod do konvolučních vrstev pro hluboké učení neuronových sítí
Fotografie od mendhak, některá práva vyhrazena.
Výukový program
Tento výukový program je rozdělen do čtyř částí; jsou to:
- Konvoluce v konvolučních neuronových sítích
- Konvoluce v počítačovém vidění
- Síla naučených filtrů
- Pracoval Příklad Konvoluční vrstvy
Chcete výsledky s Deep Learning pro počítačové vidění?
Take my nyní bezplatný 7denní e-mailový havarijní kurz (se ukázkovým kódem).
Kliknutím se zaregistrujete a získáte také bezplatnou verzi kurzu Ebook ve formátu PDF.
Stáhněte si svůj mini mini ZDARMA Course
Konvoluce v konvolučních neuronových sítích
Konvoluční neurální síť, zkráceně CNN, je specializovaný typ modelu neuronové sítě určený pro práci s dvourozměrnými obrazovými daty, i když je lze použít s jednorozměrnými a trojrozměrnými daty.
Středem konvoluční neurální sítě je konvoluční vrstva, která dává síti její název. Tato vrstva provádí operaci zvanou „konvoluce“.
V kontextu konvoluční neurální sítě je konvoluce lineární operace, která zahrnuje násobení množiny vah se vstupem, podobně jako tradiční nervová síť. Vzhledem k tomu, že tato technika byla navržena pro dvourozměrný vstup, je množení prováděno mezi polem vstupních dat a dvourozměrným polem váh, které se nazývá filtr nebo jádro.
Filtr je menší než vstupní data a typ násobení aplikovaný mezi filtrem velikosti vstupu a filtrem je tečkovaný produkt. Tečkový produkt je elementární multiplikace mezi patchem velikosti filtru na vstupu a filtru, který je poté sečten, což vždy vede k jedné hodnotě. Protože má za následek jednu hodnotu, operace se často označuje jako „skalární součin“.
Použití filtru menšího než vstup je záměrné, protože umožňuje použití stejného filtru (sady vah). vynásobeno vstupním polem několikrát v různých bodech na vstupu. Konkrétně se filtr systematicky aplikuje na každou překrývající se část nebo záplatu vstupních dat o velikosti filtru, zleva doprava, shora dolů.
Tato systematická aplikace stejného filtru na obrázek je skvělý nápad . Pokud je filtr navržen tak, aby detekoval určitý typ prvku ve vstupu, pak použití tohoto filtru systematicky napříč celým vstupním obrazem umožňuje filtru příležitost objevit tento prvek kdekoli na obrázku. Tato schopnost se běžně označuje jako překladová invariance, např. obecný zájem na tom, zda je prvek přítomen, spíše než na tom, kde byl přítomen.
Invariance k místnímu překladu může být velmi užitečnou vlastností, pokud nám záleží více na zda je nějaká vlastnost přítomna, než přesně tam, kde je.Například při určování, zda obrázek obsahuje obličej, nemusíme znát umístění očí s dokonalou pixelovou přesností, musíme jen vědět, že na levé straně obličeje je oko a na pravé straně strana obličeje.
– Strana 342, Deep Learning, 2016.
Výstup z vynásobení filtru vstupním polem jednou je jedna hodnota. Protože je filtr na vstupní pole použit vícekrát, výsledkem je dvourozměrné pole výstupních hodnot, které představují filtrování vstupu. Jako takové se dvourozměrné výstupní pole z této operace nazývá „mapa prvků“.
Jakmile je vytvořena mapa prvků, můžeme každou hodnotu v mapě prvků předat nelinearitou, například ReLU, podobně jako pro výstupy plně připojené vrstvy.
Příklad filtru Aplikováno na dvourozměrný vstup k vytvoření mapy prvků
Pokud pocházíte z pole zpracování digitálního signálu nebo související oblasti matematiky, můžete konvoluční operaci na matici chápat jako něco jiného . Konkrétně se filtr (jádro) před použitím na vstup převrátí. Technicky je konvoluce popsaná v použití konvolučních neuronových sítí ve skutečnosti „vzájemnou korelací“. V hlubokém učení se však označuje jako „konvoluční“ operace.
Mnoho knihoven strojového učení implementuje vzájemnou korelaci, ale říká se tomu konvoluce.
– Strana 333, Deep Learning, 2016.
Stručně řečeno, máme vstup, například obrázek hodnot pixelů, a máme filtr, který je sadou vah, a filtr je systematicky aplikován na vstupní data k vytvoření mapy prvků .
Konvoluce v počítačovém vidění
Myšlenka použití konvoluční operace na obrazová data není pro konvoluční neuronové sítě nová nebo jedinečná; jedná se o běžnou techniku používanou v počítačovém vidění.
Historicky byly filtry navrženy ručně odborníky na počítačové vidění, které byly poté aplikovány na obrázek a výsledkem byla mapa prvků nebo výstup z aplikace filtru, který pak vytvoří analýza obrazu je nějakým způsobem snazší.
Níže je například ručně vytvořený filtr prvků 3 × 3 pro detekci svislých čar:
1
2
3
|
0,0, 1,0, 0,0
0,0, 1,0, 0,0
0,0, 1,0, 0,0
|
Použití tohoto filtru na Výsledkem obrázku bude mapa prvků, která obsahuje pouze svislé čáry. Jedná se o detektor svislé čáry.
Můžete to vidět z hodnot hmotnosti ve filtru; jakékoli hodnoty pixelů ve středové svislé čáře budou aktivovány pozitivně a všechny na obou stranách budou negativně aktivovány. Systematické přetažení tohoto filtru přes hodnoty pixelů v obrázku může zvýraznit pouze pixely svislé čáry.
Lze také vytvořit detektor vodorovných čar a také jej použít na obrázek, například:
1
2
3
|
0,0, 0,0, 0,0
1.0, 1.0, 1.0
0,0, 0,0, 0,0
|
Kombinace výsledků z obou filtrů, např kombinování obou map funkcí bude mít za následek zvýraznění všech čar v obrázku.
Pro detekci dalších funkcí v obrázku lze navrhnout sadu desítek nebo dokonce stovek dalších malých filtrů.
Inovace použití konvoluční operace v neuronové síti spočívá v tom, že hodnoty filtru jsou váhy, které je třeba se naučit během tréninku sítě.
Síť se naučí, jaké typy funkcí mají výpis ze vstupu. Konkrétně při tréninku pod stochastickým klesáním je síť nucena naučit se z obrazu extrahovat funkce, které minimalizují ztrátu konkrétního úkolu, který síť trénuje, například extrahujte funkce, které jsou nejužitečnější pro klasifikaci obrázků jako psů nebo koček.
V této souvislosti vidíte, že se jedná o silný nápad.
Síla naučených filtrů
Naučit se jeden filtr specifický pro úlohu strojového učení je mocná technika.
Konvoluční neuronové sítě však v praxi dosahují mnohem více .
Více filtrů
Konvoluční neuronové sítě nenaučí jediný filtr; ve skutečnosti se u daného vstupu učí více funkcí paralelně.
Například je běžné, že se konvoluční vrstva učí pro daný vstup paralelně od 32 do 512 filtrů.
To dává modelu 32 nebo dokonce 512 různé způsoby extrakce funkcí ze vstupu nebo mnoho různých způsobů „učení se vidění“ a po tréninku mnoho různých způsobů „vidění“ vstupních dat.
Tato rozmanitost umožňuje specializaci, např nejen čáry, ale konkrétní čáry, které vidíte ve svých konkrétních tréninkových datech.
Více kanálů
Barevné obrázky mají více kanálů, obvykle jeden pro každý barevný kanál, například červený, zelený, a modré.
Z pohledu dat to znamená, že jeden obrázek poskytnutý jako vstup do modelu jsou ve skutečnosti tři obrázky.
Filtr musí mít vždy stejný počet kanálů jako vstup, často označovaný jako „hloubka“. Pokud má vstupní obraz 3 kanály (např. Hloubku 3), musí mít filtr aplikovaný na tento obraz také 3 kanály (např. Hloubku 3). V tomto případě by filtr 3 × 3 byl ve skutečnosti 3x3x3 nebo pro řádky, sloupce a hloubku. Bez ohledu na hloubku vstupu a hloubku filtru se filtr použije na vstup pomocí operace bodového produktu, která vede k jediné hodnotě.
To znamená, že pokud má konvoluční vrstva 32 filtrů, těchto 32 filtrů není pouze dvourozměrných pro vstup do dvourozměrného obrazu, ale jsou také trojrozměrné a mají specifické hmotnosti filtrů pro každý ze tří kanálů. Každý filtr přesto vede k jedné mapě funkcí. Což znamená, že hloubka výstupu aplikace konvoluční vrstvy s 32 filtry je 32 pro 32 vytvořených map funkcí.
Více vrstev
Konvoluční vrstvy se nepoužívají pouze na vstupní data např hodnoty surových pixelů, ale lze je použít i na výstup z jiných vrstev.
Stoh konvolučních vrstev umožňuje hierarchický rozklad vstupu.
Vezměte v úvahu, že fungující filtry přímo na surových hodnotách pixelů se naučí extrahovat nízkoúrovňové prvky, jako jsou řádky.
Filtry, které fungují na výstupu z prvních řádkových vrstev, mohou extrahovat prvky, které jsou kombinacemi nižších úrovní například prvky, které obsahují více čar k vyjádření tvarů.
Tento proces pokračuje, dokud velmi hluboké vrstvy nevytahují tváře, zvířata, domy atd.
To je přesně to, co vidíme v praxi. Abstrakce funkcí do vyšších a vyšších řádů, jak se zvyšuje hloubka sítě.
Pracovaný příklad konvolučních vrstev
Knihovna hlubokého učení Keras poskytuje sadu konvolučních vrstev.
Konvoluční operaci můžeme lépe pochopit tím, že se podíváme na některé zpracované příklady s vytvořenými daty a ručně vytvořenými filtry.
V této části se podíváme na jednorozměrnou konvoluční vrstvu a příklad dvourozměrné konvoluční vrstvy, který umožňuje konvoluční operaci konkrétně a poskytuje fungující příklad použití vrstev Keras.
Příklad 1D konvoluční vrstvy
Můžeme definovat jedno- dimenzionální vstup, který má osm prvků, všechny s hodnotou 0,0, s dvojitým nárazem uprostřed s hodnotami 1,0.
1
|
|
Vstup pro Keras musí být trojrozměrný pro 1D konvoluční vrstvu.
První dimenze odkazuje na každý vstupní vzorek; v tomto případě máme pouze jeden vzorek. Druhá dimenze se týká délky každého vzorku; v tomto případě je délka osm. Třetí dimenze se týká počtu kanálů v každém vzorku; v tomto případě máme pouze jeden kanál.
Proto bude mít tvar vstupního pole tvar.
1
2
3
|
# definovat vstup data
data = asarray ()
data = data.reshape (1, 8, 1)
|
Definujeme model, který očekává, že vstupní vzorky budou mít tvar.
Model bude mít jeden filtr s tvar 3 nebo tři prvky široké. Keras označuje tvar filtru jako velikost jádra.
1
2
3
|
# vytvořit model
model = Sequential ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))
|
Ve výchozím nastavení jsou filtry v konvoluční vrstvě inicializovány s náhodnými váhami. V tomto vymyšleném příkladu ručně zadáme váhy pro jeden filtr. Definujeme filtr, který je schopen detekovat nerovnosti, což je vysoká vstupní hodnota obklopená nízkými vstupními hodnotami, jak jsme definovali v našem příkladu vstupu.
Filtr tří prvků, který definujeme, vypadá takto:
1
|
|
Konvoluční vrstva má také vstupní hodnotu zkreslení, která také vyžaduje váhu, kterou nastavíme na nulu.
Proto můžeme vynutit váhy naší jednorozměrné konvoluční vrstvy k použití našeho ručně vyrobeného filtru následujícím způsobem:
Váhy musí být uvedeny v trojrozměrná struktura, pokud jde o řádky, sloupce a kanály. Filtr má jeden řádek, tři sloupce a jeden kanál.
Můžeme načíst váhy a potvrdit, že byly správně nastaveny.
1
2
|
# potvrdit, že byly uloženy
print (model.get_weights ())
|
Nakonec můžeme na naše vstupní údaje použít jediný filtr.
Můžeme toho dosáhnout voláním funkce predikce () na modelu. Tím se vrátí mapa prvků přímo: to je výstup systematického použití filtru ve vstupní sekvenci.
1
2
3
|
# použít filtr na vstupní data
yhat = model.predict (data)
print (yhat )
|
Když to všechno spojíte dohromady, kompletní příklad je uvedené níže.
Spuštěním příkladu se nejprve vytisknou váhy sítě; to je potvrzení, že náš ručně vyrobený filtr byl v modelu nastaven tak, jak jsme očekávali.
Dále se filtr použije na vstupní vzor a mapa prvků se vypočítá a zobrazí. Z hodnot mapy prvků vidíme, že náraz byl detekován správně.
1
2
3
4
5
6
7
8
9
10
|
],
],
]], dtype = float32), pole (, dtype = float32)]
]]
|
Podívejme se blíže na to, co se zde stalo.
Připomeňme si, že vstup je osm elementový vektor s hodnotami:.
Nejprve byl tříprvkový filtr použit na první tři vstupy v vloženo výpočtem tečkového produktu (operátor „.“), jehož výsledkem je jedna výstupní hodnota v mapě funkcí nuly.
1
2
|
z numpy import asarray
print (asarray (). dot (asarray ()))
|
V našem manuálním příkladu je to následující:
1
|
. = 0
|
Filtr byl poté přesunut podél jednoho prvku vstupní sekvence a proces se opakoval; konkrétně byl stejný filtr použit na vstupní sekvenci v indexech 1, 2 a 3, což také vedlo k nulovému výstupu v mapě funkcí.
1
|
. = 0
|
Jsme systematičtí, takže opět filtr se přesune podél dalšího prvku vstupu a použije se na vstup v indexech 2, 3 a 4. Tentokrát je výstupem hodnota jednoho v mapě prvků. Zjistili jsme funkci a vhodně ji aktivovali.
1
|
. = 1
|
Proces se opakuje, dokud nevypočítáme celý mapa funkcí.
1
|
|
Upozorňujeme, že mapa prvků má šest prvků, zatímco náš vstup má osm prvků. Toto je artefakt toho, jak byl filtr použit na vstupní sekvenci. Existují i jiné způsoby, jak použít filtr na vstupní sekvenci, která mění tvar výsledné mapy prvků, jako je výplň, ale v tomto příspěvku nebudeme o těchto metodách hovořit.
Můžete si to představit s různými vstupy, můžeme detekovat prvek s větší či menší intenzitou as různými váhami ve filtru, že bychom detekovali různé prvky ve vstupní sekvenci.
Příklad 2D konvoluční vrstvy
Příklad detekce nerovností v předchozí části můžeme rozšířit na detektor svislých čar v dvourozměrném obrazu.
Znovu , můžeme omezit vstup, v tomto případě na čtvercový vstupní obraz 8 × 8 pixelů s jedním kanálem (např. ve stupních šedi) s jedinou svislou čarou uprostřed.
1
2
3
4
5
6
7
8
|
|
Vstup do vrstvy Conv2D musí být čtyřrozměrný.
První dimenze definuje vzorky; v tomto případě existuje pouze jeden vzorek. Druhá dimenze definuje počet řádků; v tomto případě osm. Třetí dimenze definuje počet sloupců, v tomto případě opět osm, a nakonec počet kanálů, který je v tomto případě jeden.
Proto musí mít vstup čtyřrozměrný tvar nebo v tomto případě případ.
Definujeme Conv2D s jediným filtrem, jako jsme to udělali v předchozí části s příkladem Conv1D.
Filtr bude dvourozměrný a čtvercový s tvarem 3 × 3. Vrstva bude očekávat, že vstupní vzorky budou mít tvar nebo.
1
2
3
|
# create model
model = Sequential ()
model.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))
|
Definujeme vertikální filtr detektoru řádků pro detekci jedné svislé čáry v našich vstupních datech.
Filtr vypadá takto:
1
2
3
|
0, 1, 0
0, 1, 0
0, 1, 0
|
Můžeme to implementovat takto:
Nakonec uděláme aplikujte filtr na vstupní obrázek, což povede k mapě prvků, u nichž bychom očekávali, že ve vstupním obrázku budou detekovány svislé čáry.
1
2
|
# použít filtr na vstupní data
yhat = model.predict (data)
|
Tvar výstupu mapy prvků bude s tvarem čtyřrozměrný. Budeme provádět jednu dávku a máme jediný filtr (jeden filtr a jeden vstupní kanál), proto je výstupní tvar. Můžeme pěkně vytisknout obsah jedné mapy funkcí takto:
1
2
3
|
pro r v rozsahu (yhat.shape):
# tisknout každý sloupec v řádku
tisk (pro c v rozsahu ( yhat.shape)])
|
Toto vše spojit dohromady , kompletní příklad je uveden níže.
Spuštění příkladu nejprve potvrdí, že ručně vytvořený filtr byl správně definován ve váhách vrstev.
Dále se vytiskne vypočítaná mapa prvků. Z měřítka čísel vidíme, že filtr skutečně detekoval jedinou svislou čáru se silnou aktivací uprostřed mapy prvků.
Podívejme se blíže na to, co bylo vypočítáno.
Nejprve byl filtr použit v levém horním rohu obrázku nebo v obrazové záplatě prvků 3 × 3. Technicky je obrazová oprava trojrozměrná s jedním kanálem a filtr má stejné rozměry. To nemůžeme implementovat v NumPy pomocí funkce dot (), místo toho musíme použít funkci tensordot (), abychom mohli vhodně sčítat napříč všemi dimenzemi, například:
Výsledkem tohoto výpočtu je jedna výstupní hodnota 0,0, např. funkce nebyla detekována. To nám dává první prvek v levém horním rohu mapy prvků.
Ručně by to vypadalo takto:
1
2
3
|
0, 1, 0 0, 0, 0
0, 1, 0. 0, 0, 0 = 0
0, 1, 0 0, 0, 0
|
Filtr se přesune podél jednoho sloupce doleva a postup se opakuje. Funkce opět není detekována.
1
2
3
|
0, 1, 0 0, 0, 1
0, 1, 0. 0, 0, 1 = 0
0, 1, 0 0, 0, 1
|
Ještě jeden tah doleva do dalšího sloupce a funkce je detekována poprvé, což má za následek silnou aktivaci.
1
2
3
|
0, 1, 0 0, 1, 1
0, 1, 0. 0, 1, 1 = 3
0, 1, 0 0, 1, 1
|
Tento proces se opakuje, dokud se okraj filtru neopře o okraj nebo poslední sloupec vstupního obrázku. Získáte tak poslední prvek v prvním úplném řádku mapy funkcí.
1
|
|
Filtr se poté posune o jeden řádek dolů a zpět k prvnímu sloupci a proces souvisí zleva doprava, čímž se získá druhý řádek mapy prvků. A dokud nebude spodní část filtru spočívat na spodní nebo poslední řadě vstupního obrázku.
Opět, stejně jako v předchozí části, vidíme, že mapa prvků je matice 6 × 6, menší než vstupní obrázek 8 × 8 z důvodu omezení způsobu, jakým lze filtr použít na vstupní obrázek.
Další čtení
Tato část poskytuje více zdrojů k tématu, pokud jste chtějí jít hlouběji.
Příspěvky
- Crash Course v konvolučních neuronových sítích pro strojové učení
Knihy
- Kapitola 9: Konvoluční sítě, Deep Learning, 2016.
- Kapitola 5: Deep Learning for Computer Vision, Deep Learning with Python, 2017.
API
- Keras Convolutional Layers API
- numpy.asarray API
Shrnutí
V tomto výukovém programu jste objevili jak konvoluce fungují v konvoluční neurální síti.
Konkrétně jste se dozvěděli:
- Konvoluční neuronové sítě použijí filtr na vstup k vytvoření mapy prvků, která shrnuje přítomnost detekovaných prvků ve vstupu.
- Filtry mohou být vyráběny ručně, například detektory čar, ale inovace konvolučních neuronových sítí spočívá v osvojení filtrů během tréninku v kontextu konkrétního problému predikce.
- Jak vypočítat mapa prvků pro jednorozměrné a dvourozměrné konvoluční vrstvy v konvoluční neuronové síti.
Máte nějaké dotazy?
Zeptejte se na své dotazy v komentářích níže a já udělám své nejlépe odpovědět.
Vyvíjejte modely hlubokého učení pro Vision Today!
Rozvíjejte své vlastní modely vidění během několika minut
… s několika řádky kódu pythonu
Zjistěte, jak v mé nové Ebook:
Hluboké učení pro počítačové vidění
Poskytuje výukové materiály pro samostudium na témata jako:
klasifikace, detekce objektů (yolo a rcnn), rozpoznávání tváře (vggface a facenet) , příprava dat a mnoho dalšího …
Konečně přeneste hluboké učení do svých vize projektů
Přeskočit akademické pracovníky. Jen výsledky.
Podívejte se, co je uvnitř