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.
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.

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:
- Tuo tiedot
- Muunna tiedot mustavalkomuotoon
- Liitรค kaikki erรคt
- Luo harjoitustietojoukko
- 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.
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.
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.
Autoenkooderin rakentaminen on hyvin samanlaista kuin mikรค tahansa muu syvรคoppimismalli.
Rakennat mallin seuraavasti:
- Mรครคritรค parametrit
- Mรครคritรค kerrokset
- Mรครคrittele arkkitehtuuri
- Mรครคrittele optimointi
- Suorita malli
- 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.
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:
- Muotoile kuva uudelleen oikeaan mittaan, eli 1, 1024
- Syรถtรค malliin nรคkymรคtรถn kuva, koodaa/dekoodaa kuva
- 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.




