Klasifikacija CNN slike u TensorFlowu s koracima i primjerima
โก Pametni saลพetak
Konvolucijske neuronske mreลพe skeniraju sliku malim filterima umjesto da jednako ponderiraju svaki piksel, zbog ฤega dominiraju raฤunalnim vidom. Ovaj vodiฤ objaลกnjava svaki sloj, a zatim klasificira MNIST znamenke pomoฤu TensorFlowa.
ล to je konvolucijska neuronska mreลพa?
Konvolucijska neuronska mreลพa, takoฤer poznat kao convnets ili CNN, dobro je poznata metoda u primjenama raฤunalnog vida. To je klasa dubokih neuronskih mreลพa koje se koriste za analizu vizualnih slika. Ova vrsta arhitekture dominantna je za prepoznavanje objekata sa slike ili videa. Koristi se u aplikacijama poput prepoznavanja slika ili videa, obrade prirodnog jezika i sustava preporuka.
Archistruktura konvolucijske neuronske mreลพe
Sjetite se Facebooka prije nekoliko godina, nakon ลกto ste prenijeli sliku na svoj profil, od vas se traลพilo da ruฤno dodate ime licu na slici. Danas Facebook koristi convnet za automatsko oznaฤavanje vaลกeg prijatelja na slici.
Konvolucijska neuronska mreลพa za klasifikaciju slika nije teลกko razumjeti. Ulazna slika se obraฤuje tijekom faze konvolucije i kasnije joj se pripisuje oznaka.
Tipiฤna arhitektura convnet mreลพe moลพe se saลพeti na slici ispod. Prvo se slika ลกalje mreลพi; to se naziva ulazna slika. Zatim ulazna slika prolazi kroz niz koraka; to je konvolucijski dio mreลพe. Konaฤno, neuronska mreลพa moลพe predvidjeti znamenku na slici.

Slika se sastoji od niza piksela s visinom i ลกirinom. Slika u sivim tonovima ima samo jedan kanal, dok slika u boji ima tri kanala (svaki za crvenu, zelenu i plavu). Kanali su naslagani jedan preko drugog. U ovom vodiฤu koristit ฤete sliku u sivim tonovima s jednim kanalom. Svaki piksel ima vrijednost od 0 do 255 kako bi odraลพavao intenzitet boje. Na primjer, piksel jednak 0 prikazivat ฤe bijelu boju, dok ฤe piksel s vrijednoลกฤu blizu 255 biti tamniji.
Pogledajmo sliku pohranjenu u MNIST skup podatakaDonja slika prikazuje kako prikazati sliku lijevo u matriฤnom formatu. Imajte na umu da je izvorna matrica standardizirana da bude izmeฤu 0 i 1. Za tamnije boje, vrijednost u matrici je oko 0.9, dok bijeli pikseli imaju vrijednost 0.
Konvolucijska operacija
Najkritiฤnija komponenta u modelu je konvolucijski sloj. Ovaj dio ima za cilj smanjenje veliฤine slike radi brลพeg izraฤuna teลพina i poboljลกanja generalizacije.
Tijekom konvolucijskog dijela, mreลพa zadrลพava bitne znaฤajke slike i iskljuฤuje nebitan ลกum. Na primjer, model uฤi kako prepoznati slona na slici s planinom u pozadini. Ako koristite tradicionalnu neuronsku mreลพu, model ฤe dodijeliti teลพinu svim pikselima, ukljuฤujuฤi one s planine, ลกto nije bitno i moลพe zavarati mreลพu.
Umjesto toga, a Keras konvolucijska neuronska mreลพa koristit ฤe matematiฤku tehniku โโza objaลกnjenjetracsamo najrelevantnije piksele. Ova matematiฤka operacija naziva se konvolucija. Ova tehnika omoguฤuje mreลพi da uฤi sve sloลพenije znaฤajke na svakom sloju. Konvolucija dijeli matricu na male dijelove kako bi se nauฤili najvaลพniji elementi unutar svakog dijela.
Komponente konvolucijske neuronske mreลพe (ConvNet ili CNN)
Konvertibilna mreลพa ima ฤetiri komponente:
- saziv
- Nelinearnost (ReLU)
- Pooling ili poduzorkovanje
- Klasifikacija (potpuno povezani sloj)
saziv
Svrha konvolucije je objasnititraclokalno prepoznaje znaฤajke objekta na slici. To znaฤi da ฤe mreลพa nauฤiti specifiฤne uzorke unutar slike i moฤi ฤe ih prepoznati svugdje na slici.
Konvolucija je mnoลพenje po elementima. Koncept je lako razumjeti. Raฤunalo ฤe skenirati dio slike, obiฤno dimenzije 3 ร 3, i mnoลพiti ga filterom. Izlaz mnoลพenja po elementima naziva se mapa znaฤajki. Ovaj se korak ponavlja sve dok se ne skenira cijela slika. Imajte na umu da se nakon konvolucije veliฤina slike smanjuje.
Donji dijagram prikazuje jedan dio slike koji se mnoลพi filterom kako bi se dobila jedna ฤelija mape znaฤajki.
Animacija ispod prikazuje istu konvoluciju koja se proteลพe preko cijele slike.
Dostupni su brojni filteri. U nastavku smo naveli neke od njih. Moลพete vidjeti da svaki filter ima odreฤenu svrhu. Imajte na umu da je na slici ispod jezgra sinonim za filter.
Aritmetika iza konvolucije
Konvolucijska faza ฤe primijeniti filter na mali niz piksela unutar slike. Filter ฤe se pomicati duลพ ulazne slike opฤeg oblika 3ร3 ili 5ร5. To znaฤi da ฤe mreลพa pomicati ove prozore preko cijele ulazne slike i izraฤunati konvoluciju. Animacija u nastavku prikazuje kako konvolucija funkcionira. Veliฤina podruฤja je 3ร3, a izlazna matrica je rezultat operacije po elementima izmeฤu matrice slike i filtera.
Primjeฤujete da se ลกirina i visina izlaza mogu razlikovati od ลกirine i visine ulaza. To se dogaฤa zbog efekta granice.
Efekt granice
Slika ima mapu znaฤajki 5ร5 i filter 3ร3. U sredini se nalazi samo jedan prozor gdje filter moลพe prikazati mreลพu 3ร3. Izlazna mapa znaฤajki smanjuje se za dvije ploฤice na svakoj osi, ostavljajuฤi dimenziju 3ร3.
Da biste dobili istu izlaznu dimenziju kao i ulaznu dimenziju, potrebno je dodati popunjavanje. Popunjavanje se sastoji od dodavanja odgovarajuฤeg broja redaka i stupaca sa svake strane matrice. To ฤe omoguฤiti konvoluciji da centrira svaku ulaznu ploฤicu. Na slici ispod, ulazna i izlazna matrica imaju istu dimenziju, 5ร5.
Kada definirate mreลพu, konvolvirane znaฤajke kontroliraju tri parametra:
Dubina: Definira broj filtera koji ฤe se primijeniti tijekom konvolucije. U prethodnom primjeru vidjeli ste dubinu od 1, ลกto znaฤi da se koristi samo jedan filter. U veฤini sluฤajeva postoji viลกe od jednog filtera. Animacija u nastavku prikazuje operacije izvedene u situaciji s tri filtera.
Korak: Definira broj "skokova piksela" izmeฤu dva sloja. Ako je korak jednak 1, prozor ฤe se pomicati s rasponom piksela od jedan. Ako je korak jednak dva, prozor ฤe skoฤiti za 2 piksela. Ako poveฤate korak, imat ฤete manje mape znaฤajki. Dva dijagrama u nastavku usporeฤuju korak od 1 s korakom od 2.
Primjer koraka 1
korak 2
Nula-popuna: Dopunjavanje je operacija dodavanja odgovarajuฤeg broja redaka i stupaca sa svake strane ulaznih mapa znaฤajki. U ovom sluฤaju, izlaz ima istu dimenziju kao i ulaz.
Nelinearnost (ReLU)
Na kraju operacije konvolucije, izlaz je podloลพan aktivacijskoj funkciji kako bi se omoguฤila nelinearnost. Uobiฤajena aktivacijska funkcija za konvoluciju je ReLU. Svi pikseli s negativnom vrijednoลกฤu bit ฤe zamijenjeni nulom.
Pooling OperaANJE
Ovaj korak je lako razumjeti. Svrha grupiranja je smanjenje dimenzionalnosti ulazne slike. Koraci se provode kako bi se smanjila raฤunalna sloลพenost operacije. Smanjenjem dimenzionalnosti, mreลพa ima manje teลพina za izraฤunati, pa se sprjeฤava prekomjerno prilagoฤavanje.
U ovoj fazi morate definirati veliฤinu i korak. Standardni naฤin objedinjavanja ulazne slike je koriลกtenje maksimalne vrijednosti mape znaฤajki. Pogledajte sliku ispod. Objedinjavanje ฤe prikazati ฤetiri podmatrice mape znaฤajki 4ร4 i vratiti maksimalnu vrijednost. Objedinjavanje uzima maksimalnu vrijednost niza 2ร2, a zatim pomiฤe ovaj prozor za dva piksela. Na primjer, prva podmatrica je [3,1,3,2], pa ฤe objedinjavanje vratiti maksimum, koji je 3.
Postoji joลก jedna operacija udruลพivanja kao ลกto je srednja vrijednost.
Ova operacija agresivno smanjuje veliฤinu mape znaฤajki.
Potpuno povezani slojevi
Posljednji korak sastoji se od izgradnje tradicionalnog umjetna neuronska mreลพa kao ลกto ste uฤinili u prethodnom vodiฤu. Povezujete sve neurone iz prethodnog sloja sa sljedeฤim slojem. Koristite softmax aktivacijsku funkciju za klasificiranje broja na ulaznoj slici.
Rekapitulacija:
TensorFlow konvolucijska neuronska mreลพa sastavlja razliฤite slojeve prije nego ลกto napravi predviฤanje. Neuronska mreลพa ima:
- Konvolucijski sloj
- ReLU aktivacijska funkcija
- Pooling sloj
- Gusto povezani sloj
Konvolucijski slojevi primjenjuju razliฤite filtere na podregiju slike. ReLU aktivacijska funkcija dodaje nelinearnost, a slojevi zdruลพivanja smanjuju dimenzionalnost mapa znaฤajki.
Svi ovi slojevi extracbitne informacije sa slika. Na kraju se mape znaฤajki ลกalju potpuno povezanom sloju s softmax funkcijom kako bi se napravilo predviฤanje.
Uvjeลพbajte CNN uz TensorFlow
Sada kada ste upoznati s gradivnim blokovima convnet mreลพe, spremni ste je izgraditi pomoฤu TensorFlow. Koristit ฤemo skup podataka MNIST za CNN klasifikaciju slika.
Priprema podataka je ista kao u prethodnom vodiฤu. Moลพete pokrenuti kodove i skoฤiti izravno na arhitekturu CNN-a.
Za klasifikaciju slika pomoฤu CNN-a slijedit ฤete korake u nastavku:
- Korak 1: Prenesite skup podataka
- Korak 2: Ulazni sloj
- Korak 3: Konvolucijski sloj
- Korak 4: Pooling sloj
- Korak 5: Drugi konvolucijski sloj i Pooling Sloj
- Korak 6: Gusti sloj
- Korak 7: Logit sloj
Napomena o verziji: Donji popisi ciljaju TensorFlow 1.x. U TensorFlowu 2 imenski prostor tf.layers i tf.estimator.inputs.numpy_input_fn viลกe ne postoje; ekvivalenti su tf.keras.layers.Conv2D, MaxPooling2D, Dense i Dropout sastavljeni u tf.keras.Model i trenirani s model.fit(). Proฤitajte korake za mehaniku svakog sloja, a zatim ih mapirajte na Keras API.
Korak 1: Prenesite skup podataka
Skup podataka MNIST dostupan je putem scikit-learn. Preuzmite ga i pohranite u Preuzimanja. Moลพete ga prenijeti pomoฤu fetch_mldata('MNIST original').
Napomena o verziji: mldata.org je zatvoren i fetch_mldata() je uklonjen u scikit-learn verziji 0.22. Na bilo kojoj trenutnoj instalaciji, uฤitajte iste znamenke s fetch_openml umjesto toga, koristi se fetch_openml('mnist_784', version=1). Ostatak cjevovoda ostaje nepromijenjen.
Stvorite set vlakova/testiranja
Skup podataka morate podijeliti pomoฤu train_test_split.
Skalirajte znaฤajke
Konaฤno, moลพete skalirati znaฤajke pomoฤu MinMaxScalera kao ลกto je prikazano na donjoj klasifikaciji slike koristeฤi primjer TensorFlow CNN-a.
import numpy as np import tensorflow as tf from sklearn.datasets import fetch_mldata #Change USERNAME by the username of your machine ## Windows USER mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original') ## Mac User mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original') print(mnist.data.shape) print(mnist.target.shape) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape ) ## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64)) feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])] X_train_scaled.shape[1:]
Definirajte CNN
CNN koristi filtere na sirovim pikselima slike kako bi nauฤio uzorke detalja u usporedbi s globalnim uzorcima koje je nauฤila tradicionalna neuronska mreลพa. Za konstrukciju CNN-a potrebno je definirati:
- Konvolucijski sloj: Primijenite n filtera na mapu znaฤajki. Nakon konvolucije, potrebno je koristiti ReLU aktivacijsku funkciju za dodavanje nelinearnosti mreลพi.
- Pooling sloj: Sljedeฤi korak nakon konvolucije je smanjenje uzorkovanja karte znaฤajki. Svrha je smanjiti dimenzionalnost karte znaฤajki kako bi se sprijeฤilo prekomjerno prilagoฤavanje i poboljลกala brzina izraฤuna. Maksimalno grupiranje je konvencionalna tehnika koja dijeli karte znaฤajki u podregije (obiฤno veliฤine 2ร2) i zadrลพava samo maksimalne vrijednosti.
- Potpuno povezani slojevi: Svi neuroni iz prethodnih slojeva povezani su sa sljedeฤim slojevima. CNN ฤe klasificirati oznaku prema znaฤajkama iz konvolucijskih slojeva i reducirati sa slojem udruลพivanja.
CNN arhitektura
- Konvolucijski sloj: Primjenjuje 14 filtera veliฤine 5ร5 (npr.trac(podregije veliฤine 5 ร 5 piksela), s ReLU aktivacijskom funkcijom
- Pooling Sloj: Izvodi maksimalno udruลพivanje s filtrom 2ร2 i korakom od 2 (ลกto navodi da se objedinjena podruฤja ne preklapaju)
- Konvolucijski sloj: primjenjuje 36 filtara 5ร5, s ReLU aktivacijskom funkcijom
- Pooling Sloj #2: Opet, izvodi maksimalno udruลพivanje s filtrom 2ร2 i korakom od 2
- 1,764 neurona, sa stopom regulacije ispadanja od 0.4 (vjerojatnost od 0.4 da ฤe bilo koji element biti odbaฤen tijekom treninga)
- Gusti sloj (logiฤki sloj): 10 neurona, po jedan za svaku ciljnu klasu znamenki (0โ9).
Postoje tri vaลพna modula koja se koriste za stvaranje CNN-a:
- conv2d(). Konstruira dvodimenzionalni konvolucijski sloj s brojem filtara, veliฤinom jezgre filtra, ispunom i aktivacijskom funkcijom kao argumentima.
- max_udruลพivanje2d(). Konstruira dvodimenzionalni sloj udruลพivanja pomoฤu algoritma maksimalnog udruลพivanja.
- gust(). Konstruira gusti sloj sa skrivenim slojevima i jedinicama
Definirat ฤete funkciju za izgradnju CNN-a. Pogledajmo detaljno kako konstruirati svaki graฤevni blok prije premotavanja.ping sve zajedno u funkciji.
Korak 2: Ulazni sloj
def cnn_model_fn(features, labels, mode): input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Morate definirati tenzor s oblikom podataka. Za to moลพete koristiti modul tf.reshape. U ovom modulu trebate deklarirati tenzor koji ลพelite preoblikovati i oblik tenzora. Prvi argument je znaฤajka podataka, koja je definirana u argumentu funkcije.
Slika ima visinu, ลกirinu i kanal. Skup podataka MNIST je monokromatska slika veliฤine 28ร28. Veliฤinu serije postavljamo na -1 u argumentu oblika tako da poprima oblik znaฤajki ["x"]. Prednost je u tome ลกto je veliฤina serije hiperparametar za podeลกavanje. Ako je veliฤina serije postavljena na 7, tenzor ฤe dati 5,488 vrijednosti (28*28*7).
Korak 3: Konvolucijski sloj
# first Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
Prvi konvolucijski sloj ima 14 filtera s veliฤinom jezgre 5ร5 s istim popunjavanjem. Ista popunjavanja znaฤe da i izlazni i ulazni tenzor trebaju imati istu visinu i ลกirinu. TensorFlow ฤe dodati nule u retke i stupce kako bi osigurao istu veliฤinu.
Koristite ReLU aktivacijsku funkciju. Izlazna veliฤina bit ฤe [28, 28, 14].
Korak 4: Pooling sloj
Sljedeฤi korak nakon konvolucije je izraฤun zdruลพivanja. Izraฤun zdruลพivanja smanjit ฤe dimenzionalnost podataka. Moลพete koristiti modul max_pooling2d s veliฤinom 2ร2 i korakom od 2. Koristite prethodni sloj kao ulaz. Izlazna veliฤina bit ฤe [batch_size, 14, 14, 14].
# first Pooling Layer
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Korak 5: Drugi konvolucijski sloj i Pooling Sloj
Drugi konvolucijski sloj primjenjuje 36 filtera, dajuฤi izlaznu veliฤinu [veliฤina_serije, 14, 14, 36]. Sloj za objedinjavanje koristi isti 2ร2 prozor i korak od 2 kao i prije, pa prepolovi svaku prostornu os i izlazni oblik postaje [veliฤina_serije, 7, 7, 36].
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=36,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
Korak 6: Gusti sloj
Zatim morate definirati potpuno povezani sloj. Karta znaฤajki mora se izravnati prije povezivanja s gustim slojem. Moลพete koristiti preoblikovanje modula veliฤine 7*7*36.
Gusti sloj ฤe povezati 1,764 neurona. Dodajete ReLU aktivacijsku funkciju. Osim toga, dodajete ฤlan regularizacije ispadanja s brzinom od 0.3, ลกto znaฤi da ฤe 30 posto aktivacija biti postavljeno na 0. Imajte na umu da se ispadanje dogaฤa samo tijekom faze treniranja. Funkcija cnn_model_fn ima argument mode za deklariranje treba li model trenirati ili evaluirati, kao ลกto je prikazano u donjem primjeru klasifikacije CNN slike TensorFlow.
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])
dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)
Korak 7: Logit sloj
Konaฤno, u primjeru klasifikacije slika TensorFlow, moลพete definirati posljednji sloj s predviฤanjem modela. Izlazni oblik jednak je veliฤini serije i 10, ukupnom broju ciljnih klasa.
# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=10)
Moลพete stvoriti rjeฤnik koji sadrลพi klase i vjerojatnost svake klase. Funkcija tf.argmax() vraฤa indeks najveฤe vrijednosti u logit sloju. Funkcija softmax vraฤa vjerojatnost svake klase.
predictions = {
# Generate predictions
"classes": tf.argmax(input=logits, axis=1),
"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }
ลฝelite vratiti rjeฤnik predviฤanja samo kada je naฤin rada postavljen na predviฤanje. Dodajete ovaj kod za prikaz predviฤanja.
if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
Sljedeฤi korak sastoji se od izraฤunavanja gubitka modela. U proลกlom tutorijalu ste nauฤili da je funkcija gubitka za model s viลกe klasa unakrsna entropija. Gubitak se lako izraฤunava sljedeฤim kodom:
# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
Posljednji korak primjera TensorFlow CNN-a je optimizacija modela, odnosno pronalaลพenje najboljih vrijednosti teลพina. Za to se koristi gradijentni optimizator s brzinom uฤenja od 0.001. Cilj je minimizirati gubitak.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
loss=loss,
global_step=tf.train.get_global_step())
Zavrลกili ste s CNN-om. Meฤutim, ลพelite prikazati metrike performansi tijekom naฤina evaluacije. Metrika performansi za model s viลกe klasa je toฤnost. TensorFlow je opremljen modulom toฤnosti koji prima dva argumenta, oznake i predviฤene vrijednosti.
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
To je to. Stvorili ste svoj prvi CNN i spremni ste sve zamotati u funkciju kako biste je upotrijebili za obuku i procjenu modela.
def cnn_model_fn(features, labels, mode): """Model function for CNN.""" # Input Layer input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) # Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) # Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) # Convolutional Layer #2 and Pooling Layer conv2 = tf.layers.conv2d( inputs=pool1, filters=36, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) # Dense Layer pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36]) dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu) dropout = tf.layers.dropout( inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) # Logits Layer logits = tf.layers.dense(inputs=dropout, units=10) predictions = { # Generate predictions (for PREDICT and EVAL mode) "classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor") } if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) # Calculate Loss loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) # Configure the Training Op (for TRAIN mode) if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step()) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) # Add evaluation metrics Evaluation mode eval_metric_ops = { "accuracy": tf.metrics.accuracy( labels=labels, predictions=predictions["classes"])} return tf.estimator.EstimatorSpec( mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
Napomena o sastavljenoj funkciji: Gornja omotana verzija postavlja prvi konvolucijski sloj na 32 filtera i ispuลกtanje na 0.4, dok detaljni isjeฤci koriste 14 filtera i 0.3. Oba se izvode, ali odaberite jedan par vrijednosti i odrลพite ga konzistentnim kako bi ispisani oblici odgovarali tablici slojeva.
Koraci u nastavku su isti kao i prethodni vodiฤi.
Prije svega, definirate procjenitelj s CNN modelom za klasifikaciju slika.
# Create the Estimator mnist_classifier = tf.estimator.Estimator( model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")
CNN se dugo trenira, stoga se svakih 50 iteracija stvara logging hook za pohranjivanje vrijednosti softmax slojeva.
# Set up logging for predictions tensors_to_log = {"probabilities": "softmax_tensor"} logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)
Spremni ste procijeniti model. Postavljate veliฤinu serije od 100 i mijeลกate podatke. Imajte na umu da smo postavili korake treniranja od 16 000, ลกto moลพe potrajati puno vremena za treniranje. Budite strpljivi.
# Train the model train_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=100, num_epochs=None, shuffle=True) mnist_classifier.train( input_fn=train_input_fn, steps=16000, hooks=[logging_hook])
Sada kada je model obuฤen, moลพete ga procijeniti i ispisati rezultate.
# Evaluate the model and print results eval_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, num_epochs=1, shuffle=False) eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn) print(eval_results)
Evaluacija ispisuje obnovljenu kontrolnu toฤku, korak na kojem je zaustavljeno i konaฤni rjeฤnik metrika.
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56 INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269 {'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}
S trenutnom arhitekturom, rjeฤnik evaluacije izvjeลกtava o toฤnosti od 0.9689286, ลกto je otprilike 97%. Moลพete promijeniti arhitekturu, veliฤinu serije i broj iteracija kako biste poboljลกali toฤnost. CNN je pokazao daleko bolje rezultate od umjetna neuronska mreลพa ili logistiฤka regresija: u tutorijalu o umjetnim neuronskim mreลพama imali ste toฤnost od 96%, ลกto je niลพe od CNN-a. Performanse CNN-a su impresivne s veฤim skupom slika, kako u pogledu brzine izraฤuna, tako i u pogledu toฤnosti.











