Kaj je samodejni kodirnik?
Autoencoder je orodje za učenje podatkov učinkovito, kodirane v nenadzorovanem način. To je vrsta umetne nevronske mreže, ki vam pomaga, da se naučite predstavljanja naborov podatkov za zmanjšanje dimenzionalnosti, tako da nevronsko mrežo usposobite za ignoriranje šumov signala. Je odlično orodje za poustvarjanje vnosa.
Z enostavnimi besedami stroj naredi, recimo sliko, in lahko ustvari tesno povezano sliko. Vhod v tovrstno nevronsko mrežo ni neoznačen, kar pomeni, da se je mreža sposobna učiti brez nadzora. Natančneje, vhod omrežje kodira, da se osredotoči le na najbolj kritično lastnost. To je eden od razlogov, zakaj je avtokoder priljubljen za zmanjševanje dimenzij. Poleg tega se lahko s samodejnimi kodirniki izdelajo generativni modeli učenja . Na primer, nevronsko mrežo je mogoče usposobiti z nizom obrazov in nato ustvariti nove obraze.
V tej vadnici TensorFlow Autoencoder boste izvedeli:
- Kaj je samodejni kodirnik?
- Kako deluje Autoencoder?
- Primer zloženega samodejnega kodirnika
- Zgradite samodejni kodirnik s programom TensorFlow
- Predobdelava slike
- Nastavite ocenjevalnik nabora podatkov
- Zgradite omrežje
Kako deluje Autoencoder?
Namen samodejnega kodirnika je približati vhodne podatke s poudarkom le na bistvenih lastnostih. Morda pomislite, zakaj se preprosto ne naučite, kako kopirati in prilepiti vhod za izdelavo izhoda. Dejansko je avtokoder niz omejitev, ki silijo omrežje, da se nauči novih načinov za predstavitev podatkov, ki se razlikujejo od kopiranja izhoda.
Tipični samodejni kodirnik je definiran z vhodom, notranjo predstavitvijo in izhodom (približek vhoda). Učenje poteka v plasteh, pritrjenih na notranjo predstavitev. Dejansko obstajata dva glavna bloka slojev, ki izgledata kot tradicionalna nevronska mreža. Majhna razlika je, da mora biti plast, ki vsebuje izhod, enaka vhodu. Na spodnji sliki gre izvirni vhod v prvi blok, imenovan kodirnik . Ta notranja predstavitev stisne (zmanjša) velikost vhoda. V drugem bloku pride do rekonstrukcije vhoda. To je faza dekodiranja.
Model bo posodobil uteži tako, da bo zmanjšal funkcijo izgube. Model se kaznuje, če se izhod rekonstrukcije razlikuje od vnosa.
Konkretno si predstavljajte sliko velikosti 50x50 (tj. 250 pik) in nevronsko mrežo s samo eno skrito plastjo, sestavljeno iz sto nevronov. Učenje poteka na zemljevidu lastnosti, ki je dvakrat manjši od vnosa. To pomeni, da mora mreža najti način za rekonstrukcijo 250 slikovnih pik s samo vektorjem nevronov, ki je enak 100.
Primer zloženega samodejnega kodirnika
V tej vadnici za samodejno kodiranje boste izvedeli, kako uporabljati zloženi samodejni kodirnik. Arhitektura je podobna tradicionalni nevronski mreži. Vhod gre v skrito plast, da se stisne ali zmanjša njeno velikost, nato pa doseže rekonstrukcijske sloje. Cilj je ustvariti izhodno sliko tako blizu kot izvirnik. Model se mora naučiti načina, kako doseči svojo nalogo v okviru omejitev, torej z nižjo dimenzijo.
Dandanes se samodejni kodirniki v globokem učenju uporabljajo predvsem za označevanje slike. Predstavljajte si sliko s praskami; človek je še vedno sposoben prepoznati vsebino. Zamisel samodejnega kodiranja je dodati sliki šum, da se omrežje prisili, da se nauči vzorec za podatki.
Druga koristna družina Autoencoder Deep Learning je variacijski autoencoder. Ta vrsta omrežja lahko ustvarja nove slike. Predstavljajte si, da trenirate mrežo s podobo moškega; takšno omrežje lahko ustvari nove obraze.
Zgradite samodejni kodirnik s programom TensorFlow
V tej vadnici boste izvedeli, kako zgraditi zloženi samodejni kodirnik za rekonstrukcijo slike.
Uporabili boste nabor podatkov CIFAR-10, ki vsebuje 60000 barvnih slik velikosti 32 x 32. Podatkovni niz Autoencoder je že razdeljen med 50000 slik za usposabljanje in 10000 za testiranje. Obstaja do deset razredov:
- Letalo
- Avtomobil
- Ptica
- Mačka
- Jelen
- Pes
- Žaba
- Konj
- Ladja
- Tovornjak
Slike s tega URL-ja morate prenesti https://www.cs.toronto.edu/~kriz/cifar.html in jih razpakirati. Mapa for-10-batch-py vsebuje pet serij podatkov s po 10000 slikami v naključnem vrstnem redu.
Preden začnete graditi in trenirati svoj model, morate uporabiti nekaj obdelave podatkov. Nadaljevali boste, kot sledi:
- Uvozite podatke
- Pretvorite podatke v črno-belo obliko
- Dodajte vse serije
- Sestavite nabor podatkov o vadbi
- Izdelajte vizualizator slike
Predobdelava slike
Korak 1) Uvozite podatke.
Po uradni spletni strani lahko podatke naložite z naslednjo kodo. Koda samodejnega kodiranja bo podatke naložila v slovar s podatki in nalepko . Upoštevajte, da je koda funkcija.
import numpy as npimport tensorflow as tfimport pickledef unpickle(file):import picklewith open(file, 'rb') as fo:dict = pickle.load(fo, encoding='latin1')return dict
Korak 2) Pretvorite podatke v črno-belo obliko
Zaradi enostavnosti boste podatke pretvorili v sivine. Se pravi z samo eno dimenzijo proti trem za barvno sliko. Večina nevronske mreže deluje samo z enodimenzionalnim vhodom.
def grayscale(im):return im.reshape(im.shape[0], 3, 32, 32).mean(1).reshape(im.shape[0], -1)
Korak 3) Dodajte vse serije
Zdaj, ko sta ustvarjeni obe funkciji in naložen nabor podatkov, lahko napišete zanko za dodajanje podatkov v pomnilnik. Če natančno preverite, se razpakira datoteka s podatki imenuje data_batch_ s številko od 1 do 5. Datoteke lahko zavrtite in jih dodate k podatkom.
Ko je ta korak končan, podatke o barvah pretvorite v obliko sive lestvice. Kot lahko vidite, je oblika podatkov 50000 in 1024. 32 * 32 slikovnih pik je zdaj poravnana do leta 2014.
# Load the data into memorydata, labels = [], []## Loop over the bfor 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)
Opomba: Spremenite './cifar-10-batches-py/data_batch_' na dejansko lokacijo datoteke. Na primer za Windows računalnik je pot lahko ime datoteke = 'E: \ cifar-10-batches-py \ data_batch_' + str (i)
Korak 4) Sestavite nabor podatkov o vadbi
Da bo trening hitrejši in lažji, boste model trenirali samo na konjskih slikah. Konji so sedmi razred po podatkih etikete. Kot je omenjeno v dokumentaciji nabora podatkov CIFAR-10, vsebuje vsak razred 5000 slik. Natisnete lahko obliko podatkov, da potrdite, da je 5.000 slik z 1024 stolpci, kot je prikazano v spodnjem koraku primera TensorFlow Autoencoder.
horse_i = np.where(y == 7)[0]horse_x = x[horse_i]print(np.shape(horse_x))(5000, 1024)
5. korak) Izdelajte vizualizator slike
Na koncu ustvarite funkcijo za risanje slik. To funkcijo boste potrebovali za tiskanje rekonstruirane slike iz samodejnega kodirnika.
Enostaven način tiskanja slik je uporaba predmeta imshow iz knjižnice matplotlib. Upoštevajte, da morate pretvoriti obliko podatkov iz 1024 v 32 * 32 (tj. Format slike).
# To plot pretty figures%matplotlib inlineimport matplotlibimport matplotlib.pyplot as pltdef plot_image(image, shape=[32, 32], cmap = "Greys_r"):plt.imshow(image.reshape(shape), cmap=cmap,interpolation="nearest")plt.axis("off")
Funkcija zajema 3 argumente:
- Slika: vhod
- Oblika: seznam, dimenzija slike
- Cmap: izberite barvni zemljevid. Privzeto siva
Lahko poskusite izrisati prvo sliko v naboru podatkov. Moral bi videti moškega na konju.
plot_image(horse_x[1], shape=[32, 32], cmap = "Greys_r")
Nastavite ocenjevalnik nabora podatkov
V redu, zdaj, ko je nabor podatkov pripravljen za uporabo, lahko začnete uporabljati Tensorflow. Preden zgradimo model, uporabimo ocenjevalnik nabora podatkov Tensorflow za napajanje omrežja.
Nabor podatkov boste zgradili z ocenjevalnikom TensorFlow. Za osvežitev misli morate uporabiti:
- from_tensor_slices
- ponovite
- serija
Celotna koda za izdelavo nabora podatkov je:
dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)
Upoštevajte, da je x ograda z naslednjo obliko:
- [None, n_inputs]: Nastavite na None, ker je število podajanja slik v omrežje enako velikosti serije.
za podrobnosti glejte vadnico o linearni regresiji.
Po tem morate ustvariti iterator. Brez te vrstice kode noben podatek ne bo šel skozi cevovod.
iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()
Zdaj, ko je cevovod pripravljen, lahko preverite, ali je prva slika enaka kot prej (tj. Človek na konju).
Velikost paketa nastavite na 1, ker želite nabor podatkov nalagati samo z eno sliko. Velikost podatkov lahko vidite s tiskom (sess.run (funkcije) .shape). Enako je (1, 1024). 1 pomeni, da je podana samo ena slika z 1024. Če je velikost serije nastavljena na dve, bosta skozi cevovod šli dve sliki. (Ne spreminjajte velikosti šarže. V nasprotnem primeru bo prišlo do napake. Na funkcijo plot_image () lahko gre le ena slika naenkrat.
## Parametersn_inputs = 32 * 32BATCH_SIZE = 1batch_size = tf.placeholder(tf.int64)# using a placeholderx = tf.placeholder(tf.float32, shape=[None,n_inputs])## Datasetdataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()## Print the imagewith tf.Session() as sess:# feed the placeholder with datasess.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)
Zgradite omrežje
Čas je, da zgradimo omrežje. Usposobili boste zloženi samodejni kodirnik, to je omrežje z več skritimi plastmi.
Vaše omrežje bo imelo en vhodni sloj z 1024 točkami, to je 32x32, obliko slike.
Blok dajalnika bo imel en zgornji skriti sloj s 300 nevroni, osrednji sloj s 150 nevroni. Dekodirni blok je simetričen dajalniku. Omrežje si lahko predstavite na spodnji sliki. Upoštevajte, da lahko spremenite vrednosti skritih in osrednjih slojev.
Izdelava avtokoderja je zelo podobna kateremu koli drugemu modelu globokega učenja.
Model boste izdelali po teh korakih:
- Določite parametre
- Določite plasti
- Določite arhitekturo
- Določite optimizacijo
- Zaženite model
- Ocenite model
V prejšnjem razdelku ste izvedeli, kako ustvariti cevovod za napajanje modela, zato ni treba še enkrat ustvariti nabora podatkov. Sestavili boste avtokoder s štirimi sloji. Uporabljate inicializacijo Xavier. To je tehnika za nastavitev začetnih uteži, ki so enake varianti vhodnega in izhodnega signala. Na koncu uporabite funkcijo za aktiviranje eluja. Funkcijo izgube regulirate z regulatorjem L2.
Korak 1) Določite parametre
Prvi korak pomeni določitev števila nevronov v vsaki plasti, hitrosti učenja in hiperparametra regulatorja.
Pred tem funkcijo delno uvozite. Boljša metoda je določiti parametre gostih plasti. Spodnja koda določa vrednosti arhitekture samodejnega kodirnika. Kot je navedeno zgoraj, ima avtoenkoder dve plasti, s 300 nevroni v prvih plasteh in 150 v drugih plasteh. Njihove vrednosti so shranjene v n_hidden_1 in n_hidden_2.
Določiti morate stopnjo učenja in hiperparameter L2. Vrednosti so shranjene v learning_rate in l2_reg
from functools import partial## Encodern_hidden_1 = 300n_hidden_2 = 150 # codings## Decodern_hidden_3 = n_hidden_1n_outputs = n_inputslearning_rate = 0.01l2_reg = 0.0001
Tehnika inicializacije Xavierja se pokliče s predmetom xavier_initializer iz prispevka ocenjevalnika. V isti ocenjevalnik lahko regulator dodate z l2_regularizer
## Define the Xavier initializationxav_init = tf.contrib.layers.xavier_initializer()## Define the L2 regularizerl2_regularizer = tf.contrib.layers.l2_regularizer(l2_reg)
Korak 2) Določite sloje
Nastavljeni so vsi parametri gostih plasti; vse lahko spakirate v spremenljivko gosto_plast z uporabo predmeta delno. thick_layer, ki uporablja aktiviranje ELU, inicializacijo Xavierja in regulacijo L2.
## Create the dense layerdense_layer = partial(tf.layers.dense,activation=tf.nn.elu,kernel_initializer=xav_init,kernel_regularizer=l2_regularizer)
Korak 3) Določite arhitekturo
Če si ogledate sliko arhitekture, opazite, da omrežje nalaga tri plasti z izhodno plastjo. V spodnji kodi povežete ustrezne sloje. Na primer, prva plast izračuna pikčasti zmnožek med vhodnimi značilnostmi matrice in matricami, ki vsebujejo 300 uteži. Po izračunu pikčastega izdelka se izhod izklopi v funkcijo aktiviranja Elu. Izhod postane vhod za naslednjo plast, zato ga uporabljate za izračun hidden_2 itd. Množenje matric je za vsako plast enako, ker uporabljate isto funkcijo aktiviranja. Upoštevajte, da zadnji izhodni sloj ne uporablja funkcije aktiviranja. Smiselno je, ker je to rekonstruiran vložek
## Make the mat mulhidden_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)
Korak 4) Določite optimizacijo
Zadnji korak je izdelava optimizatorja. Napako povprečnega kvadrata uporabljate kot funkcijo izgube. Če se spomnite vaje o linearni regresiji, veste, da se MSE izračuna z razliko med predvidenim izhodom in dejansko oznako. Tu je oznaka značilnost, ker model poskuša rekonstruirati vhod. Zato želite sredino vsote razlike kvadrata med predvidenim izhodom in vhodom. S funkcijo TensorFlow lahko funkcijo izgube kodirate na naslednji način:
loss = tf.reduce_mean(tf.square(outputs - features))
Nato morate optimizirati funkcijo izgube. Za izračun prelivov uporabljate Adamov optimizator. Cilj je zmanjšati izgubo.
## Optimizeloss = tf.reduce_mean(tf.square(outputs - features))optimizer = tf.train.AdamOptimizer(learning_rate)train = optimizer.minimize(loss)
Še ena nastavitev pred treningom modela. Želeli bi uporabiti velikost serije 150, to je dovod cevovoda s 150 ponovitvami v vsaki ponovitvi. Število ponovitev morate izračunati ročno. To je nepomembno:
Če želite vsakič prenesti 150 slik in veste, da je v naboru podatkov 5000 slik, je število ponovitev enako. V pythonu lahko zaženete naslednje kode in se prepričate, da je izhod 33:
BATCH_SIZE = 150### Number of batches : length dataset / batch sizen_batches = horse_x.shape[0] // BATCH_SIZEprint(n_batches)33
5. korak) Zaženite model
Nenazadnje izurite model. Model trenirate s 100 epohami. To pomeni, da bo model videl slike 100-krat do optimiziranih uteži.
Kode za usposabljanje modela v Tensorflowu že poznate. Majhna razlika je v pripravi podatkov pred izvajanjem treninga. Na ta način se model hitreje trenira.
Zanima vas tiskanje izgube po desetih obdobjih, da vidite, ali se model česa nauči (tj. Izguba se zmanjšuje). Trening traja od 2 do 5 minut, odvisno od strojne opreme vaše naprave.
## Set paramsn_epochs = 100## Call Saver to save the model and re-use it later during evaluationsaver = tf.train.Saver()with tf.Session() as sess:sess.run(tf.global_variables_initializer())# initialise iterator with train datasess.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 shownprint("\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.45510 Train MSE: 1672.67620 Train MSE: 1514.70930 Train MSE: 1404.311840 Train MSE: 1425.05850 Train MSE: 1479.063160 Train MSE: 1609.525970 Train MSE: 1482.322380 Train MSE: 1445.703590 Train MSE: 1453.8597Model saved in path: ./model.ckpt
Korak 6) Ocenite model
Zdaj, ko ste svoj model usposobili, je čas, da ga ocenite. Iz datoteke / cifar-10-batch-py / morate uvoziti testni sert.
test_data = unpickle('./cifar-10-batches-py/test_batch')test_x = grayscale(test_data['data'])#test_labels = np.array(test_data['labels'])
OPOMBA: Za računalnike z Windows koda postane test_data = unpickle (r "E: \ cifar-10-batches-py \ test_batch")
Poskusite lahko natisniti slike 13, kar je konj
plot_image(test_x[13], shape=[32, 32], cmap = "Greys_r")
Za oceno modela boste uporabili vrednost slikovnih pik te slike in ugotovili, ali lahko kodirnik rekonstruira isto sliko po zmanjšanju 1024 slikovnih pik. Upoštevajte, da določite funkcijo za ocenjevanje modela na različnih slikah. Model bi moral bolje delovati samo na konjih.
Funkcija ima dva argumenta:
- df: Uvozi testne podatke
- image_number: navedite, katero sliko želite uvoziti
Funkcija je razdeljena na tri dele:
- Preoblikujte sliko v pravilno dimenzijo, tj. 1, 1024
- Model nahranite z nevidno sliko, jo kodirajte / dekodirajte
- Natisnite resnično in rekonstruirano sliko
def reconstruct_image(df, image_number = 1):## Part 1: Reshape the image to the correct dimension i.e 1, 1024x_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 imagewith 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 imageoutputs_val = outputs.eval()print(outputs_val.shape)fig = plt.figure()# Plot realax1 = fig.add_subplot(121)plot_image(x_test_1, shape=[32, 32], cmap = "Greys_r")# Plot estimatedax2 = fig.add_subplot(122)plot_image(outputs_val, shape=[32, 32], cmap = "Greys_r")plt.tight_layout()fig = plt.gcf()
Zdaj, ko je funkcija ocenjevanja definirana, si lahko ogledate rekonstruirano sliko številka trinajst
reconstruct_image(df =test_x, image_number = 13)
INFO:tensorflow:Restoring parameters from ./model.ckptModel restored.(1, 1024)
Povzetek
Primarni namen samodejnega kodirnika je stisniti vhodne podatke in jih nato stisniti v izhod, ki je podoben izvirnim podatkom.
Arhitektura samodejnega kodirnika, simetrična z vrtilno plastjo, imenovano osrednja plast.
Samodejni kodirnik lahko ustvarite s pomočjo:
- Delno: za ustvarjanje gostih plasti s tipično nastavitvijo:
-
tf.layers.dense,activation=tf.nn.elu,kernel_initializer=xav_init,kernel_regularizer=l2_regularizer
- thick_layer (): za množenje matrike
funkcijo izgube in optimizacijo lahko določite z:
loss = tf.reduce_mean(tf.square(outputs - features))optimizer = tf.train.AdamOptimizer(learning_rate)train = optimizer.minimize(loss)
Nazadnje izvedite sejo za urjenje modela.