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.

  • ๐Ÿ”˜ Kodare och avkodare: Tvรฅ symmetriska block mรถts i ett smalt kodningslager som tvingar nรคtverket att endast behรฅlla den vรคsentliga signalen.
  • โ˜‘๏ธ Fรถrberedelse av datamรคngd: CIFAR-10-batchar laddas, konverteras till grรฅskala, staplas och filtreras ner till de 5 000 hรคstbilderna.
  • โœ… Matningsledning: En datasetestimator med from_tensor_slices, repeat och batch levererar bilder via en initierbar iterator.
  • ๐Ÿงช Nรคtverksform: Lagerbredderna รคr 1024, 300, 150, 300, 1024, med ELU-aktivering, Xavier-initiering och L2-regularisering.
  • ๐Ÿ› ๏ธ Trรคningsupplรคgg: Medelkvadratfel mellan utdata och indata, en Adam-optimerare, en batchstorlek pรฅ 150 och 33 iterationer per epok.
  • ๐Ÿ“‰ Uppmรคtt resultat: ร–ver 100 epoker faller trรคningsfรถrlusten frรฅn 2 934 till ungefรคr 1 454 innan rekonstruktionen plottas.

Autokodare i TensorFlow

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.

Kodar- och avkodarblock fรถr en autokodare med den komprimerade interna representationen i mitten
Fungerar av Autoencoder

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:

  1. Importera data
  2. Konvertera data till svartvitt format
  3. Lรคgg till alla satser
  4. Konstruera trรคningsdatauppsรคttningen
  5. 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.

Grรฅskalig 32x32 CIFAR-10-miniatyrbild av en ryttare pรฅ en hรคst ritad med plot_image()

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.

Samma hรคstminiatyr skrivs ut efter att bilden passerat genom TensorFlow Dataset-iteratorn

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.

Symmetrisk autokodararkitektur med 1024 ingรฅngar, 300 och 150 enheters kodlager och en speglad avkodare

Bygga nรคtverket fรถr Autoencoder

Att bygga en autoencoder รคr mycket likt vilken annan modell fรถr djupinlรคrning som helst.

Du kommer att konstruera modellen enligt dessa steg:

  1. Definiera parametrarna
  2. Definiera lagren
  3. Definiera arkitekturen
  4. Definiera optimeringen
  5. Kรถr modellen
  6. 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รฅ.

Testbild nummer 13 frรฅn CIFAR-10-testomgรฅngen som visar en hรคst i grรฅskala

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:

  1. Forma om bilden till rรคtt dimension, dvs 1, 1024
  2. Mata modellen med den osynliga bilden, koda/avkoda bilden
  3. 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.

Jรคmfรถrelse sida vid sida av den ursprungliga hรคstbilden och den suddigare autokodarrekonstruktionen

Vanliga frรฅgor

Bรฅda minskar dimensioner, men PCA รคr begrรคnsad till linjรคra projektioner. En autokodare staplar icke-linjรคra aktiveringar som ELU, sรฅ att den fรฅngar krรถkta strukturer som PCA missar. Med ett enda linjรคrt lager och kvadrerat fel reproducerar en autokodare PCA nรคstan exakt.

Inte ofรถrรคndrad. Modulen tf.contrib togs bort och platshรฅllare och sessioner flyttades till tf.compat.v1. Genom att lรคgga till disable_v2_behavior() porteras listorna snabbt, medan en inbyggd TensorFlow 2 omskrivning anvรคnder tf.keras.layers.Dense med GlorotUniform-initiering.

Automatiserade sรถkverktyg testar mรฅnga kodningslagerbredder, aktiveringar och regulariseringsstyrkor mycket snabbare รคn manuell finjustering, och rangordnar sedan kรถrningarna efter rekonstruktionsfel. De fรถrkortar sรถkningen, รคven om en mรคnniska fortfarande kontrollerar att rekonstruktionerna ser rรคtt ut fรถr den aktuella datan.

Ja. GitHub Copilot utarbetar kodarens och avkodarens symmetri, trรคningsslingan och plottningshjรคlpen frรฅn en kort kommentar, och tar bort det mesta av standardtexten. Verifiera tensorformer och fรถrlustdefinitionen sjรคlv, eftersom genererad kod ofta blandar TensorFlow 1- och 2-syntax.

Bรถrja nรคra tio till tjugo procent av inmatningsbredden, som 150-enhetslagret gรถr fรถr 1024 pixlar hรคr. Fรถr fรฅ enheter suddar ut detaljer, medan fรถr mรฅnga lรฅter nรคtverket kopiera inmatningen istรคllet fรถr att lรคra sig en kompakt kod.

Grรฅskala komprimerar tre fรคrgkanaler till en, vilket minskar varje ingรฅngsvรคrde frรฅn 3072 till 1024. Trรคningen gรฅr snabbare, de tรคta lagren fรถrblir smรฅ och rekonstruktionsuppgiften visar fortfarande tydligt vad autokodaren har lรคrt sig.

Den tryckta upplagan sjunker frรฅn 2 934 till cirka 1 404 vid epok 30 och svรคnger sedan mellan 1 425 och 1 609. En fast inlรคrningshastighet pรฅ 0.01 รถverskrider minimumvรคrdet vid den punkten โ€“ att sรคnka det, eller lรคgga till ett avklingningsschema, รฅterstรคller vanligtvis ytterligare framsteg.

Produktionsanvรคndningsomrรฅden inkluderar avvikelsedetektering i serverloggar och transaktioner, dรคr ett hรถgt rekonstruktionsfel markerar en extremvรคrde, plus rekommendationsinbรคddning, sensorbrusreducering och fรถrtrรคningsfunktioner, t.ex.tractorer som matar en nedstrรถms klassificerare.

Sammanfatta detta inlรคgg med: