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.

Archistruktura konvolucijske neuronske mreลพe (CNN)
Archistruktura konvolucijske neuronske mreลพe (CNN)

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 neuronska mreลพa

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

  1. saziv
  2. Nelinearnost (ReLU)
  3. Pooling ili poduzorkovanje
  4. 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.

saziv

Ispod se nalazi URL vidjeti u akciji kako konvolucija funkcionira.

saziv

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.

saziv

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.

Aritmetika iza konvolucije

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.

Efekt granice

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

Efekt granice

Kada definirate mreลพu, konvolvirane znaฤajke kontroliraju tri parametra:

  1. 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

Efekt granice

  1. 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

Primjer Stridea

korak 2

Primjer Stridea

  1. 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.

Pooling OperaANJE

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:

  1. Konvolucijski sloj: Primijenite n broj filtara na mapu znaฤajki. Nakon konvolucije morate upotrijebiti Relu aktivacijsku funkciju za dodavanje nelinearnosti mreลพi.
  2. 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.
  3. 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)

Saลพmite ovu objavu uz: