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: