Autokodare i TensorFlow med exempel
โก Smart sammanfattning
Autokodare komprimerar indata till en mindre intern representation och bygger sedan om den, och lรคr sig de viktigaste funktionerna utan etiketter. Denna genomgรฅng staplar fyra tรคta lager i TensorFlow och rekonstruerar CIFAR-10 hรคstbilder.
Vad รคr Autoencoder i Deep Learning?
An Autokodare รคr ett verktyg fรถr att effektivt lรคra sig datakodning i en oรถvervakad sรคtt. Det รคr en typ av artificiellt neuralt nรคtverk som hjรคlper dig att lรคra dig representationen av datamรคngder fรถr dimensionalitetsreduktion genom att trรคna det neurala nรคtverket att ignorera signalbruset. Det รคr ett utmรคrkt verktyg fรถr att รฅterskapa en ingรฅng.
Enkelt uttryckt tar maskinen, lรฅt oss sรคga, en bild och kan producera en nรคra relaterad bild. Inmatningen i den hรคr typen av neuralt nรคtverk รคr omรคrkt, vilket betyder att nรคtverket kan lรคra sig utan รถvervakning. Mer exakt kodas inmatningen av nรคtverket fรถr att endast fokusera pรฅ den mest kritiska funktionen. Detta รคr en av anledningarna till att autokodare รคr populรคra fรถr dimensionalitetsreduktion. Dessutom kan autokodare anvรคndas fรถr att producera generativa inlรคrningsmodeller. Till exempel kan det neurala nรคtverket trรคnas med en uppsรคttning ansikten och sedan producera nya ansikten.
Hur fungerar TensorFlow Autoencoder?
Syftet med en autoencoder รคr att producera en approximation av ingรฅngen genom att bara fokusera pรฅ de vรคsentliga funktionerna. Du kanske tรคnker varfรถr inte bara lรคra dig hur man kopierar och klistrar in indata fรถr att producera utdata. Faktum รคr att en autoencoder รคr en uppsรคttning begrรคnsningar som tvingar nรคtverket att lรคra sig nya sรคtt att representera data, annorlunda รคn att bara kopiera utdata.
En typisk autokodare definieras med en ingรฅng, en intern representation och en utgรฅng (en approximation av ingรฅngen). Inlรคrningen sker i de lager som รคr kopplade till den interna representationen. Det finns faktiskt tvรฅ huvudblock av lager som ser ut som ett traditionellt neuralt nรคtverk. Den lilla skillnaden รคr att lagret som innehรฅller utgรฅngen mรฅste vara lika med ingรฅngen. I diagrammet nedan gรฅr den ursprungliga ingรฅngen in i det fรถrsta blocket som kallas kodaren. Denna interna representation komprimerar (minskar) storleken pรฅ ingรฅngen. I det andra blocket sker rekonstruktionen av ingรฅngen. Detta รคr avkodningsfasen.

Modellen kommer att uppdatera vikterna genom att minimera fรถrlustfunktionen. Modellen straffas om rekonstruktionsutgรฅngen skiljer sig frรฅn ingรฅngen.
Konkret, fรถrestรคll dig en bild med storleken 50ร50 (dvs. 2 500 pixlar) och ett neuralt nรคtverk med bara ett dolt lager bestรฅende av hundra neuroner. Inlรคrningen sker pรฅ en funktionskarta som รคr tjugofem gรฅnger mindre รคn indata. Det betyder att nรคtverket mรฅste hitta ett sรคtt att rekonstruera 2 500 pixlar med endast en vektor av neuroner lika med 100.
Exempel pรฅ staplad autokodare
I den hรคr handledningen om autokodning lรคr du dig hur du anvรคnder en staplad autokodare. Arkitekturen liknar den i ett traditionellt neuralt nรคtverk. Indata gรฅr till ett dolt lager fรถr att komprimeras, eller minska dess storlek, och nรฅr sedan rekonstruktionslagren. Mรฅlet รคr att producera en utdatabild som รคr sรฅ nรคra originalet som mรถjligt. Modellen mรฅste lรคra sig ett sรคtt att utfรถra sin uppgift under en uppsรคttning begrรคnsningar, det vill sรคga med en lรคgre dimension.
Numera anvรคnds autokodare inom djupinlรคrning frรคmst fรถr att brusreducera en bild. Tรคnk dig en bild med repor; en mรคnniska kan fortfarande kรคnna igen innehรฅllet. Idรฉn med att brusreducera en autokodare รคr att lรคgga till brus i bilden fรถr att tvinga nรคtverket att lรคra sig mรถnstret bakom data.
Den andra anvรคndbara familjen av Autoencoder Deep Learning รคr en variationell autokodare. Denna typ av nรคtverk kan generera nya bilder. Tรคnk dig att du trรคnar ett nรคtverk med bilden av en man; ett sรฅdant nรคtverk kan producera nya ansikten.
Tabellen nedan placerar den staplade autokodaren som byggts i den hรคr handledningen bredvid de andra familjer som du sannolikt kommer att stรถta pรฅ, sรฅ begrรคnsningen som var och en lรคgger till รคr lรคtt att jรคmfรถra.
| Autokodartyp | Begrรคnsning tillagd | Typisk anvรคndning |
|---|---|---|
| Underkomplett / staplad | Kodningsskiktet รคr smalare รคn inmatningsskiktet | Dimensionsreduktion, funktionsexempeltraction |
| Denoising | Brus tillagt pรฅ ingรฅngen, rent mรฅl | Bild- och signalrensning |
| Gles | Straff pรฅ antalet aktiva enheter | Tolkbara, delbaserade funktioner |
| Varierande | Kodningsskiktet lรคr sig en sannolikhetsfรถrdelning | Generera nya prover |
Hur man bygger en autokodare med TensorFlow
I den hรคr handledningen kommer du att lรคra dig hur du bygger en staplad autokodare fรถr att rekonstruera en bild.
Du kommer att anvรคnda CIFAR-10-datasetet som innehรฅller 60 000 32ร32 fรคrgbilder. Autoencoder-datasetet รคr redan uppdelat mellan 50 000 bilder fรถr trรคning och 10 000 fรถr testning. Det finns upp till tio klasser:
- Flygplan
- Automobile
- Fรฅgel
- Cat
- Deer
- Dog
- groda
- Hรคst
- Ship
- Lastbil
Du behรถver ladda ner bilderna frรฅn CIFAR-10 dataset-sida och packa upp arkivet. Mappen cifar-10-batches-py innehรฅller fem databatchar med 10 000 bilder vardera i slumpmรคssig ordning.
Innan du bygger och trรคnar din modell mรฅste du tillรคmpa viss databehandling. Du kommer att gรฅ tillvรคga enligt fรถljande:
- Importera data
- Konvertera data till svartvitt format
- Lรคgg till alla satser
- Konstruera trรคningsdatauppsรคttningen
- Konstruera en bildvisualiserare
Versionsnotering: Koden i den hรคr handledningen riktar sig mot TensorFlow 1.x. Pรฅ TensorFlow 2 finns inte lรคngre tf.contrib-modulen, och platshรฅllare, sessioner och den initierbara iteratorn finns under tf.compat.v1. Att anropa tf.compat.v1.disable_v2_behavior() efter importen รคr det snabbaste sรคttet att kรถra listorna ofรถrรคndrade.
Bildfรถrbehandling
Steg 1) Importera data
Enligt den officiella webbplatsen kan du ladda upp data med fรถljande kod. Autoencoder-koden laddar data i en ordbok med data och etiketten. Observera att koden รคr en funktion.
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
Steg 2) Konvertera data till svartvitt format
Fรถr enkelhetens skull kommer du att konvertera data till en grรฅskala. Det vill sรคga med endast en dimension mot tre fรถr fรคrgbild. Det mesta av det neurala nรคtverket fungerar bara med endimensionell input.
def grayscale(im): return im.reshape(im.shape[0], 3, 32, 32).mean(1).reshape(im.shape[0], -1)
Steg 3) Lรคgg till alla satser
Nu nรคr bรฅda funktionerna รคr skapade och datamรคngden laddad kan du skriva en loop fรถr att lรคgga till data i minnet. Om du kontrollerar noggrant fรฅr den uppackade filen med data namnet data_batch_ med ett nummer frรฅn 1 till 5. Du kan loopa รถver filerna och lรคgga till dem i data.
Nรคr det hรคr steget รคr klart konverterar du fรคrgdatan till grรฅskaleformat. Som du kan se รคr datans form 50000 och 1024. De 32*32 pixlarna รคr nu utplattade till 1024.
# 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)
Obs: รndra './cifar-10-batches-py/data_batch_' till den faktiska platsen fรถr din fil. Till exempel fรถr en Windows maskin, sรถkvรคgen kan vara filnamn = 'E:\cifar-10-batches-py\data_batch_' + str(i)
Steg 4) Konstruera trรคningsdatauppsรคttningen
Fรถr att gรถra trรคningen snabbare och enklare kommer du att trรคna en modell endast pรฅ hรคstbilderna. Hรคstarna har etikett 7 i etikettdatan. Som nรคmnts i dokumentationen fรถr CIFAR-10-datasetet innehรฅller varje klass 5000 bilder. Du kan skriva ut formen pรฅ data fรถr att bekrรคfta att det finns 5 000 bilder med 1024 kolumner, vilket visas i exempelsteget fรถr TensorFlow Autoencoder nedan.
horse_i = np.where(y == 7)[0]
horse_x = x[horse_i]
print(np.shape(horse_x))
(5000, 1024)
Steg 5) Konstruera en bildvisualiserare
Slutligen konstruerar du en funktion fรถr att plotta bilderna. Du behรถver denna funktion fรถr att skriva ut den rekonstruerade bilden frรฅn autoencodern.
Ett enkelt sรคtt att skriva ut bilder รคr att anvรคnda funktionen imshow() frรฅn Matplotlib-biblioteket. Observera att du mรฅste konvertera formen pรฅ data frรฅn 1024 till 32*32 (dvs. formatet pรฅ en bild).
# 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")
Funktionen tar 3 argument:
- Bild: ingรฅngen
- Form: lista, bildens dimension
- Cmap: vรคlj fรคrgkarta. Som standard รคr den grรฅ
Du kan fรถrsรถka plotta den fรถrsta bilden i datamรคngden. Du borde se en man pรฅ en hรคst.
plot_image(horse_x[1], shape=[32, 32], cmap = "Greys_r")
Anropet returnerar grรฅskaleminiatyrbilden nedan och bekrรคftar att omformningen frรฅn 1024 vรคrden tillbaka till en 32ร32-bild รคr korrekt.
Stรคll in Dataset Estimator
Okej, nu nรคr datamรคngden รคr redo att anvรคndas kan du bรถrja anvรคnda TensorFlow. Innan du bygger modellen, anvรคnd TensorFlows datamรคngdsberรคknare fรถr att mata nรคtverket.
Du kommer att bygga en datamรคngd med TensorFlow estimator. Fรถr att frรคscha upp ditt sinne mรฅste du anvรคnda:
- from_tensor_slices
- upprepa
- sats
Den fullstรคndiga koden fรถr att bygga datamรคngden รคr:
dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)
Observera att x รคr formad som en platshรฅllare [None,n_inputs]. Den fรถrsta dimensionen รคr satt till None eftersom antalet bilder som matas till nรคtverket รคr lika med batchstorleken, vilket bara bestรคms vid kรถrning. Fรถr mer information, se handledningen om linjรคr regression med TensorFlow.
Efter det mรฅste du skapa iteratorn. Utan denna kodrad kommer ingen data att gรฅ genom pipelinen.
iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()
Nu nรคr pipelinen รคr klar kan du kontrollera om den fรถrsta bilden รคr densamma som tidigare (dvs en man pรฅ en hรคst).
Du stรคller in batchstorleken till 1 eftersom du bara vill mata datamรคngden med en bild. Du kan se datamรคngdens dimensioner med print(sess.run(features).shape). Det รคr lika med (1, 1024). 1:an betyder att en enda bild med 1024 vรคrden matas varje gรฅng. Om batchstorleken รคr instรคlld pรฅ tvรฅ kommer tvรฅ bilder att gรฅ genom pipelinen. รndra inte batchstorleken, annars kommer det att ge ett fel, eftersom endast en bild รฅt gรฅngen kan gรฅ till funktionen plot_image().
## 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)
Pipelinen returnerar samma rider som ritades direkt frรฅn NumPy-matrisen, vilket bevisar att platshรฅllaren, iteratorn och batchstorleken รคr korrekt kopplade.
Bygg nรคtverket
Det รคr dags att bygga nรคtverket. Du kommer att trรคna en staplad autokodare, det vill sรคga ett nรคtverk med flera dolda lager.
Ditt nรคtverk kommer att ha ett inmatningslager med 1024 punkter, dvs. 32ร32, bildens form.
Kodningsblocket kommer att ha ett รถvre dolt lager med 300 neuroner, ett centralt lager med 150 neuroner. Avkodningsblocket รคr symmetriskt i fรถrhรฅllande till kodaren. Du kan visualisera nรคtverket i diagrammet nedan. Observera att du kan รคndra vรคrdena fรถr dolda och centrala lager.
Att bygga en autoencoder รคr mycket likt vilken annan modell fรถr djupinlรคrning som helst.
Du kommer att konstruera modellen enligt dessa steg:
- Definiera parametrarna
- Definiera lagren
- Definiera arkitekturen
- Definiera optimeringen
- Kรถr modellen
- Utvรคrdera modellen
I fรถregรฅende avsnitt lรคrde du dig hur man skapar en pipeline fรถr att mata modellen, sรฅ det finns inget behov av att skapa datamรคngden en gรฅng till. Du kommer att konstruera en autokodare med fyra lager. Du anvรคnder Xavier-initialiseringen. Detta รคr en teknik fรถr att stรคlla in initialvikterna enligt variansen fรถr bรฅde in- och utdata. Slutligen anvรคnder du ELU-aktiveringsfunktionen. Du regulariserar fรถrlustfunktionen med en L2-regulariserare.
Steg 1) Definiera parametrarna
Det fรถrsta steget innebรคr att definiera antalet neuroner i varje lager, inlรคrningshastigheten och hyperparametern fรถr regularizern.
Innan dess importerar du partialfunktionen. Det รคr en bรคttre metod fรถr att definiera parametrarna fรถr de tรคta lagren. Koden nedan definierar vรคrdena fรถr autokodararkitekturen. Som nรคmnts tidigare har kodaren tvรฅ lager, med 300 neuroner i det fรถrsta lagret och 150 i det andra lagret. Deras vรคrden lagras i n_hidden_1 och n_hidden_2.
Du mรฅste definiera inlรคrningshastigheten och L2-hyperparametern. Vรคrdena lagras i learning_rate och l2_reg.
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-initialiseringstekniken anropas med objektet xavier_initializer frรฅn estimatorn contrib. I samma estimator kan du lรคgga till regulariseraren med l2_regularizer.
## Define the Xavier initialization xav_init = tf.contrib.layers.xavier_initializer() ## Define the L2 regularizer l2_regularizer = tf.contrib.layers.l2_regularizer(l2_reg)
Versionsnotering: tf.contrib togs bort i TensorFlow 2. De direkta ersรคttningarna รคr tf.keras.initializers.GlorotUniform() fรถr xavier_initializer() och tf.keras.regularizers.l2() fรถr l2_regularizer().
Steg 2) Definiera lagren
Alla parametrar fรถr de tรคta lagren har stรคllts in; du kan packa allt i variabeln dense_layer genom att anvรคnda objektet partial. dense_layer anvรคnder sedan ELU-aktivering, Xavier-initiering och L2-regularisering vid varje anrop.
## Create the dense layer
dense_layer = partial(tf.layers.dense,
activation=tf.nn.elu,
kernel_initializer=xav_init,
kernel_regularizer=l2_regularizer)
Steg 3) Definiera arkitekturen
Om du tittar pรฅ arkitekturdiagrammet ser du att nรคtverket staplar tre lager med ett utgรฅngslager. I koden nedan kopplar du samman lรคmpliga lager. Till exempel berรคknar det fรถrsta lagret punktprodukten mellan inmatningsmatrisens funktioner och matrisen som innehรฅller de 300 vikterna. Efter att punktprodukten har berรคknats gรฅr utdata till ELU-aktiveringsfunktionen. Utdata blir indata fรถr nรคsta lager, det รคr dรคrfรถr du anvรคnder den fรถr att berรคkna hidden_2 och sรฅ vidare. Matrismultiplikationen รคr densamma fรถr varje lager eftersom du anvรคnder samma aktiveringsfunktion. Observera att det sista lagret, utdata, inte tillรคmpar en aktiveringsfunktion. Det รคr logiskt eftersom detta รคr den rekonstruerade indatan.
## 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)
Steg 4) Definiera optimeringen
Det sista steget รคr att konstruera optimeraren. Du anvรคnder medelkvadratfelet som en fรถrlustfunktion. Om du minns handledningen om linjรคr regression vet du att medelkvadratfelet berรคknas med skillnaden mellan den fรถrutspรฅdda utsignalen och den verkliga etiketten. Hรคr รคr etiketten funktionen eftersom modellen fรถrsรถker rekonstruera insignalen. Dรคrfรถr vill du ha medelvรคrdet av summan av den kvadrerade skillnaden mellan fรถrutspรฅdd utsignal och insignal. Med TensorFlow kan du koda fรถrlustfunktionen enligt fรถljande:
loss = tf.reduce_mean(tf.square(outputs - features))
Sedan behรถver du optimera fรถrlustfunktionen. Du anvรคnder Adam-optimeraren fรถr att berรคkna gradienterna. Mรฅlfunktionen รคr att minimera fรถrlusten.
## Optimize
loss = tf.reduce_mean(tf.square(outputs - features))
optimizer = tf.train.AdamOptimizer(learning_rate)
train = optimizer.minimize(loss)
Ytterligare en instรคllning innan du trรคnar modellen. Du vill anvรคnda en batchstorlek pรฅ 150, det vill sรคga mata pipelinen med 150 bilder varje iteration. Du mรฅste berรคkna antalet iterationer manuellt. Detta รคr trivialt att gรถra:
Om du vill skicka 150 bilder varje gรฅng och du vet att det finns 5000 bilder i datamรคngden, รคr antalet iterationer lika med 5000 dividerat med 150. I Python Du kan kรถra fรถljande koder och se till att utdata รคr 33:
BATCH_SIZE = 150 ### Number of batches : length dataset / batch size n_batches = horse_x.shape[0] // BATCH_SIZE print(n_batches) 33
Steg 5) Kรถr modellen
Sist men inte minst, trรคna modellen. Du trรคnar modellen med 100 epoker. Det vill sรคga att modellen kommer att se bilderna 100 gรฅnger samtidigt som vikterna optimeras.
Du รคr redan bekant med koderna fรถr att trรคna en modell i TensorFlow. Den lilla skillnaden รคr att man skickar data i pipe-format innan trรคningen kรถrs. Pรฅ sรฅ sรคtt trรคnas modellen snabbare.
Du รคr intresserad av att skriva ut fรถrlusten efter tio epoker fรถr att se om modellen lรคr sig nรฅgot (dvs. fรถrlusten minskar). Utbildningen tar 2 till 5 minuter, beroende pรฅ din maskinvara.
## 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
Steg 6) Utvรคrdera modellen
Nu nรคr du har trรคnat din modell รคr det dags att utvรคrdera den. Du behรถver importera testuppsรคttningen frรฅn filen /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'])
Obs: Fรถr en Windows maskin, koden blir test_data = unpickle(rโE:\cifar-10-batches-py\test_batchโ)
Du kan fรถrsรถka skriva ut bild 13, som รคr en hรคst.
plot_image(test_x[13], shape=[32, 32], cmap = "Greys_r")
Diagrammet bekrรคftar att testbatchen laddades korrekt och att bild 13 tillhรถr den klass som modellen trรคnades pรฅ.
Fรถr att utvรคrdera modellen anvรคnder du pixelvรคrdet fรถr den hรคr bilden och ser om kodaren kan rekonstruera samma bild efter att ha krympt den till 1024 pixlar. Observera att du definierar en funktion fรถr att utvรคrdera modellen pรฅ olika bilder. Modellen borde bara fungera bรคttre pรฅ hรคstar.
Funktionen tar tvรฅ argument:
- df: Importera testdata
- bildnummer: anger vilken bild som ska importeras
Funktionen รคr uppdelad i tre delar:
- Forma om bilden till rรคtt dimension, dvs 1, 1024
- Mata modellen med den osynliga bilden, koda/avkoda bilden
- Skriv ut den verkliga och rekonstruerade bilden
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()
Nu nรคr utvรคrderingsfunktionen รคr definierad kan du titta pรฅ den rekonstruerade bilden nummer tretton.
reconstruct_image(df =test_x, image_number = 13)
INFO:tensorflow:Restoring parameters from ./model.ckpt
Model restored.
(1, 1024)
Figuren placerar den ursprungliga testbilden till vรคnster och autokodarens utgรฅng till hรถger, sรฅ fรถrlusten av fina detaljer efter komprimeringen 1024 till 150 รคr lรคtt att bedรถma.




