Při trénování CNN je jedním z problémů, že potřebujeme velké množství označených dat. V případě klasifikace obrázků musíme obrázky rozdělit do různých tříd, což je manuální práce.
Nicméně bychom mohli chtít použít surová (neoznačená) data pro trénování extraktorů funkcí CNN, což se nazývá self-supervised learning (samostatně řízené učení). Místo štítků použijeme trénovací obrázky jako vstup i výstup sítě. Hlavní myšlenkou autoenkodéru je, že budeme mít enkodérovou síť, která převádí vstupní obrázek do nějakého latentního prostoru (obvykle je to jen vektor menší velikosti), a poté dekodérovou síť, jejímž cílem bude rekonstruovat původní obrázek.
✅ Autoenkodér je "typ umělé neuronové sítě používané k učení efektivního kódování neoznačených dat."
Protože trénujeme autoenkodér, aby zachytil co nejvíce informací z původního obrázku pro přesnou rekonstrukci, síť se snaží najít nejlepší embedding vstupních obrázků, aby zachytila jejich význam.
Obrázek z blogu Keras
Ačkoli samotná rekonstrukce původních obrázků nemusí být užitečná, existuje několik scénářů, kde jsou autoenkodéry obzvláště užitečné:
- Snížení dimenze obrázků pro vizualizaci nebo trénování obrazových embeddingů. Autoenkodéry obvykle poskytují lepší výsledky než PCA, protože berou v úvahu prostorovou povahu obrázků a hierarchické funkce.
- Odstraňování šumu, tj. odstranění šumu z obrázku. Protože šum obsahuje mnoho zbytečných informací, autoenkodér nemůže vše vměstnat do relativně malého latentního prostoru, a tak zachytí pouze důležité části obrázku. Při trénování odstraňovačů šumu začínáme s původními obrázky a používáme obrázky s uměle přidaným šumem jako vstup pro autoenkodér.
- Super-rezoluce, zvýšení rozlišení obrázku. Začínáme s obrázky ve vysokém rozlišení a používáme obrázek s nižším rozlišením jako vstup pro autoenkodér.
- Generativní modely. Jakmile autoenkodér vytrénujeme, dekodérovou část můžeme použít k vytvoření nových objektů na základě náhodných latentních vektorů.
Tradiční autoenkodéry nějakým způsobem snižují dimenzi vstupních dat a zjišťují důležité vlastnosti vstupních obrázků. Latentní vektory však často nedávají příliš smysl. Jinými slovy, pokud vezmeme dataset MNIST jako příklad, zjistit, které číslice odpovídají různým latentním vektorům, není snadný úkol, protože blízké latentní vektory nemusí nutně odpovídat stejným číslicím.
Na druhou stranu, pro trénování generativních modelů je lepší mít nějaké pochopení latentního prostoru. Tato myšlenka nás vede k variabilnímu autoenkodéru (VAE).
VAE je autoenkodér, který se učí předpovídat statistické rozložení latentních parametrů, tzv. latentní rozložení. Například můžeme chtít, aby latentní vektory byly normálně rozloženy s nějakým průměrem zmean a směrodatnou odchylkou zsigma (průměr i směrodatná odchylka jsou vektory určité dimenze d). Enkodér ve VAE se učí předpovídat tyto parametry a dekodér poté vezme náhodný vektor z tohoto rozložení k rekonstrukci objektu.
Shrnutí:
- Ze vstupního vektoru předpovídáme
z_meanaz_log_sigma(místo předpovídání samotné směrodatné odchylky předpovídáme její logaritmus) - Vzorkujeme vektor
samplez rozložení N(zmean,exp(zlog_sigma)) - Dekodér se snaží dekódovat původní obrázek pomocí
samplejako vstupního vektoru
Obrázek z tohoto blogového příspěvku od Isaaka Dykemana
Variabilní autoenkodéry používají složitou ztrátovou funkci, která se skládá ze dvou částí:
- Ztráta rekonstrukce je ztrátová funkce, která ukazuje, jak blízko je rekonstruovaný obrázek cíli (může to být Mean Squared Error, nebo MSE). Je to stejná ztrátová funkce jako u běžných autoenkodérů.
- KL ztráta, která zajišťuje, že rozložení latentních proměnných zůstává blízko normálnímu rozložení. Je založena na pojmu Kullback-Leiblerovy divergence - metriky pro odhad podobnosti dvou statistických rozložení.
Jednou z důležitých výhod VAE je, že nám umožňují relativně snadno generovat nové obrázky, protože víme, z jakého rozložení vzorkovat latentní vektory. Například pokud trénujeme VAE s 2D latentním vektorem na MNIST, můžeme poté měnit komponenty latentního vektoru, abychom získali různé číslice:
Obrázek od Dmitrije Soshnikova
Pozorujte, jak se obrázky prolínají, když začneme získávat latentní vektory z různých částí latentního prostoru parametrů. Tento prostor můžeme také vizualizovat ve 2D:
Obrázek od Dmitrije Soshnikova
Zjistěte více o autoenkodérech v těchto odpovídajících noteboocích:
- Specifické pro data - fungují dobře pouze s typem obrázků, na kterých byly trénovány. Například pokud trénujeme síť pro super-rezoluce na květinách, nebude dobře fungovat na portrétech. Je to proto, že síť může vytvořit obrázek ve vyšším rozlišení tím, že vezme jemné detaily z funkcí naučených z trénovacího datasetu.
- Ztrátové - rekonstruovaný obrázek není stejný jako původní obrázek. Povaha ztráty je definována ztrátovou funkcí použitou během trénování.
- Funguje na neoznačených datech
V této lekci jste se naučili o různých typech autoenkodérů dostupných pro vědce v oblasti AI. Naučili jste se, jak je vytvořit a jak je použít k rekonstrukci obrázků. Také jste se naučili o VAE a jak je použít k generování nových obrázků.
V této lekci jste se naučili používat autoenkodéry pro obrázky. Ale mohou být použity i pro hudbu! Podívejte se na projekt Magenta MusicVAE, který používá autoenkodéry k učení rekonstrukce hudby. Udělejte si experimenty s touto knihovnou a zjistěte, co můžete vytvořit.
Pro referenci si přečtěte více o autoenkodérech v těchto zdrojích:
- Vytváření autoenkodérů v Keras
- Blogový příspěvek na NeuroHive
- Vysvětlení variabilních autoenkodérů
- Podmíněné variabilní autoenkodéry
Na konci tohoto notebooku s TensorFlow najdete 'úkol' - použijte jej jako své zadání.



