Autoenkooderi TensorFlow'ssa esimerkin kanssa

โšก ร„lykรคs yhteenveto

Autoenkooderit pakkaavat syรถtteen pienemmรคksi sisรคiseksi esitykseksi ja rakentavat sen sitten uudelleen oppien tรคrkeimmรคt ominaisuudet ilman merkintรถjรค. Tรคmรค lรคpikรคynti pinoaa neljรค tiheรครค TensorFlow-kerrosta ja rekonstruoi CIFAR-10-hevoskuvia.

  • ๐Ÿ”˜ Kooderi ja dekooderi: Kaksi symmetristรค lohkoa kohtaavat kapealla koodauskerroksella, joka pakottaa verkon sรคilyttรคmรครคn vain olennaisen signaalin.
  • โ˜‘๏ธ Aineistovalmistelu: CIFAR-10-erรคt ladataan, muunnetaan harmaasรคvykuviksi, pinotaan ja suodatetaan alas 5 000 hevoskuvaan asti.
  • โœ… Syรถttรถputki: Dataset-estimaattori, joka kรคyttรครค from_tensor_slices-, repeat- ja batch-metodeja, toimittaa kuvia alustettavan iteraattorin kautta.
  • ๐Ÿงช Verkon muoto: Kerrosleveydet ovat 1024, 300, 150, 300 ja 1024, ja niissรค on ELU-aktivointi, Xavier-alustus ja L2-regularisointi.
  • ๐Ÿ› ๏ธ Harjoitusasetukset: Tulosteen ja syรถtteen vรคlinen keskimรครคrรคinen neliรถvirhe, Adam-optimoija, erรคkoko 150 ja 33 iteraatiota epookkia kohden.
  • ๐Ÿ“‰ Mitattu tulos: 100 epookin aikana harjoitushรคvikki putoaa 2 934:stรค noin 1 454:รครคn ennen rekonstruktion piirtรคmistรค.

Autoenkooderi TensorFlow'ssa

Mikรค on Autoencoder in Deep Learning?

An Automaattinen kooderi on tyรถkalu datakoodauksen tehokkaaseen oppimiseen valvomatta tavalla. Se on erรครคnlainen keinotekoinen hermoverkko joka auttaa sinua oppimaan tietojoukkojen esitystavan dimensionaalisuuden vรคhentรคmiseksi kouluttamalla neuroverkon jรคttรคmรครคn huomiotta signaalikohinan. Se on loistava tyรถkalu syรถtteen uudelleenluomiseen.

Yksinkertaisesti sanottuna kone ottaa esimerkiksi kuvan ja voi tuottaa lรคheisesti siihen liittyvรคn kuvan. Tรคllaisen neuroverkon syรถte on nimeรคmรคtรถn, mikรค tarkoittaa, ettรค verkko pystyy oppimaan ilman valvontaa. Tarkemmin sanottuna verkko koodaa syรถtteen keskittyen vain kriittisimpรครคn ominaisuuteen. Tรคmรค on yksi syy siihen, miksi autoenkooderit ovat suosittuja dimensioiden vรคhentรคmisessรค. Lisรคksi autoenkoodereita voidaan kรคyttรครค generatiivisten oppimismallien tuottamiseen. Esimerkiksi neuroverkkoa voidaan kouluttaa joukolla pintoja ja sitten se voi tuottaa uusia pintoja.

Kuinka TensorFlow Autoencoder toimii?

Autoenkooderin tarkoitus on tuottaa likiarvo syรถtteestรค keskittymรคllรค vain oleellisiin ominaisuuksiin. Saatat ajatella, miksi et vain opettele kopioimaan ja liittรคmรครคn syรถte tulosteen tuottamiseksi. Itse asiassa automaattinen kooderi on joukko rajoitteita, jotka pakottavat verkon oppimaan uusia tapoja esittรครค dataa, toisin kuin pelkkรค tulosteen kopioiminen.

Tyypillinen autoenkooderi mรครคritellรครคn syรถtteellรค, sisรคisellรค esityksellรค ja tulosteella (syรถtteen approksimaatio). Oppiminen tapahtuu sisรคiseen esitykseen liitetyissรค kerroksissa. Itse asiassa on olemassa kaksi pรครคkerroslohkoa, jotka nรคyttรคvรคt perinteiseltรค neuroverkolta. Pieni ero on siinรค, ettรค tulosteen sisรคltรคvรคn kerroksen on oltava yhtรค suuri kuin syรถte. Alla olevassa kaaviossa alkuperรคinen syรถte menee ensimmรคiseen lohkoon, jota kutsutaan enkooderiksi. Tรคmรค sisรคinen esitys pakkaa (pienentรครค) syรถtteen kokoa. Toisessa lohkossa tapahtuu syรถtteen rekonstruointi. Tรคmรค on dekoodausvaihe.

Autoenkooderin kooderi- ja dekooderilohkot, joiden keskellรค on pakattu sisรคinen esitys
Autoencoderin toiminta

Malli pรคivittรครค painot minimoimalla hรคviรถfunktion. Mallia rangaistaan, jos rekonstruktiotulos poikkeaa tulosta.

Kuvitellaan konkreettisesti kuva, jonka koko on 50 ร— 50 (eli 2 500 pikseliรค) ja neuroverkko, jossa on vain yksi piilotettu kerros, joka koostuu sadasta neuronista. Oppiminen tapahtuu ominaisuuskartalla, joka on 25 kertaa pienempi kuin syรถte. Tรคmรค tarkoittaa, ettรค verkon on lรถydettรคvรค tapa rekonstruoida 2 500 pikseliรค vain 100 neuronimรครคrรคn vektorilla.

Pinottu automaattinen kooderi esimerkki

Tรคssรค Autoencoder-tutoriaalissa opit kรคyttรคmรครคn pinottua autoenkooderia. Sen arkkitehtuuri on samanlainen kuin perinteisen neuroverkon. Syรถtesignaali menee piilotetulle kerrokselle pakattavaksi eli sen koon pienentรคmiseksi, ja sitten se saavuttaa rekonstruointikerrokset. Tavoitteena on tuottaa mahdollisimman lรคhellรค alkuperรคistรค oleva kuva. Mallin on opittava, miten se saavuttaa tehtรคvรคnsรค tietyillรค rajoituksilla eli pienemmรคllรค ulottuvuudella.

Nykyรครคn syvรคoppimisen autoenkoodereita kรคytetรครคn pรครคasiassa kuvan kohinanpoistoon. Kuvittele kuva, jossa on naarmuja; ihminen pystyy silti tunnistamaan sisรคllรถn. Autoenkooderin kohinanpoiston ideana on lisรคtรค kuvaan kohinaa, jotta verkko pakotetaan oppimaan datan taustalla oleva kuvio.

Toinen hyรถdyllinen Autoencoder-perhe Deep Learning on variaatioinen autoenkooderi. Tรคmรคn tyyppinen verkko voi luoda uusia kuvia. Kuvittele, ettรค koulutat verkkoa miehen kuvalla; tรคllainen verkko voi tuottaa uusia kasvoja.

Alla olevassa taulukossa tรคssรค opetusohjelmassa rakennettu pinottu autoenkooderi on sijoitettu muiden todennรคkรถisesti kohtaamiesi perheiden viereen, joten kunkin lisรครคmรคn rajoitteen vertailu on helppoa.

Autoenkooderin tyyppi Rajoitus lisรคtty Tyypillinen kรคyttรถ
Vajaavalmis / pinottu Koodauskerros on kapeampi kuin syรถtekerros Dimensionaalisuuden vรคhentรคminen, ominaisuus extracTUKSEN
Denoisointi Syรถtteeseen lisรคtty kohinaa, puhdas kohde Kuvan ja signaalin puhdistus
Harva Aktiivisten yksikรถiden lukumรครคrรคn rangaistus Tulkittavat, osaperusteiset ominaisuudet
Vaihteleva Koodauskerros oppii todennรคkรถisyysjakauman Uusien nรคytteiden luominen

Autoenkooderin rakentaminen TensorFlow'n avulla

Tรคssรค opetusohjelmassa opit rakentamaan pinotun automaattisen enkooderin kuvan rekonstruoimiseksi.

Kรคytรคt CIFAR-10-aineistoa, joka sisรคltรครค 60 000 32 ร— 32 -vรคrikuvaa. Autoencoder-aineisto on jo jaettu 50 000 kuvaan koulutusta varten ja 10 000 kuvaan testausta varten. Luokkia on jopa kymmenen:

  • Lentokone
  • Auto
  • Lintu
  • Kissa
  • Hirvi
  • Koira
  • Sammakko
  • Hevonen
  • Lรคhettรครค
  • kuorma-auto

Sinun tรคytyy ladata kuvat osoitteesta CIFAR-10-aineistosivu ja pura arkisto. Kansio cifar-10-batches-py sisรคltรครค viisi dataerรครค, joissa kussakin on 10 000 kuvaa satunnaisessa jรคrjestyksessรค.

Ennen kuin rakennat ja koulutat malliasi, sinun on kรคytettรคvรค jonkin verran tietojenkรคsittelyรค. Toimit seuraavasti:

  1. Tuo tiedot
  2. Muunna tiedot mustavalkomuotoon
  3. Liitรค kaikki erรคt
  4. Luo harjoitustietojoukko
  5. Rakenna kuvan visualisoija

Versiohuomautus: Tรคmรคn tutoriaalin koodi on suunnattu TensorFlow 1.x:lle. TensorFlow 2:ssa tf.contrib-moduulia ei enรครค ole, ja paikkamerkit, istunnot ja alustettava iteraattori sijaitsevat tf.compat.v1-tiedoston alla. tf.compat.v1.disable_v2_behavior()-funktion kutsuminen tuonnin jรคlkeen on nopein tapa suorittaa listaukset muuttumattomina.

Kuvan esikรคsittely

Vaihe 1) Tuo tiedot

Virallisen verkkosivuston mukaan voit ladata tiedot seuraavalla koodilla. Autoencoder-koodi lataa tiedot sanakirjaan, joka sisรคltรครค tiedot ja niiden otsikon. Huomaa, ettรค koodi on funktio.

import numpy as np
import tensorflow as tf
import pickle
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='latin1')
    return dict

Vaihe 2) Muunna tiedot mustavalkomuotoon

Yksinkertaisuuden vuoksi voit muuntaa tiedot harmaasรคvyiksi. Eli vain yksi ulottuvuus verrattuna kolmeen vรคrikuvaan. Suurin osa hermoverkosta toimii vain yhden ulottuvuuden tulolla.

def grayscale(im):
    return im.reshape(im.shape[0], 3, 32, 32).mean(1).reshape(im.shape[0], -1)

Vaihe 3) Liitรค kaikki erรคt

Nyt kun molemmat funktiot on luotu ja datajoukko ladattu, voit kirjoittaa silmukan liittรครคksesi tiedot muistiin. Jos tarkistat huolellisesti, puretun datatiedoston nimi on data_batch_ ja se on numeroitu vรคliltรค 1โ€“5. Voit kรคydรค tiedostot lรคpi ja liittรครค ne dataan.

Kun tรคmรค vaihe on valmis, muunnat vรคridatan harmaasรคvymuotoon. Kuten nรคet, datan muoto on 50000 ja 1024. 32*32 pikseliรค on nyt litistetty 1024:ksi.

# Load the data into memory
data, labels = [], []
## Loop over the b
for i in range(1, 6):
    filename = './cifar-10-batches-py/data_batch_' + str(i)
    open_data = unpickle(filename)
    if len(data) > 0:
        data = np.vstack((data, open_data['data']))
        labels = np.hstack((labels, open_data['labels']))
    else:
        data = open_data['data']
        labels = open_data['labels']

data = grayscale(data)
x = np.matrix(data)
y = np.array(labels)
print(x.shape)
(50000, 1024)

Huomautus: Muuta './cifar-10-batches-py/data_batch_' tiedostosi todelliseksi sijainniksi. Esimerkiksi Windows koneeseen, polku voisi olla tiedostonimi = 'E:\cifar-10-batches-py\data_batch_' + str(i)

Vaihe 4) Luo harjoitustietojoukko

Koulutuksen nopeuttamiseksi ja helpottamiseksi koulutat mallia vain hevoskuvien avulla. Hevosilla on tunnistetiedoissa tunniste 7. Kuten CIFAR-10-tietojoukon dokumentaatiossa mainitaan, jokainen luokka sisรคltรครค 5000 kuvaa. Voit tulostaa datan muodon varmistaaksesi, ettรค kuvia on 5 000 ja sarakkeita 1024, kuten alla olevassa TensorFlow Autoencoder -esimerkkivaiheessa on esitetty.

horse_i = np.where(y == 7)[0]
horse_x = x[horse_i]
print(np.shape(horse_x)) 
(5000, 1024)

Vaihe 5) Rakenna kuvan visualisointityรถkalu

Lopuksi rakennat funktion kuvien piirtรคmiseksi. Tarvitset tรคtรค toimintoa rekonstruoidun kuvan tulostamiseen autoenkooderista.

Helppo tapa tulostaa kuvia on kรคyttรครค Matplotlib-kirjaston imshow()-funktiota. Huomaa, ettรค sinun on muunnettava datan muoto 1024:stรค 32*32:een (eli kuvan muotoon).

# To plot pretty figures
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
def plot_image(image, shape=[32, 32], cmap = "Greys_r"):
    plt.imshow(image.reshape(shape), cmap=cmap,interpolation="nearest")
    plt.axis("off")   

Funktiolla on 3 argumenttia:

  • Kuva: syรถte
  • Muoto: lista, kuvan mitta
  • Cmap: valitse vรคrikartta. Oletusarvoisesti harmaa

Voit yrittรครค piirtรครค tietojoukon ensimmรคisen kuvan. Sinun pitรคisi nรคhdรค mies hevosen selรคssรค.

plot_image(horse_x[1], shape=[32, 32], cmap = "Greys_r")

Kutsu palauttaa alla olevan harmaasรคvypikkukuvan ja vahvistaa, ettรค 1024-arvosta takaisin 32ร—32-kuvaksi tehty muodonmuutos on oikein.

Harmaasรคvyinen 32x32 CIFAR-10 -pikkukuva ratsastajasta hevosen selรคssรค, piirretty plot_image()-funktiolla

Aseta Dataset Estimator

Okei, nyt kun tietojoukko on kรคyttรถvalmis, voit aloittaa TensorFlow'n kรคytรถn. Ennen mallin rakentamista kรคytรค TensorFlow'n tietojoukon estimaattoria verkon syรถttรคmiseen.

Rakennat tietojoukon TensorFlow-estimaattorilla. Mieli virkistรคmiseksi sinun on kรคytettรคvรค:

  • from_tensor_slices
  • toistaa
  • erรค

Tรคysi koodi tietojoukon rakentamiseksi on:

dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)

Huomaa, ettรค x on paikkamerkkimuotoinen [None,n_inputs]. Ensimmรคiseksi ulottuvuudeksi asetetaan None, koska verkkoon syรถtettyjen kuvien mรครคrรค on yhtรค suuri kuin erรคn koko, joka pรครคtetรครคn vasta suorituksen aikana. Lisรคtietoja on opetusohjelmassa lineaarinen regressio TensorFlow'lla.

Tรคmรคn jรคlkeen sinun on luotava iteraattori. Ilman tรคtรค koodiriviรค tietoja ei kulje liukuhihnan lรคpi.

iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()

Nyt kun liukuhihna on valmis, voit tarkistaa, onko ensimmรคinen kuva sama kuin ennen (eli mies hevosen selรคssรค).

Asetat erรคn kooksi 1, koska haluat syรถttรครค tietojoukkoon vain yhden kuvan. Voit nรคhdรค datan ulottuvuuden komennolla print(sess.run(features).shape). Se on yhtรค kuin (1, 1024). Luku 1 tarkoittaa, ettรค joka kerta syรถtetรครคn yksi 1024 arvon kuva. Jos erรคn kooksi asetetaan kaksi, putken lรคpi kulkee kaksi kuvaa. ร„lรค muuta erรคn kokoa, muuten se antaa virheen, koska plot_image()-funktioon voi syรถttรครค vain yhden kuvan kerrallaan.

## Parameters
n_inputs = 32 * 32
BATCH_SIZE = 1
batch_size = tf.placeholder(tf.int64)

# using a placeholder
x = tf.placeholder(tf.float32, shape=[None,n_inputs])
## Dataset
dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)
iter = dataset.make_initializable_iterator() # create the iterator
features = iter.get_next()

## Print the image
with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iter.initializer, feed_dict={x: horse_x,
                                         batch_size: BATCH_SIZE}) 
    print(sess.run(features).shape) 
    plot_image(sess.run(features), shape=[32, 32], cmap = "Greys_r")
(1, 1024)

Putkilinja palauttaa saman rider-funktion, joka piirrettiin suoraan NumPy-matriisista, mikรค todistaa, ettรค paikkamerkki, iteraattori ja erรคn koko on kytketty oikein.

Saman hevosen pikkukuva tulostetaan sen jรคlkeen, kun kuva on kulkenut TensorFlow-tietojoukon iteraattorin lรคpi

Rakenna verkko

On aika rakentaa verkko. Harjoittelet pinottua autoenkooderia, eli verkkoa, jossa on useita piilotettuja kerroksia.

Verkossasi on yksi 1024 pisteen syรถttรถtaso eli kuvan muoto 32ร—32.

Enkooderilohkossa on yksi ylin piilotettu kerros, jossa on 300 neuronia, ja keskikerros, jossa on 150 neuronia. Dekooderilohko on symmetrinen enkooderiin nรคhden. Voit visualisoida verkon alla olevassa kaaviossa. Huomaa, ettรค voit muuttaa piilotetun ja keskikerroksen arvoja.

Symmetrinen autoenkooderiarkkitehtuuri, jossa on 1024 tuloa, 300 ja 150 yksikรถn enkooderikerrokset ja peilattu dekooderi

Verkon rakentaminen Autoencoderille

Autoenkooderin rakentaminen on hyvin samanlaista kuin mikรค tahansa muu syvรคoppimismalli.

Rakennat mallin seuraavasti:

  1. Mรครคritรค parametrit
  2. Mรครคritรค kerrokset
  3. Mรครคrittele arkkitehtuuri
  4. Mรครคrittele optimointi
  5. Suorita malli
  6. Arvioi malli

Edellisessรค osiossa opit luomaan mallin syรถttรคvรคn putken, joten datajoukkoa ei tarvitse luoda uudelleen. Rakennat neljรคn kerroksen omaavan autoenkooderin. Kรคytรคt Xavier-alustusta. Tรคmรค on tekniikka, jolla asetetaan alkupainot sekรค syรถtteen ettรค tulosteen varianssin mukaan. Lopuksi kรคytรคt ELU-aktivointifunktiota. Regularisoit hรคviรถfunktion L2-regularisoijalla.

Vaihe 1) Mรครคritรค parametrit

Ensimmรคinen vaihe tarkoittaa, ettรค mรครคritetรครคn kunkin kerroksen neuronien lukumรครคrรค, oppimisnopeus ja regularisaattorin hyperparametri.

Ennen sitรค tuot osittaisfunktion. Se on parempi menetelmรค tiheiden kerrosten parametrien mรครคrittรคmiseen. Alla oleva koodi mรครคrittelee autoenkooderin arkkitehtuurin arvot. Kuten aiemmin on mainittu, enkooderissa on kaksi kerrosta, joissa on 300 neuronia ensimmรคisessรค kerroksessa ja 150 toisessa kerroksessa. Niiden arvot tallennetaan n_hidden_1- ja n_hidden_2-kerroksiin.

Sinun on mรครคriteltรคvรค oppimisnopeus ja L2-hyperparametri. Arvot tallennetaan learning_rate- ja l2_reg-muuttujiin.

from functools import partial

## Encoder
n_hidden_1 = 300
n_hidden_2 = 150  # codings

## Decoder
n_hidden_3 = n_hidden_1
n_outputs = n_inputs

learning_rate = 0.01
l2_reg = 0.0001

Xavier-alustustekniikkaa kutsutaan estimaattorin contrib xavier_initializer-objektilla. Samaan estimaattoriin voit lisรคtรค regularisoijan l2_regularizerin avulla.

## Define the Xavier initialization
xav_init =  tf.contrib.layers.xavier_initializer()
## Define the L2 regularizer
l2_regularizer = tf.contrib.layers.l2_regularizer(l2_reg)

Versiohuomautus: tf.contrib poistettiin TensorFlow 2:ssa. Suorat korvaajat ovat tf.keras.initializers.GlorotUniform() xavier_initializer():n tilalle ja tf.keras.regularizers.l2() l2_regularizer():n tilalle.

Vaihe 2) Mรครคrittele kerrokset

Kaikki tiheiden kerrosten parametrit on asetettu; voit pakata kaiken dense_layer-muuttujaan kรคyttรคmรคllรค partial-objektia. dense_layer kรคyttรครค sitten ELU-aktivointia, Xavier-alustusta ja L2-regularisointia jokaisella kutsulla.

## Create the dense layer
dense_layer = partial(tf.layers.dense,
                         activation=tf.nn.elu,
                         kernel_initializer=xav_init,
                         kernel_regularizer=l2_regularizer)

Vaihe 3) Mรครคrittele arkkitehtuuri

Jos tarkastelet arkkitehtuurikaaviota, huomaat, ettรค verkko pinoaa kolme kerrosta ja yhden tulostuskerroksen. Alla olevassa koodissa yhdistรคt asianmukaiset kerrokset. Esimerkiksi ensimmรคinen kerros laskee pistetulon syรถtematriisin ominaisuuksien ja 300 painoarvoa sisรคltรคvรคn matriisin vรคlillรค. Kun pistetulo on laskettu, tuloste menee ELU-aktivointifunktiolle. Tulosteesta tulee seuraavan kerroksen syรถte, siksi sitรค kรคytetรครคn hidden_2:n laskemiseen ja niin edelleen. Matriisin kertolasku on sama jokaiselle kerrokselle, koska kรคytรคt samaa aktivointifunktiota. Huomaa, ettรค viimeinen kerros, joka tuottaa tulosteita, ei kรคytรค aktivointifunktiota. Tรคmรค on jรคrkevรครค, koska tรคmรค on rekonstruoitu syรถte.

## Make the mat mul
hidden_1 = dense_layer(features, n_hidden_1)
hidden_2 = dense_layer(hidden_1, n_hidden_2)
hidden_3 = dense_layer(hidden_2, n_hidden_3)
outputs = dense_layer(hidden_3, n_outputs, activation=None)

Vaihe 4) Mรครคrittele optimointi

Viimeinen vaihe on optimoijan rakentaminen. Kรคytรคt keskiarvovirhettรค hรคviรถfunktiona. Jos muistat lineaarisen regression tutoriaalin, tiedรคt, ettรค MSE lasketaan ennustetun tulosteen ja todellisen otsikon vรคlisen erotuksen avulla. Tรคssรค otsikko on ominaisuus, koska malli yrittรครค rekonstruoida syรถtteen. Siksi haluat ennustetun tulosteen ja syรถtteen vรคlisen neliรถidyn erotuksen summan keskiarvon. TensorFlow'lla voit koodata hรคviรถfunktion seuraavasti:

loss = tf.reduce_mean(tf.square(outputs - features))

Sitten sinun on optimoitava hรคviรถfunktio. Kรคytรคt Adam-optimoijaa gradienttien laskemiseen. Tavoitefunktiona on minimoida hรคviรถ.

## Optimize
loss = tf.reduce_mean(tf.square(outputs - features))
optimizer = tf.train.AdamOptimizer(learning_rate)
train  = optimizer.minimize(loss)

Vielรค yksi asetus ennen mallin harjoittelua. Haluat kรคyttรครค erรคkokoa 150, eli syรถttรครค liukuhihnaan 150 kuvaa jokaisessa iteraatiossa. Sinun on laskettava iteraatioiden mรครคrรค manuaalisesti. Tรคmรค on triviaalia tehdรค:

Jos haluat vรคlittรครค 150 kuvaa kerrallaan ja tiedรคt, ettรค tietojoukossa on 5000 kuvaa, iteraatioiden mรครคrรค on 5000 jaettuna 150:llรค. Python voit ajaa seuraavat koodit ja varmistaa, ettรค tuloste on 33:

BATCH_SIZE = 150
### Number of batches :  length dataset / batch size
n_batches = horse_x.shape[0] // BATCH_SIZE
print(n_batches)
33

Vaihe 5) Suorita malli

Viimeisenรค muttei vรคhรคisimpรคnรค, kouluta malli. Koulutat mallia 100 epookilla. Toisin sanoen malli nรคkee kuvat 100 kertaa samalla, kun se optimoi painotuksia.

Tunnet jo TensorFlow'ssa mallin kouluttamiseen kรคytettรคvรคt koodit. Pieni ero on datan pipetointi ennen koulutuksen suorittamista. Tรคllรค tavoin malli koulutetaan nopeammin.

Olet kiinnostunut tulostamaan hรคviรถn kymmenen aikakauden jรคlkeen nรคhdรคksesi, onko malli oppimassa jotain (eli hรคviรถ vรคhenee). Harjoittelu kestรครค 2-5 minuuttia koneen laitteistosta riippuen.

## Set params
n_epochs = 100

## Call Saver to save the model and re-use it later during evaluation
saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # initialise iterator with train data
    sess.run(iter.initializer, feed_dict={x: horse_x,
                                          batch_size: BATCH_SIZE})
    print('Training...')
    print(sess.run(features).shape) 
    for epoch in range(n_epochs):       
        for iteration in range(n_batches):
            sess.run(train)
        if epoch % 10 == 0:
            loss_train = loss.eval()   # not shown
            print("\r{}".format(epoch), "Train MSE:", loss_train) 
        #saver.save(sess, "./my_model_all_layers.ckpt") 
    save_path = saver.save(sess, "./model.ckpt")    
    print("Model saved in path: %s" % save_path)  
Training...
(150, 1024)
0 Train MSE: 2934.455
10 Train MSE: 1672.676
20 Train MSE: 1514.709
30 Train MSE: 1404.3118
40 Train MSE: 1425.058
50 Train MSE: 1479.0631
60 Train MSE: 1609.5259
70 Train MSE: 1482.3223
80 Train MSE: 1445.7035
90 Train MSE: 1453.8597
Model saved in path: ./model.ckpt

Vaihe 6) Arvioi malli

Nyt kun mallisi on koulutettu, on aika arvioida sitรค. Sinun on tuotava testijoukko tiedostosta /cifar-10-batches-py/.

test_data = unpickle('./cifar-10-batches-py/test_batch')
test_x = grayscale(test_data['data'])
#test_labels = np.array(test_data['labels'])

Huomautus: Jotta Windows koneessa koodiksi tulee test_data = unpickle(rโ€E:\cifar-10-batches-py\test_batchโ€)

Voit yrittรครค tulostaa kuvan 13, joka on hevonen.

plot_image(test_x[13], shape=[32, 32], cmap = "Greys_r")

Kaavio vahvistaa, ettรค testierรค on ladattu oikein ja ettรค kuva 13 kuuluu luokkaan, jolla malli on koulutettu.

CIFAR-10-testisarjan testikuva numero 13, jossa hevonen on harmaasรคvyssรค

Mallin arvioimiseksi kรคytรคt tรคmรคn kuvan pikseliarvoa ja katsot, pystyykรถ kooderi rekonstruoimaan saman kuvan kutistettuaan sen 1024 pikseliin. Huomaa, ettรค mรครคrittelet funktion mallin arvioimiseksi eri kuvilla. Mallin pitรคisi toimia paremmin vain hevosilla.

Funktiolla on kaksi argumenttia:

  • df: Tuo testidata
  • image_number: ilmaisee tuotavan kuvan

Toiminto on jaettu kolmeen osaan:

  1. Muotoile kuva uudelleen oikeaan mittaan, eli 1, 1024
  2. Syรถtรค malliin nรคkymรคtรถn kuva, koodaa/dekoodaa kuva
  3. Tulosta todellinen ja rekonstruoitu kuva
def reconstruct_image(df, image_number = 1):
    ## Part 1: Reshape the image to the correct dimension i.e 1, 1024
    x_test = df[image_number]
    x_test_1 = x_test.reshape((1, 32*32))
    
    ## Part 2: Feed the model with the unseen image, encode/decode the image
    with tf.Session() as sess:     
        sess.run(tf.global_variables_initializer()) 
        sess.run(iter.initializer, feed_dict={x: x_test_1,
                                      batch_size: 1})
    ## Part 3:  Print the real and reconstructed image
      # Restore variables from disk.
        saver.restore(sess, "./model.ckpt")  
        print("Model restored.")
      # Reconstruct image
        outputs_val = outputs.eval()
        print(outputs_val.shape)
        fig = plt.figure()
      # Plot real
        ax1 = fig.add_subplot(121)
        plot_image(x_test_1, shape=[32, 32], cmap = "Greys_r")
      # Plot estimated
        ax2 = fig.add_subplot(122)
        plot_image(outputs_val, shape=[32, 32], cmap = "Greys_r")
        plt.tight_layout()
        fig = plt.gcf()

Nyt kun arviointifunktio on mรครคritelty, voit tarkastella rekonstruoitua kuvaa numero kolmetoista.

reconstruct_image(df =test_x, image_number = 13)
INFO:tensorflow:Restoring parameters from ./model.ckpt
Model restored.
(1, 1024)

Kuvassa alkuperรคinen testikuva on vasemmalla ja autoenkooderin lรคhtรถ oikealla, joten hienojen yksityiskohtien menetys 1024โ€“150-pakkauksen jรคlkeen on helppo arvioida.

Alkuperรคisen hevoskuvan ja epรคtarkemman autoenkooderin rekonstruktion rinnakkainen vertailu

UKK

Molemmat pienentรคvรคt mittoja, mutta PCA rajoittuu lineaarisiin projektioihin. Autoenkooderi pinoaa epรคlineaarisia aktivaatioita, kuten ELU:ta, joten se tallentaa kaarevat rakenteet, jotka PCA ei havaitse. Yhdellรค lineaarisella kerroksella ja neliรถvirheellรค autoenkooderi toistaa PCA:n lรคhes tarkasti.

Ei muutoksia. Tf.contrib-moduuli poistettiin, ja paikkamerkit ja istunnot siirrettiin tiedostoon tf.compat.v1. disable_v2_behavior():n lisรครคminen siirtรครค listaukset nopeasti, kun taas natiivi TensorFlow 2 uudelleenkirjoitus kรคyttรครค tf.keras.layers.Dense-tiedostoa GlorotUniform-alustuksella.

Automaattiset hakutyรถkalut kokeilevat useita koodauskerrosten leveyksiรค, aktivaatioita ja regularisointivoimakkuuksia paljon nopeammin kuin manuaalinen viritys ja luokittelevat sitten suoritukset rekonstruktiovirheen mukaan. Ne lyhentรคvรคt hakua, vaikka ihminen tarkistaakin, ettรค rekonstruktiot nรคyttรคvรคt oikeilta kรคsillรค olevaan dataan nรคhden.

Kyllรค. GitHub Copilot piirtรครค enkooderin ja dekooderin symmetrian, harjoitussilmukan ja piirtoavustimen lyhyestรค kommentista poistaen suurimman osan vakiomuotoisista malleista. Tarkista tensorien muodot ja hรคviรถmรครคritelmรค itse, koska luotu koodi usein sekoittaa TensorFlow 1- ja 2-syntaksia.

Aloita noin kymmenestรค kahteenkymmeneen prosenttia syรถtteen leveydestรค, kuten 150 yksikรถn taso tekee 1024 pikselille tรคssรค. Liian harvat yksikรถt sumentavat yksityiskohtia, kun taas liian monet antavat verkon kopioida syรถtteen sen sijaan, ettรค se oppisi tiiviin koodin.

Harmaasรคvy kutistaa kolme vรคrikanavaa yhdeksi, jolloin jokainen syรถtearvo leikataan 3072:sta 1024:รครคn. Koulutus toimii nopeammin, tiheรคt kerrokset pysyvรคt pieninรค ja rekonstruointitehtรคvรค nรคyttรครค edelleen selvรคsti, mitรค autoenkooderi on oppinut.

Painettu painos putoaa 2 934:stรค noin 1 404:รครคn epookkiin 30 mennessรค ja vaihtelee sitten 1 425:n ja 1 609:n vรคlillรค. Kiinteรค oppimisnopeus 0.01 ylittรครค minimin siinรค vaiheessa โ€“ sen alentaminen tai hajoamisaikataulun lisรครคminen yleensรค palauttaa edistymisen.

Tuotantokรคyttรถihin kuuluvat poikkeavuuksien havaitseminen palvelinlokeissa ja tapahtumissa, joissa suuri rekonstruointivirhe merkitsee poikkeavaa havaintoa, sekรค suositusten upottaminen, anturien kohinanpoisto ja esikoulutusominaisuus.tracjotka syรถttรคvรคt alavirran luokittelijaa.

Tiivistรค tรคmรค viesti seuraavasti: