Skip to content

Latest commit

 

History

History
100 lines (56 loc) · 7.88 KB

File metadata and controls

100 lines (56 loc) · 7.88 KB

Autoencoders

När vi tränar CNNs är ett av problemen att vi behöver mycket märkt data. När det gäller bildklassificering måste vi dela upp bilder i olika klasser, vilket är en manuell process.

Men vi kanske vill använda rå (omärkt) data för att träna CNN-funktionsextraktorer, vilket kallas självövervakad inlärning. Istället för etiketter använder vi träningsbilder som både nätverksinmatning och -utmatning. Huvudidén med en autoencoder är att vi har ett encoder-nätverk som omvandlar inmatningsbilden till någon latent space (vanligtvis är det bara en vektor av mindre storlek), och sedan ett decoder-nätverk, vars mål är att rekonstruera den ursprungliga bilden.

✅ En autoencoder är "en typ av artificiellt neuralt nätverk som används för att lära sig effektiva kodningar av omärkt data."

Eftersom vi tränar en autoencoder för att fånga så mycket information som möjligt från den ursprungliga bilden för en korrekt rekonstruktion, försöker nätverket hitta den bästa embedding av inmatningsbilder för att fånga dess betydelse.

AutoEncoder Diagram

Bild från Keras blog

Scenarier för att använda Autoencoders

Även om att rekonstruera ursprungliga bilder inte verkar användbart i sig självt, finns det några scenarier där autoencoders är särskilt användbara:

  • Minska dimensionen på bilder för visualisering eller träna bildembeddings. Vanligtvis ger autoencoders bättre resultat än PCA, eftersom de tar hänsyn till bilders spatiala natur och hierarkiska funktioner.
  • Denoising, dvs. ta bort brus från bilden. Eftersom brus innehåller mycket onödig information kan autoencodern inte passa in allt i det relativt lilla latenta utrymmet, och fångar därför bara den viktiga delen av bilden. När vi tränar brusreducerare börjar vi med ursprungliga bilder och använder bilder med artificiellt tillagt brus som inmatning för autoencodern.
  • Superupplösning, öka bildens upplösning. Vi börjar med högupplösta bilder och använder bilden med lägre upplösning som autoencoderns inmatning.
  • Generativa modeller. När vi har tränat autoencodern kan den dekoderande delen användas för att skapa nya objekt från slumpmässiga latenta vektorer.

Variational Autoencoders (VAE)

Traditionella autoencoders minskar dimensionen på inmatningsdata på något sätt och identifierar viktiga funktioner i inmatningsbilder. Men latenta vektorer är ofta svåra att tolka. Med andra ord, om vi tar MNIST-datasetet som exempel, är det inte enkelt att avgöra vilka siffror som motsvarar olika latenta vektorer, eftersom närliggande latenta vektorer inte nödvändigtvis motsvarar samma siffror.

För att träna generativa modeller är det däremot bättre att ha en viss förståelse för det latenta utrymmet. Denna idé leder oss till variational autoencoder (VAE).

VAE är en autoencoder som lär sig att förutsäga statistisk fördelning av de latenta parametrarna, den så kallade latenta fördelningen. Till exempel kanske vi vill att latenta vektorer ska vara normalt fördelade med en viss medelvärde zmean och standardavvikelse zsigma (både medelvärde och standardavvikelse är vektorer med en viss dimension d). Encoder i VAE lär sig att förutsäga dessa parametrar, och sedan tar decodern en slumpmässig vektor från denna fördelning för att rekonstruera objektet.

Sammanfattningsvis:

  • Från inmatningsvektorn förutsäger vi z_mean och z_log_sigma (istället för att förutsäga standardavvikelsen direkt, förutsäger vi dess logaritm)
  • Vi samplar en vektor sample från fördelningen N(zmean,exp(zlog_sigma))
  • Decodern försöker avkoda den ursprungliga bilden med sample som inmatningsvektor

Bild från denna blogginlägg av Isaak Dykeman

Variational autoencoders använder en komplex förlustfunktion som består av två delar:

  • Rekonstruktionsförlust är förlustfunktionen som visar hur nära en rekonstruerad bild är målet (det kan vara Mean Squared Error, eller MSE). Det är samma förlustfunktion som i vanliga autoencoders.
  • KL-förlust, som säkerställer att latenta variabelns fördelning förblir nära normalfördelning. Den baseras på begreppet Kullback-Leibler divergence - en metrik för att uppskatta hur lika två statistiska fördelningar är.

En viktig fördel med VAEs är att de gör det relativt enkelt att generera nya bilder, eftersom vi vet vilken fördelning vi ska sampla latenta vektorer från. Till exempel, om vi tränar en VAE med en 2D latent vektor på MNIST, kan vi sedan variera komponenterna i den latenta vektorn för att få olika siffror:

vaemnist

Bild av Dmitry Soshnikov

Observera hur bilderna smälter samman när vi börjar få latenta vektorer från olika delar av det latenta parameterutrymmet. Vi kan också visualisera detta utrymme i 2D:

vaemnist cluster

Bild av Dmitry Soshnikov

✍️ Övningar: Autoencoders

Lär dig mer om autoencoders i dessa motsvarande notebooks:

Egenskaper hos Autoencoders

  • Dataspecifika - de fungerar bara bra med den typ av bilder de har tränats på. Till exempel, om vi tränar ett nätverk för superupplösning på blommor, kommer det inte att fungera bra på porträtt. Detta beror på att nätverket kan producera högupplösta bilder genom att ta fina detaljer från funktioner som lärts från träningsdatasetet.
  • Förlustfyllda - den rekonstruerade bilden är inte densamma som den ursprungliga bilden. Förlustens natur definieras av den förlustfunktion som används under träningen.
  • Fungerar på omärkt data

Slutsats

I denna lektion lärde du dig om de olika typerna av autoencoders som finns tillgängliga för AI-forskaren. Du lärde dig hur man bygger dem och hur man använder dem för att rekonstruera bilder. Du lärde dig också om VAE och hur man använder det för att generera nya bilder.

🚀 Utmaning

I denna lektion lärde du dig om att använda autoencoders för bilder. Men de kan också användas för musik! Kolla in Magenta-projektets MusicVAE-projekt, som använder autoencoders för att lära sig att rekonstruera musik. Gör några experiment med detta bibliotek för att se vad du kan skapa.

Granskning & Självstudier

För referens, läs mer om autoencoders i dessa resurser:

Uppgift

I slutet av denna notebook med TensorFlow hittar du en 'uppgift' - använd detta som din uppgift.