Što je Autoencoder?
Autoencoder je alat za učenje kodiranja podataka učinkovito u bez nadzora način. To je vrsta umjetne neuronske mreže koja vam pomaže naučiti predstavljanje skupova podataka za smanjenje dimenzionalnosti trenirajući neuronsku mrežu da ignorira šum signala. To je izvrstan alat za ponovno stvaranje ulaznih podataka.
Jednostavnim riječima, stroj snima, recimo sliku, i može stvoriti usko povezanu sliku. Ulaz u ovu vrstu neuronske mreže nije obilježen, što znači da je mreža sposobna učiti bez nadzora. Točnije, mreža kodira ulaz kako bi se usredotočio samo na najkritičniju značajku. To je jedan od razloga zašto je autokoder popularan zbog smanjenja dimenzionalnosti. Osim toga, autokoderi se mogu koristiti za stvaranje generativnih modela učenja . Na primjer, neuronska mreža može se trenirati sa skupom lica, a zatim može stvoriti nova lica.
U ovom vodiču za TensorFlow Autoencoder naučit ćete:
- Što je Autoencoder?
- Kako djeluje Autoencoder?
- Primjer složenog automatskog kodera
- Izgradite Autoencoder s TensorFlowom
- Predobrada slike
- Postavite procjenitelj skupa podataka
- Izgradite mrežu
Kako djeluje Autoencoder?
Svrha automatskog kodera je proizvesti aproksimaciju ulaznih podataka fokusirajući se samo na bitne značajke. Možda mislite zašto jednostavno ne naučite kako kopirati i zalijepiti ulaz da biste dobili izlaz. U stvari, autokoder je skup ograničenja koja prisiljavaju mrežu na učenje novih načina predstavljanja podataka, različitih od pukog kopiranja rezultata.
Tipični autokoder definiran je ulazom, unutarnjim prikazom i izlazom (aproksimacija ulaza). Učenje se odvija u slojevima povezanim s unutarnjim prikazom. Zapravo postoje dva glavna bloka slojeva koji izgledaju kao tradicionalna neuronska mreža. Mala razlika je u tome što sloj koji sadrži izlaz mora biti jednak ulazu. Na donjoj slici izvorni ulaz ide u prvi blok koji se naziva enkoder . Ovaj unutarnji prikaz komprimira (smanjuje) veličinu ulaza. U drugom bloku događa se rekonstrukcija ulaza. Ovo je faza dekodiranja.
![](https://cdn.css-code.org/5927179/tensorflow_autoencoder_dataset_with_deep_learning_example.png.webp)
Rad Autoencodera
Model će ažurirati težine umanjujući funkciju gubitka. Model se kažnjava ako se izlaz rekonstrukcije razlikuje od ulaza.
Konkretno, zamislite sliku veličine 50x50 (tj. 250 piksela) i neuronsku mrežu sa samo jednim skrivenim slojem koji se sastoji od stotinu neurona. Učenje se izvodi na značajci koja je dva puta manja od ulazne vrijednosti. To znači da mreža mora pronaći način za rekonstrukciju 250 piksela sa samo vektorom neurona jednakim 100.
Primjer složenog automatskog kodera
U ovom vodiču za Autoencoder naučit ćete kako se koristi naslagani autoencoder. Arhitektura je slična tradicionalnoj neuronskoj mreži. Ulaz ide na skriveni sloj da bi se stisnuo ili smanjio njegovu veličinu, a zatim dolazi do slojeva za rekonstrukciju. Cilj je stvoriti izlaznu sliku blisku originalu. Model mora naučiti način postizanja svoje zadaće pod određenim ograničenjima, tj. Nižom dimenzijom.
Danas se autoenkoderi u dubinskom učenju uglavnom koriste za označavanje slike. Zamislite sliku s ogrebotinama; čovjek je još uvijek u stanju prepoznati sadržaj. Ideja otkazivanja automatskog kodera je dodati sliku slici kako bi prisilila mrežu da nauči obrazac koji stoji iza podataka.
Druga korisna obitelj Autoencoder Deep Learning je varijacijski autoencoder. Ova vrsta mreže može generirati nove slike. Zamislite da trenirate mrežu s likom muškarca; takva mreža može stvoriti nova lica.
Izgradite Autoencoder s TensorFlowom
U ovom vodiču naučit ćete kako izraditi naslagani autokoder za rekonstrukciju slike.
Upotrijebit ćete skup podataka CIFAR-10 koji sadrži 60000 slika u boji veličine 32x32. Skup podataka Autoencoder već je podijeljen između 50000 slika za trening i 10000 za testiranje. Postoji do deset klasa:
- Zrakoplov
- Automobil
- Ptica
- Mačka
- Jelen
- Pas
- Žaba
- Konj
- Brod
- Kamion
Trebate preuzeti slike s ovog URL-a https://www.cs.toronto.edu/~kriz/cifar.html i otpakirati ih. Mapa for-10-batch-py sadrži pet serija podataka s po 10000 slika u slučajnom redoslijedu.
Prije nego što izradite i obučite svoj model, morate primijeniti obradu podataka. Nastavit ćete kako slijedi:
- Uvezite podatke
- Pretvorite podatke u crno-bijeli format
- Dodajte sve serije
- Izgradite skup podataka o treningu
- Napravite vizualizator slike
Predobrada slike
Korak 1) Uvezite podatke.
Prema službenom web mjestu, podatke možete prenijeti sa sljedećim kodom. Kod automatskog kodiranja učitat će podatke u rječnik s podacima i oznakom . Imajte na umu da je kôd 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 u crno-bijeli format
Radi jednostavnosti podatke ćete pretvoriti u sive tonove. Odnosno, sa samo jednom dimenzijom u odnosu na tri za sliku u boji. Većina neuronske mreže radi samo s jednodimenzionalnim ulazom.
def grayscale(im):return im.reshape(im.shape[0], 3, 32, 32).mean(1).reshape(im.shape[0], -1)
Korak 3) Dodajte sve serije
Sad kad su kreirane obje funkcije i učitan skup podataka, možete napisati petlju za dodavanje podataka u memoriju. Ako pažljivo provjerite, raspakirana datoteka s podacima naziva se data_batch_ s brojem od 1 do 5. Datoteke možete prebaciti i dodati je podacima.
Kada je ovaj korak gotov, podatke o bojama pretvorite u format sive ljestvice. Kao što vidite, oblik podataka je 50000 i 1024. 32 * 32 piksela sada se poravnavaju s 2014. godinom.
# 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)
Napomena: Promijenite './cifar-10-batches-py/data_batch_' na stvarno mjesto vaše datoteke. Na primjer, za Windows stroj, staza može biti ime datoteke = 'E: \ cifar-10-batches-py \ data_batch_' + str (i)
Korak 4) Izgradite skup podataka o treningu
Kako bi trening bio brži i lakši, trenirat ćete model samo na slikama konja. Konji su sedma klasa u podacima s oznake. Kao što je spomenuto u dokumentaciji skupa podataka CIFAR-10, svaka klasa sadrži 5000 slika. Možete ispisati oblik podataka kako biste potvrdili da postoji 5.000 slika s 1024 stupca, kao što je prikazano u donjem koraku primjera automatskog kodera TensorFlow.
horse_i = np.where(y == 7)[0]horse_x = x[horse_i]print(np.shape(horse_x))(5000, 1024)
Korak 5) Napravite vizualizator slike
Na kraju, konstruirate funkciju za crtanje slika. Ova funkcija trebat će vam za ispis rekonstruirane slike s automatskog kodera.
Jednostavan način ispisa slika je upotreba objekta imshow iz matplotlib biblioteke. Imajte na umu da oblik podataka trebate pretvoriti iz 1024 u 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 uzima 3 argumenta:
- Slika: ulaz
- Oblik: popis, dimenzija slike
- Cmap: odaberite kartu boja. Prema zadanim postavkama, siva
Možete pokušati nacrtati prvu sliku u skupu podataka. Trebali biste vidjeti čovjeka na konju.
plot_image(horse_x[1], shape=[32, 32], cmap = "Greys_r")
Postavite procjenitelj skupa podataka
U redu, sada kada je skup podataka spreman za upotrebu, možete početi koristiti Tensorflow. Prije izrade modela, upotrijebimo procjenitelj podataka Tensorflow za napajanje mreže.
Izgradit ćete skup podataka pomoću procjenitelja TensorFlow. Da biste osvježili misli, morate koristiti:
- from_tensor_slices
- ponoviti
- šarža
Puni kod za izgradnju skupa podataka je:
dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)
Imajte na umu da je x rezervirano mjesto sljedećeg oblika:
- [None, n_inputs]: Postavite na None jer je broj unosa slika u mrežu jednak veličini serije.
za detalje pogledajte tutorial o linearnoj regresiji.
Nakon toga trebate stvoriti iterator. Bez ovog retka koda, niti jedan podatak neće proći kroz cjevovod.
iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()
Sada kada je cjevovod spreman, možete provjeriti je li prva slika ista kao prije (tj. Čovjek na konju).
Veličinu serije postavite na 1 jer skup podataka želite hraniti samo jednom slikom. Dimenziju podataka možete vidjeti s printom (sess.run (značajke) .shape). Jednako je (1, 1024). 1 znači da je ubačena samo jedna slika s 1024. Ako je veličina serije postavljena na dvije, tada će dvije slike proći kroz cjevovod. (Ne mijenjajte veličinu serije. U suprotnom će se pojaviti pogreška. Samo jedna slika istovremeno može ići u funkciju plot_image ().
## 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)
Izgradite mrežu
Vrijeme je za izgradnju mreže. Trenirat ćete naslagani autokoder, odnosno mrežu s više skrivenih slojeva.
Vaša će mreža imati jedan ulazni sloj s 1024 točke, tj. 32x32, oblik slike.
Blok kodera imat će jedan gornji skriveni sloj s 300 neurona, središnji sloj sa 150 neurona. Dekoderski blok je simetričan koderu. Mrežu možete vizualizirati na donjoj slici. Imajte na umu da možete promijeniti vrijednosti skrivenih i središnjih slojeva.
![](https://cdn.css-code.org/5927179/tensorflow_autoencoder_dataset_with_deep_learning_example_4.png.webp)
Izgradnja mreže za Autoencoder
Izgradnja autoodekodera vrlo je slična bilo kojem drugom modelu dubokog učenja.
Model ćete konstruirati slijedeći ove korake:
- Definirajte parametre
- Definirajte slojeve
- Definirajte arhitekturu
- Definirajte optimizaciju
- Pokreni model
- Procijenite model
U prethodnom odjeljku naučili ste kako stvoriti cjevovod za napajanje modela, tako da nema potrebe za ponovnim izradom skupa podataka. Konstruirat ćete autokoder s četiri sloja. Koristite inicijalizaciju Xavier. Ovo je tehnika postavljanja početnih težina jednakih varijansi ulaznih i izlaznih podataka. Napokon, koristite funkciju aktivacije elua. Funkciju gubitka regulirate regulatorom L2.
Korak 1) Definirajte parametre
Prvi korak podrazumijeva definiranje broja neurona u svakom sloju, brzinu učenja i hiperparametar regularizatora.
Prije toga djelomično uvezete funkciju. Bolja je metoda za definiranje parametara gustog sloja. Kôd u nastavku definira vrijednosti arhitekture autoenkoder. Kao što je prethodno navedeno, autokoder ima dva sloja, s 300 neurona u prvim slojevima i 150 u drugim slojevima. Njihove vrijednosti pohranjene su u n_hidden_1 i n_hidden_2.
Morate definirati brzinu učenja i L2 hiperparametar. Vrijednosti su pohranjene u learning_rate i 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 inicijalizacije Xaviera poziva se s objektom xavier_initializer iz doprinosa procjenitelja. U istom procjenitelju možete dodati regularizator s 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) Definirajte slojeve
Postavljeni su svi parametri gustog sloja; sve možete spakirati u varijablu gusti_sloj pomoću djelomičnog objekta. thick_layer koji koristi ELU aktivaciju, Xavier inicijalizaciju i L2 regularizaciju.
## Create the dense layerdense_layer = partial(tf.layers.dense,activation=tf.nn.elu,kernel_initializer=xav_init,kernel_regularizer=l2_regularizer)
Korak 3) Definirajte arhitekturu
Ako pogledate sliku arhitekture, primijetite da mreža slaže tri sloja s izlaznim slojem. U donjem kodu povezujete odgovarajuće slojeve. Na primjer, prvi sloj izračunava točkasti proizvod između ulaznih značajki matrice i matrica koje sadrže 300 pondera. Nakon što se izračuna točkasti proizvod, izlaz ide u funkciju aktiviranja Elu. Izlaz postaje ulaz sljedećeg sloja, zato ga koristite za izračunavanje hidden_2 i tako dalje. Množenje matrica je isto za svaki sloj jer koristite istu funkciju aktiviranja. Imajte na umu da zadnji sloj, izlaz, ne primjenjuje funkciju aktivacije. To ima smisla jer je ovo rekonstruirani ulaz
## 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) Definirajte optimizaciju
Posljednji korak je izgradnja optimizatora. Pogrešku srednjeg kvadrata koristite kao funkciju gubitka. Ako se sjetite lekcije o linearnoj regresiji, znate da se MSE izračunava s razlikom između predviđenog izlaza i stvarne oznake. Ovdje je oznaka značajka jer model pokušava rekonstruirati ulaz. Stoga želite srednju vrijednost zbroja razlike kvadrata između predviđenog izlaza i unosa. Pomoću TensorFlow možete kodirati funkciju gubitka na sljedeći način:
loss = tf.reduce_mean(tf.square(outputs - features))
Zatim trebate optimizirati funkciju gubitka. Za izračun gradijenata koristite Adamov optimizator. Cilj je minimalizirati gubitak.
## Optimizeloss = tf.reduce_mean(tf.square(outputs - features))optimizer = tf.train.AdamOptimizer(learning_rate)train = optimizer.minimize(loss)
Još jedna postavka prije treninga modela. Želite koristiti skupnu veličinu od 150, odnosno dovoditi cjevovod sa 150 slika u svakoj iteraciji. Morate ručno izračunati broj iteracija. To je trivijalno učiniti:
Ako želite svaki put proslijediti 150 slika i znate da u skupu podataka ima 5000 slika, broj iteracija je jednak. U pythonu možete pokrenuti sljedeće kodove i provjeriti je li izlaz 33:
BATCH_SIZE = 150### Number of batches : length dataset / batch sizen_batches = horse_x.shape[0] // BATCH_SIZEprint(n_batches)33
Korak 5) Pokrenite model
Posljednje, ali ne najmanje važno, trenirajte model. Trenirate model sa 100 epoha. Odnosno, model će vidjeti slike 100 puta veće do optimiziranih težina.
Već ste upoznati s kodovima za osposobljavanje modela u Tensorflowu. Mala je razlika u usmjeravanju podataka prije izvođenja treninga. Na taj način model brže trenira.
Zanima vas ispis gubitka nakon deset epoha kako biste vidjeli da li model nešto uči (tj. Gubitak se smanjuje). Trening traje 2 do 5 minuta, ovisno o hardveru vašeg stroja.
## 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) Procijenite model
Sad kad ste obučili svoj model, vrijeme je da ga procijenite. Morate uvesti testni sert iz datoteke / 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'])
NAPOMENA: Za Windows sustav kôd postaje test_data = unpickle (r "E: \ cifar-10-batches-py \ test_batch")
Možete pokušati ispisati slike 13, što je konj
plot_image(test_x[13], shape=[32, 32], cmap = "Greys_r")
Za procjenu modela upotrijebit ćete vrijednost piksela ove slike i provjeriti može li koder rekonstruirati istu sliku nakon smanjenja 1024 piksela. Imajte na umu da definirate funkciju za procjenu modela na različitim slikama. Model bi trebao bolje raditi samo na konjima.
Funkcija uzima dva argumenta:
- df: Uvoz podataka testa
- broj_broja: naznačite koju sliku želite uvesti
Funkcija je podijeljena u tri dijela:
- Preoblikujte sliku u ispravnu dimenziju, tj. 1, 1024
- Nahranite model nevidljivom slikom, kodirajte / dekodirajte sliku
- Ispišite stvarnu i rekonstruiranu sliku
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()
Sada kada je definirana funkcija procjene, možete pogledati rekonstruiranu sliku broj trinaest
reconstruct_image(df =test_x, image_number = 13)
INFO:tensorflow:Restoring parameters from ./model.ckptModel restored.(1, 1024)
Sažetak
Primarna svrha automatskog kodera je komprimirati ulazne podatke, a zatim ih dekomprimirati u izlaz koji izgleda usko poput izvornih podataka.
Arhitektura automatskog kodera simetričnog s osovinskim slojem nazvanim središnji sloj.
Autokoder možete stvoriti pomoću:
- Djelomično: za stvaranje gustih slojeva s tipičnom postavkom:
-
tf.layers.dense,activation=tf.nn.elu,kernel_initializer=xav_init,kernel_regularizer=l2_regularizer
- thick_layer (): za množenje matrice
možete definirati funkciju gubitka i optimizaciju pomoću:
loss = tf.reduce_mean(tf.square(outputs - features))optimizer = tf.train.AdamOptimizer(learning_rate)train = optimizer.minimize(loss)
Zadnje pokretanje sesije za obuku modela.