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.

  • 🔘 Četiri komponente: Konvolucija, ReLU nelinearnost, objedinjavanje i potpuno povezani klasifikacijski sloj slažu se u svaku konverznu mrežu.
  • ☑️ Mehanika konvolucije: Filter 3×3 ili 5×5 klizi preko slike, a množenje elemenata po elementima gradi mapu značajki.
  • Tri kontrole: Dubina postavlja broj filtera, korak postavlja skok između prozora, a nulama se čuva izlazna dimenzija.
  • 🧪 Pooling-efekt: Maksimalno grupiranje s prozorom 2×2 i polovicama koraka od 2 po osi, smanjenje težine i ograničavanje pretjeranog prilagođavanja.
  • 🛠️ Sedam koraka izgradnje: Prenesite skup podataka, zatim definirajte ulazne, konvolucijske, objedinjavajuće, druge konvolucijske, guste i logit slojeve.
  • 📈 Izmjereni rezultat: Procijenjeni estimator izvještava o točnosti od 0.9689286 na MNIST-u, što je iznad 96% koliko postiže obična neuronska mreža.

Klasifikacija CNN slika u TensorFlowu

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

Arhitektura konvolucijske mreže od početka do kraja, od ulazne slike kroz konvolucijske faze do predviđene znamenke.
Archistruktura konvolucijske neuronske mreže (CNN)

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.

Rukom pisana MNIST znamenka prikazana pored matrice od 28 x 28 piksela s vrijednostima standardiziranim između 0 i 1

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:

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

Množenje po elementima dijela slike dimenzija 3 puta 3 s filterom koji daje jednu vrijednost mape značajki

Animacija ispod prikazuje istu konvoluciju koja se proteže preko cijele slike.

Animirani filter koji klizi preko ulazne slike i gradi mapu značajki ćeliju po ćeliju

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.

Tablica uobičajenih konvolucijskih jezgri kao što su detekcija rubova, izoštravanje i zamućenje s njihovim rezultirajućim izlaznim slikama

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.

Korak-po-korak animacija filtera 3 puta 3 koji množi vrijednosti slike i zbraja ih u izlaznu matricu

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.

Mapa značajki 5 x 5 smanjena na izlaz 3 x 3 jer filter 3 x 3 ne može dosegnuti granice

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.

Ulaz 5 puta 5 okružen prstenom nultih polja tako da konvolucija vraća izlaz 5 puta 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.

Tri odvojena filtera koji konvolviraju isti ulaz i proizvode tri složene mape značajki

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

Prozor filtera pomiče se piksel po piksel preko ulaznog retka s korakom postavljenim na 1

korak 2

Preskoči prozor filteraping dva piksela između pozicija s korakom postavljenim na 2, što rezultira kraćim izlazom

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.

Mapa značajki 4 x 4 smanjena na izlaz 2 x 2 maksimalnim grupiranjem s prozorom 2 x 2 i korakom 2

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:

  1. Korak 1: Prenesite skup podataka
  2. Korak 2: Ulazni sloj
  3. Korak 3: Konvolucijski sloj
  4. Korak 4: Pooling sloj
  5. Korak 5: Drugi konvolucijski sloj i Pooling Sloj
  6. Korak 6: Gusti sloj
  7. 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:

  1. Konvolucijski sloj: Primijenite n filtera na mapu značajki. Nakon konvolucije, potrebno je koristiti ReLU aktivacijsku funkciju za dodavanje nelinearnosti mreži.
  2. 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.
  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 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.

Pitanja i odgovori

Valjano popunjavanje ne dodaje ništa, pa se izlaz smanjuje, a rubni pikseli hrane manje neurona. Isti popunjavanje zaokružuje ulaz nulama tako da izlaz zadržava visinu i širinu ulaza, što je ono što conv2d poziva u ovom zahtjevu tutoriala.

Nije nepromijenjeno. tf.layers i tf.estimator.inputs.numpy_input_fn su uklonjeni. Ponovno izgradite isti stog s tf.keras.layers.Conv2D, MaxPooling2D, Gusta i Ispuštanje unutar TensorFlow Keras model, a zatim ga trenirajte s model.fit() umjesto Estimatora.

Automatizirane biblioteke za pretraživanje paralelno pregledavaju broj filtera, veličine jezgri, stope odustajanja i stope učenja, a zatim rangiraju prodore prema točnosti validacije. Zamjenjuju nagađanja mjerenim usporedbama, iako čovjek i dalje odlučuje o proračunu za izračun i važnoj metrici.

Da. GitHub kopilot izrađuje repetitivne konvolucijske i pooling stekove te ulazni cjevovod iz kratkog komentara. Sami provjerite izlazne oblike, budući da prijedlozi često miješaju uklonjene TensorFlow 1 API-je s trenutnim Keras API-jima.

Slučajna okretanja, rotacije, pomicanja i zumiranja stvaraju svježe varijacije svake slike za učenje, tako da mreža vidi širi raspon primjera i prestaje pamtiti pojedinačne slike. Dobro se slaže s ispadanjem i obično smanjuje jaz između točnosti učenja i validacije.

Ovdje se koristi 16 000 koraka pri veličini serije od 100. Većina točnosti postiže se puno ranije, stoga pratite metriku evaluacije i stanite kada se ona stabilizira, umjesto da čekate puni broj na sporom računalu.

mldata.org se ugasio i pomoćnik je uklonjen u scikit-learn verziji 0.22. Umjesto toga koristite fetch_openml('mnist_784', version=1). Vraća istih 70 000 spljoštenih znamenki od 784 piksela, tako da koraci skaliranja i dijeljenja u ovom vodiču nastavljaju raditi.

Čitaju se kao serija, visina, širina, kanali. Dakle, 14 x 14 je prostorna veličina nakon jednog koraka grupiranja na znamenki 28 x 28, a 36 je broj filtera u tom konvolucijskom sloju, jedna mapa značajki po filteru.

Sažmite ovu objavu uz: