Klasifikacija CNN slike u TensorFlowu s koracima i primjerima
ล to je konvolucijska neuronska mreลพa?
Konvolucijska neuronska mreลพa, takoฤer poznat kao convnets ili CNN, dobro je poznata metoda u aplikacijama raฤunalnog vida. To je klasa dubokih neuronskih mreลพa koje se koriste za analizu vizualnih slika. Ova vrsta arhitekture je dominantna za prepoznavanje objekata sa slike ili videa. Koristi se u aplikacijama kao ลกto su prepoznavanje slika ili videa, obrada neuralnog jezika itd.
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 convneta moลพe se saลพeti na slici ispod. Prije svega, slika se ลกalje na mreลพu; to se zove ulazna slika. Zatim, ulazna slika prolazi kroz beskonaฤan broj koraka; ovo je konvolucijski dio mreลพe. Konaฤno, neuronska mreลพa moลพe predvidjeti znamenku na slici.

Slika se sastoji od niza piksela visine i ลกirine. 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 sa samo jednim kanalom. Svaki piksel ima vrijednost od 0 do 255 koja odraลพava intenzitet boje. Na primjer, piksel jednak 0 pokazat ฤe bijelu boju dok ฤe piksel s vrijednoลกฤu blizu 255 biti tamniji.
Pogledajmo sliku pohranjenu u MNIST skup podataka. Slika ispod pokazuje kako prikazati sliku lijeve strane u matriฤnom formatu. Imajte na umu da je izvorna matrica standardizirana da bude izmeฤu 0 i 1. Za tamniju boju 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 smanjiti veliฤinu slike za brลพe izraฤunavanje teลพina i poboljลกati njezinu generalizaciju.
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 nauฤila najbitnije elemente unutar svakog dijela.
Komponente konvolucijske neuronske mreลพe (ConvNet ili CNN)
Postoje ฤetiri komponente Convneta
- 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 dimenzija 3ร3 i umnoลพiti ga u filter. Izlaz mnoลพenja po elementima naziva se mapa znaฤajki. Ovaj korak se ponavlja dok se ne skenira cijela slika. Imajte na umu da se nakon konvolucije veliฤina slike smanjuje.
Ispod se nalazi URL vidjeti u akciji kako konvolucija funkcionira.
Dostupni su brojni kanali. U nastavku smo naveli neke od kanala. Moลพete vidjeti da svaki filtar ima odreฤenu svrhu. Napomena, na slici ispod; Kernel je sinonim za filter.
Aritmetika iza konvolucije
Konvolucijska faza primijenit ฤe filtar na mali niz piksela unutar slike. Filtar ฤe se pomicati duลพ ulazne slike s opฤim oblikom 3ร3 ili 5ร5. To znaฤi da ฤe mreลพa kliziti ovim prozorima preko cijele ulazne slike i izraฤunati konvoluciju. Slika ispod pokazuje kako radi konvolucija. Veliฤina zakrpe je 3ร3, a izlazna matrica rezultat je elementarne operacije izmeฤu matrice slike i filtra.
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 kartu znaฤajki 5ร5 i filtar 3ร3. Postoji samo jedan prozor u sredini gdje filtar moลพe prikazati mreลพu 3ร3. Izlazna karta znaฤajki smanjit ฤe se za dvije ploฤice zajedno s dimenzijom 3ร3.
Da biste dobili istu izlaznu dimenziju kao ulaznu dimenziju, morate dodati ispunu. Ispuna se sastoji od dodavanja pravog broja redaka i stupaca sa svake strane matrice. To ฤe omoguฤiti da konvolucija centrira svaku ulaznu ploฤicu. Na slici ispod, ulazno/izlazna matrica ima istu dimenziju 5ร5
Kada definirate mreลพu, konvolvirane znaฤajke kontroliraju tri parametra:
- Dubina: Definira broj filtara koji se primjenjuju tijekom konvolucije. U prethodnom primjeru vidjeli ste dubinu 1, ลกto znaฤi da se koristi samo jedan filtar. U veฤini sluฤajeva postoji viลกe od jednog filtera. Donja slika prikazuje operacije izvedene u situaciji s tri filtera
- Korak: Definira broj "skoka piksela" izmeฤu dva dijela. Ako je korak jednak 1, prozori ฤe se pomicati s rasponom piksela od jedan. Ako je korak jednak dva, prozori ฤe skoฤiti za 2 piksela. Ako poveฤate korak, imat ฤete manje mape znaฤajki.
Primjer koraka 1
korak 2
- Nulta podstava: Ispuna je operacija dodavanja odgovarajuฤeg broja redaka i stupaca sa svake strane karte ulaznih znaฤajki. U ovom sluฤaju, izlaz ima istu dimenziju kao i ulaz.
Nelinearnost (ReLU)
Na kraju operacije konvolucije, izlaz podlijeลพe aktivacijskoj funkciji kako bi se omoguฤila nelinearnost. Uobiฤajena funkcija aktivacije za convnet je Relu. Svi pikseli s negativnom vrijednoลกฤu bit ฤe zamijenjeni nulom.
Pooling OperaANJE
Ovaj je korak lako razumjeti. Svrha udruลพivanja je smanjiti dimenzionalnost ulazne slike. Koraci se rade kako bi se smanjila raฤunalna sloลพenost operacije. Smanjenjem dimenzionalnosti, mreลพa ima manje teลพine za izraฤunavanje, tako da sprjeฤava prekomjerno prilagoฤavanje.
U ovoj fazi potrebno je definirati veliฤinu i korak. Standardni naฤin skupljanja ulazne slike je koriลกtenje maksimalne vrijednosti karte znaฤajki. Pogledajte sliku ispod. "Udruลพivanje" ฤe prikazati ฤetiri podmatrice karte znaฤajki 4ร4 i vratiti maksimalnu vrijednost. Skupljanje uzima maksimalnu vrijednost niza 2ร2 i zatim pomiฤe ove prozore za dva piksela. Na primjer, prva podmatrica je [3,1,3,2], udruลพivanje ฤe 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 Convolutional Neural network kompilira razliฤite slojeve prije predviฤanja. Neuronska mreลพa ima:
- Konvolucijski sloj
- Relu aktivacijska funkcija
- Pooling sloj
- Gusto povezani sloj
Konvolucijski slojevi primjenjuju razliฤite filtre na podregiju slike. Aktivacijska funkcija Relu dodaje nelinearnost, a slojevi udruลพivanja smanjuju dimenzionalnost mapa znaฤajki.
Svi ovi slojevi extracbitne informacije sa slika. Na kraju, karta znaฤajki se ลกalje primarnom potpuno povezanom sloju pomoฤu softmax funkcije za izradu predviฤanja.
Uvjeลพbajte CNN uz TensorFlow
Sada kada ste upoznati sa sastavnim elementom konvneta, spremni ste za izgradnju jednog 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
Korak 1: Prenesite skup podataka
MNIST skup podataka dostupan je uz scikit za uฤenje o tome URL. Preuzmite ga i pohranite u Preuzimanja. Moลพete ga uฤitati pomoฤu fetch_mldata('MNIST original').
Stvorite set vlakova/testiranja
Morate podijeliti skup podataka s train_test_split
Skalirajte znaฤajke
Konaฤno, moลพete skalirati znaฤajku s MinMaxScaler-om kao ลกto je prikazano u klasifikaciji slika u nastavku koristeฤi TensorFlow CNN primjer.
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 filtre na neobraฤenom pikselu slike kako bi saznao detalje uzorka u usporedbi s globalnim uzorkom s tradicionalnom neuronskom mreลพom. Da biste izgradili CNN, morate definirati:
- Konvolucijski sloj: Primijenite n broj filtara na mapu znaฤajki. Nakon konvolucije morate upotrijebiti Relu aktivacijsku funkciju za dodavanje nelinearnosti mreลพi.
- Pooling sloj: Sljedeฤi korak nakon konvolucije je smanjenje uzorkovanja maks. Svrha je smanjiti dimenzionalnost mape znaฤajki kako bi se sprijeฤilo prekomjerno uklapanje i poboljลกala brzina izraฤuna. Maksimalno udruลพivanje 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 nego ลกto sve zajedno zamotamo u funkciju.
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. MNIST skup podataka je monokroniฤna slika veliฤine 28ร28. Postavljamo veliฤinu serije na -1 u argumentu oblika tako da poprima oblik znaฤajki[โxโ]. Prednost je podeลกavanje hiperparametara veliฤine serije. Ako je veliฤina serije postavljena na 7, tada ฤe tenzor unijeti 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 filtara s veliฤinom jezgre 5ร5 s istim punjenjem. Isto punjenje znaฤi da bi i izlazni i ulazni tenzor trebali imati istu visinu i ลกirinu. Tensorflow ฤe dodati nule u retke i stupce kako bi osigurao istu veliฤinu.
Koristite Relu aktivacijsku funkciju. Veliฤina izlaza bit ฤe [28, 28, 14].
Korak 4: Pooling sloj
Sljedeฤi korak nakon konvolucije je izraฤun udruลพivanja. Izraฤun udruลพivanja ฤe smanjiti dimenzionalnost podataka. Moลพete koristiti modul max_pooling2d s veliฤinom 2ร2 i korakom 2. Prethodni sloj koristite 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 ima 32 filtera, s izlaznom veliฤinom [batch_size, 14, 14, 32]. Sloj za udruลพivanje ima istu veliฤinu kao i prije, a izlazni oblik je [batch_size, 14, 14, 18].
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 trebate definirati potpuno povezani sloj. Karta znaฤajki mora se izravnati prije povezivanja s gustim slojem. Moลพete koristiti preoblikovanje modula s veliฤinom 7*7*36.
Gusti sloj ฤe povezivati โโ1764 neurona. Dodali ste Relu aktivacijsku funkciju. Osim toga, dodajete termin regularizacije ispadanja sa stopom od 0.3, ลกto znaฤi da ฤe 30 posto teลพina biti postavljeno na 0. Imajte na umu da se ispadanje dogaฤa samo tijekom faze treninga. Funkcija cnn_model_fn ima naฤin argumenta za deklariranje treba li se model obuฤiti ili procijeniti kao ลกto je prikazano u donjem primjeru TensorFlow klasifikacije CNN slike.
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 slike TensorFlow, moลพete definirati posljednji sloj s predviฤanjem modela. Izlazni oblik jednak je veliฤini serije i 10, ukupnom broju slika.
# Logits Layer logits = tf.layers.dense(inputs=dropout, units=10)
Moลพete stvoriti rjeฤnik koji sadrลพi klase i vjerojatnost svake klase. Modul tf.argmax() s vraฤa najveฤu vrijednost ako logit slojevi. 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") }
Predviฤanje rjeฤnika ลพelite vratiti samo kada je naฤin rada postavljen na predviฤanje. Ove kodove dodajete da biste prikazali 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 vodiฤu ste nauฤili da je funkcija gubitka za viลกeklasni model unakrsna entropija. Gubitak se lako izraฤunava pomoฤu sljedeฤeg koda:
# Calculate Loss (for both TRAIN and EVAL modes) loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
Posljednji korak primjera TensorFlow CNN je optimizacija modela, odnosno pronalaลพenje najboljih vrijednosti teลพina. Za to koristite Gradient descent optimizer sa stopom 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 metriku izvedbe tijekom naฤina evaluacije. Mjerilo izvedbe za viลกeklasni model je mjerilo toฤnosti. Tensorflow je opremljen modulom toฤnosti s dva argumenta, oznakama i predviฤenim vrijednostima.
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)
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-u je potrebno mnogo vremena za treniranje, stoga stvarate kuku za biljeลพenje za pohranjivanje vrijednosti softmax slojeva svakih 50 ponavljanja.
# 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 za procjenu modela. Postavljate veliฤinu serije od 100 i mijeลกate podatke. Imajte na umu da smo postavili korake treninga od 16.000, moลพe potrajati puno vremena za trening. Budi strpljiv.
# 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 treniran, 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)
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 dobivate toฤnost od 97%. Moลพete promijeniti arhitekturu, veliฤinu serije i broj ponavljanja kako biste poboljลกali toฤnost. CNN neuronska mreลพa pokazala se daleko boljom od ANN-a ili logistiฤke regresije. U tutorialu o umjetnoj neuronskoj mreลพi imali ste toฤnost od 96%, ลกto je niลพe od CNN-a. Nastupi CNN-a impresivni su veฤom slikom postaviti, kako u pogledu brzine raฤunanja tako i toฤnosti.
Rezime
Konvolucijska neuronska mreลพa vrlo dobro radi za procjenu slike. Ova vrsta arhitekture je dominantna za prepoznavanje objekata sa slike ili videa.
Da biste izgradili TensorFlow CNN, trebate slijediti sedam koraka:
Korak 1: Prenesi skup podataka:
Skup podataka MNIST dostupan je uz scikit za uฤenje. Preuzmite ga i pohranite u Preuzimanja. Moลพete ga uฤitati pomoฤu fetch_mldata('MNIST original').
Korak 2: Ulazni sloj:
Ovaj korak preoblikuje podatke. Oblik je jednak kvadratnom korijenu broja piksela. Na primjer, ako slika ima 156 piksela, onda je oblik 26ร26. Morate odrediti ima li slika boju ili ne. Ako da, tada ste imali 3 za oblik- 3 za RGB-, inaฤe 1.
input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Korak 3: Konvolucijski sloj
Zatim trebate stvoriti konvolucijske slojeve. Primjenjujete razliฤite filtre kako biste omoguฤili mreลพi da nauฤi vaลพne znaฤajke. Vi odreฤujete veliฤinu kernela i koliฤinu filtera.
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=14,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
Korak 4: Pooling sloj
U treฤem koraku dodajete sloj za udruลพivanje. Ovaj sloj smanjuje veliฤinu unosa. To ฤini uzimanjem maksimalne vrijednosti podmatrice a. Na primjer, ako je podmatrica [3,1,3,2], udruลพivanje ฤe vratiti maksimum, koji je 3.
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Korak 5: Dodajte konvolucijski sloj i Pooling Sloj
U ovom koraku moลพete dodati koliko god ลพelite konvertacijskih i objedinjujuฤih slojeva. Google koristi arhitekturu s viลกe od 20 konverzijskih slojeva.
Korak 6: Gusti sloj
Korak 6 poravnajte prethodni kako biste stvorili potpuno povezane slojeve. U ovom koraku moลพete koristiti razliฤite funkcije aktivacije i dodati uฤinak ispadanja.
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
Posljednji korak je predviฤanje.
logits = tf.layers.dense(inputs=dropout, units=10)











