CNN-kuvan luokittelu TensorFlow'ssa vaiheineen ja esimerkein

Mikรค on konvoluutiohermoverkko?

Konvoluutiohermoverkko, joka tunnetaan myรถs nimellรค convnets tai CNN, on hyvin tunnettu menetelmรค tietokonenรคkรถsovelluksissa. Se on luokka syviรค hermoverkkoja, joita kรคytetรครคn visuaalisen kuvan analysointiin. Tรคmรคntyyppinen arkkitehtuuri on hallitseva tunnistamaan esineitรค kuvasta tai videosta. Sitรค kรคytetรครคn sovelluksissa, kuten kuvan tai videon tunnistus, hermokielen kรคsittely jne.

Archikonvoluutiohermoverkon rakenne

Ajattele Facebookia muutama vuosi sitten, kun olet ladannut kuvan profiiliisi, sinua pyydettiin lisรครคmรครคn nimi kuvan kasvoille manuaalisesti. Nykyรครคn Facebook merkitsee ystรคvรคsi kuvaan automaattisesti convnetin avulla.

Konvoluutiohermoverkko kuvien luokittelua varten ei ole kovin vaikea ymmรคrtรครค. Syรถttรถkuva kรคsitellรครคn konvoluutiovaiheen aikana ja sille liitetรครคn myรถhemmin etiketti.

Tyypillinen convnet-arkkitehtuuri voidaan tiivistรครค alla olevaan kuvaan. Ensinnรคkin kuva tyรถnnetรครคn verkkoon; tรคtรค kutsutaan tulokuvaksi. Sitten syรถttรถkuva kรคy lรคpi รครคrettรถmรคn mรครคrรคn vaiheita; tรคmรค on verkon konvoluutioosa. Lopuksi hermoverkko voi ennustaa kuvan numeron.

Archikonvoluutiohermoverkon (CNN) rakenne
Archikonvoluutiohermoverkon (CNN) rakenne

Kuva koostuu joukosta pikseleitรค, joilla on korkeus ja leveys. Harmaasรคvykuvassa on vain yksi kanava, kun taas vรคrikuvassa on kolme kanavaa (jokainen punaiselle, vihreรคlle ja siniselle). Kanava on pinottu pรครคllekkรคin. Tรคssรค opetusohjelmassa kรคytรคt harmaasรคvykuvaa vain yhdellรค kanavalla. Jokaisen pikselin arvo on 0 - 255, joka kuvastaa vรคrin voimakkuutta. Esimerkiksi pikseli, joka on yhtรค suuri kuin 0, nรคyttรครค valkoisen vรคrin, kun taas pikseli, jonka arvo on lรคhellรค 255, on tummempi.

Katsotaanpa kuvaa, joka on tallennettu MNIST-tietojoukko. Alla oleva kuva nรคyttรครค, kuinka vasemmanpuoleinen kuva esitetรครคn matriisimuodossa. Huomaa, ettรค alkuperรคinen matriisi on standardoitu 0:n ja 1:n vรคlille. Tummemman vรคrin kohdalla matriisin arvo on noin 0.9, kun taas valkoisten pikselien arvo on 0.

Konvoluutiohermoverkko

Konvoluutiotoiminta

Mallin kriittisin komponentti on konvoluutiokerros. Tรคmรคn osan tarkoituksena on pienentรครค kuvan kokoa painojen nopeampaa laskemista varten ja parantaa sen yleistรคmistรค.

Konvoluutioosan aikana verkko sรคilyttรครค kuvan olennaiset ominaisuudet ja sulkee pois epรคolennaisen kohinan. Malli esimerkiksi oppii tunnistamaan norsun kuvasta, jonka taustalla on vuori. Jos kรคytรคt perinteistรค hermoverkkoa, malli antaa painon kaikille pikseleille, myรถs vuoren pikseleille, mikรค ei ole vรคlttรคmรคtรถntรค ja voi johtaa verkkoa harhaan.

Sen sijaan a Keras konvoluutiohermoverkko kรคyttรครค matemaattista tekniikkaa vain tรคrkeimpien pikselien poimimiseen. Tรคtรค matemaattista operaatiota kutsutaan konvoluutioksi. Tรคmรคn tekniikan avulla verkko voi oppia yhรค monimutkaisempia ominaisuuksia kullakin tasolla. Konvoluutio jakaa matriisin pieniksi paloiksi oppiakseen kunkin kappaleen tรคrkeimmรคt elementit.

Konvoluutiohermoverkon komponentit (ConvNet tai CNN)

Convnetissรค on neljรค osaa

  1. Kierre
  2. Ei-lineaarisuus (ReLU)
  3. Pooling tai Sub Sampling
  4. Luokittelu (tรคysin yhdistetty kerros)

Kierre

Konvoluution tarkoituksena on poimia kuvassa olevan kohteen piirteet paikallisesti. Se tarkoittaa, ettรค verkko oppii tietyt kuviot kuvan sisรคllรค ja pystyy tunnistamaan sen kaikkialla kuvassa.

Konvoluutio on alkuainekohtainen kertolasku. Konsepti on helppo ymmรคrtรครค. Tietokone skannaa osan kuvasta, jonka koko on yleensรค 3 ร— 3, ja kertoo sen suodattimelle. Elementtikohtaisen kertolaskua kutsutaan piirrekartaksi. Tรคtรค vaihetta toistetaan, kunnes koko kuva on skannattu. Huomaa, ettรค konvoluution jรคlkeen kuvan koko pienenee.

Kierre

Alla on URL-osoite, josta nรคet, miten konvoluutio toimii.

Kierre

Tarjolla on lukuisia kanavia. Alla on lueteltu joitain kanavia. Voit nรคhdรค, ettรค jokaisella suodattimella on tietty tarkoitus. Huomaa, alla olevassa kuvassa; Kernel on suodattimen synonyymi.

Kierre

Aritmetiikka konvoluution takana

Konvoluutiovaihe soveltaa suodatinta pieneen kuvapisteiden joukkoon. Suodatin liikkuu syรถtekuvaa pitkin muodoltaan 3ร—3 tai 5ร—5. Se tarkoittaa, ettรค verkko liu'uttaa nรคmรค ikkunat koko syรถttรถkuvan yli ja laskee konvoluution. Alla oleva kuva nรคyttรครค kuinka konvoluutio toimii. Patch on kooltaan 3ร—3 ja ulostulomatriisi on tulosta kuvamatriisin ja suodattimen vรคlisestรค elementtikohtaisesta toiminnasta.

Aritmetiikka konvoluution takana

Huomaat, ettรค tulosteen leveys ja korkeus voivat poiketa tulon leveydestรค ja korkeudesta. Se tapahtuu rajaefektin takia.

Rajaefekti

Kuvassa on 5ร—5 kartta ja 3ร—3 suodatin. Keskellรค on vain yksi ikkuna, jossa suodatin voi seuloa 3 ร— 3 -ruudukon. Tulostusominaisuuskartta kutistuu kahdella ruudulla 3 ร— 3 -ulottuvuuden ohella.

Reunaefekti

Jotta saat saman lรคhtรถmitan kuin syรถttรถmitta, sinun on lisรคttรคvรค tรคyte. Tรคyte sisรคltรครค oikean mรครคrรคn rivejรค ja sarakkeita lisรครคmรคllรค matriisin kummallekin puolelle. Se mahdollistaa konvoluution keskittรคmisen jokaiseen syรถteruutuun. Alla olevassa kuvassa tulo/lรคhtรถmatriisilla on samat mitat 5ร—5

Reunaefekti

Kun mรครคritรคt verkon, konvoloituneita ominaisuuksia ohjataan kolmella parametrilla:

  1. Syvyys: Se mรครคrittรครค konvoluution aikana kรคytettรคvien suodattimien mรครคrรคn. Edellisessรค esimerkissรค nรคit syvyyden 1, mikรค tarkoittaa, ettรค kรคytetรครคn vain yhtรค suodatinta. Useimmissa tapauksissa suodattimia on useampi kuin yksi. Alla oleva kuva nรคyttรครค toiminnot, jotka on tehty tilanteessa, jossa on kolme suodatinta

Reunaefekti

  1. harppaus: Se mรครคrittรครค "pikselin hyppyjen" mรครคrรคn kahden viipaleen vรคlillรค. Jos askel on yhtรค kuin 1, ikkunat liikkuvat pikselin erolla yksi. Jos askel on kaksi, ikkunat hyppรครคvรคt 2 pikseliรค. Jos lisรครคt askelta, saat pienempiรค karttakohteita.

Esimerkki askel 1

Esimerkki Stridesta

askel 2

Esimerkki Stridesta

  1. Nolla-tรคyte: Tรคyte on toimenpide, jolla lisรคtรครคn vastaava mรครคrรค rivejรค ja sarakkeita syรถttรถominaisuuksien karttojen kummallekin puolelle. Tรคssรค tapauksessa lรคhdรถllรค on sama mitta kuin tulolla.

Ei-lineaarisuus (ReLU)

Konvoluutiooperaation lopussa lรคhtรถรถn kohdistuu aktivointitoiminto, joka sallii epรคlineaarisuuden. Tavallinen convnet-aktivointitoiminto on Relu. Kaikki negatiivisen arvon omaavat pikselit korvataan nollalla.

Pooling OperaTUKSEN

Tรคmรค vaihe on helppo ymmรคrtรครค. Poolioinnin tarkoituksena on pienentรครค syรถtekuvan dimensioisuutta. Vaiheet tehdรครคn toiminnan laskennallisen monimutkaisuuden vรคhentรคmiseksi. Mittasuhteita pienentรคmรคllรค verkolla on pienemmรคt laskettavat painot, joten se estรครค ylisovituksen.

Tรคssรค vaiheessa sinun on mรครคritettรคvรค koko ja askel. Tavallinen tapa yhdistรครค syรถtekuva on kรคyttรครค piirrekartan enimmรคisarvoa. Katso alla olevaa kuvaa. "Pooling" nรคyttรครค 4 ร— 4 -ominaisuuskartan neljรคn alimatriisin ja palauttaa maksimiarvon. Poolitus ottaa 2 ร— 2 -taulukon enimmรคisarvon ja siirtรครค sitten tรคtรค ikkunaa kahdella pikselillรค. Esimerkiksi ensimmรคinen alimatriisi on [3,1,3,2], yhdistรคminen palauttaa maksimiarvon, joka on 3.

Pooling OperaTUKSEN

On olemassa toinen yhdistรคmistoiminto, kuten keskiarvo.

Tรคmรค toiminto pienentรครค aggressiivisesti karttakohdekartan kokoa

Tรคysin yhdistetyt kerrokset

Viimeinen vaihe koostuu perinteisen rakentamisesta keinotekoinen hermoverkko kuten teit edellisessรค opetusohjelmassa. Yhdistรคt kaikki neuronit edellisestรค kerroksesta seuraavaan kerrokseen. Kรคytรคt softmax-aktivointitoimintoa syรถttรถkuvan numeron luokittelemiseen.

Kertaus:

TensorFlow-konvoluutiohermoverkko kokoaa eri kerroksia ennen ennusteen tekemistรค. Neuroverkossa on:

  • Konvoluutiokerros
  • Relu aktivointitoiminto
  • Pooling kerros
  • Tiheรคsti yhdistetty kerros

Konvoluutiokerrokset kรคyttรคvรคt erilaisia โ€‹โ€‹suodattimia kuvan alialueelle. Relu-aktivointitoiminto lisรครค epรคlineaarisuutta, ja yhdistรคvรคt tasot vรคhentรคvรคt piirrekarttojen ulottuvuutta.

Kaikki nรคmรค kerrokset poimivat kuvista olennaisen tiedon. Viimeinkin piirrekartta syรถtetรครคn ensisijaiseen tรคysin yhdistettyyn kerrokseen softmax-toiminnolla ennusteen tekemiseksi.

Harjoittele CNN:tรค TensorFlow'lla

Nyt kun tunnet convnetsin rakennuspalikka, olet valmis rakentamaan sellaisen TensorFlow. Kรคytรคmme MNIST-tietojoukkoa CNN-kuvien luokitukseen.

Tietojen valmistelu on sama kuin edellisessรค opetusohjelmassa. Voit suorittaa koodit ja siirtyรค suoraan CNN:n arkkitehtuuriin.

Seuraa alla olevia vaiheita kuvien luokittelussa CNN:n avulla:

Vaihe 1: Lataa tietojoukko

Vaihe 2: Syรถtรค kerros

Vaihe 3: Konvoluutiokerros

Vaihe 4: Pooling kerros

Vaihe 5: Toinen konvoluutiokerros ja Pooling Kerros

Vaihe 6: Tiheรค kerros

Vaihe 7: Logit Layer

Vaihe 1: Lataa tietojoukko

MNIST-tietojoukko on saatavana scikitillรค, jotta voit oppia tรคstรค URL. Lataa se ja tallenna se Lataukset-kansioon. Voit ladata sen komennolla fetch_mldata('MNIST original').

Luo juna/testisarja

Sinun on jaettava tietojoukko komennolla train_test_split

Skaalaa ominaisuuksia

Lopuksi voit skaalata ominaisuuden MinMaxScalerilla alla olevan kuvaluokituksen mukaisesti kรคyttรคmรคllรค TensorFlow CNN -esimerkkiรค.

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:]

Mรครคrittele CNN

CNN kรคyttรครค suodattimia kuvan raakapikselissรค oppiakseen yksityiskohtia kuviosta verrattuna perinteisen hermoverkon globaaliin kuvioon. CNN:n rakentamiseksi sinun on mรครคritettรคvรค:

  1. Konvoluutiotaso: Kรคytรค karttaan n mรครคrรครค suodattimia. Konvoluution jรคlkeen sinun on kรคytettรคvรค Relu-aktivointitoimintoa lisรคtรคksesi verkkoon epรคlineaarisuutta.
  2. Pooling-kerros: Seuraava vaihe konvoluution jรคlkeen on ominaisuuden max. Tarkoituksena on pienentรครค piirrekartan ulottuvuutta ylisovituksen estรคmiseksi ja laskentanopeuden parantamiseksi. Max pooling on perinteinen tekniikka, joka jakaa karttakohdekartat osa-alueisiin (yleensรค 2ร—2-koon) ja sรคilyttรครค vain enimmรคisarvot.
  3. Tรคysin yhdistetyt kerrokset: Kaikki edellisten kerrosten neuronit on kytketty seuraaviin kerroksiin. CNN luokittelee etiketin konvoluutiokerrosten ominaisuuksien mukaan ja vรคhennetรครคn yhdistรคmiskerroksella.

CNN-arkkitehtuuri

  • Konvoluutiokerros: Kรคyttรครค 14 5ร—5 suodatinta (poimii 5ร—5 pikselin alialueita) ReLU-aktivointitoiminnolla
  • Pooling Taso: Suorittaa maksimipoolauksen 2ร—2-suodattimella ja askeleella 2 (mikรค mรครคrittรครค, ettรค yhdistetyt alueet eivรคt mene pรครคllekkรคin)
  • Convolution Layer: Kรคyttรครค 36 5ร—5 suodatinta ReLU-aktivointitoiminnolla
  • Pooling Kerros #2: Suorittaa jรคlleen maksimipoolauksen 2 ร— 2 -suodattimella ja askeleella 2
  • 1,764 0.4 hermosolua, pudotuksen sรครคnnรถstelyaste 0.4 (todennรคkรถisyys XNUMX, ettรค jokin tietty elementti pudotetaan harjoituksen aikana)
  • Tiheรค kerros (Logits Layer): 10 neuronia, yksi kutakin kohdeluokkaa kohden (0โ€“9).

CNN:n luomiseen on kรคytettรคvรค kolme tรคrkeรครค moduulia:

  • conv2d(). Muodostaa kaksiulotteisen konvoluutiokerroksen, jossa on argumenteina suodattimien mรครคrรค, suodattimen ydin, tรคyte ja aktivointifunktio.
  • max_pooling2d(). Muodostaa kaksiulotteisen poolauskerroksen kรคyttรคmรคllรค max pooling -algoritmia.
  • tiheรค(). Rakentaa tiheรคn kerroksen piilotetuilla kerroksilla ja yksikรถillรค

Mรครคritรคt funktion CNN:n rakentamiseksi. Katsotaanpa yksityiskohtaisesti, kuinka jokainen rakennuspalikka rakennetaan ennen kuin kรครคritรครคn kaikki yhteen funktioon.

Vaihe 2: Syรถtรค kerros

def cnn_model_fn(features, labels, mode):
    input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

Sinun on mรครคritettรคvรค tensori tietojen muodon mukaan. Tรคtรค varten voit kรคyttรครค moduulia tf.reshape. Tรคssรค moduulissa sinun on ilmoitettava tensori uudelleen muotoiltavaksi ja tensorin muoto. Ensimmรคinen argumentti on datan ominaisuudet, joka mรครคritellรครคn funktion argumentissa.

Kuvalla on korkeus, leveys ja kanava. MNIST-tietojoukko on yksikrooninen kuva, jonka koko on 28 ร— 28. Asetamme erรคn kooksi muoto-argumentissa -1, jotta se ottaa piirteiden ["x"] muodon. Etuna on tehdรค erรคkoon hyperparametreja viritettรคvรคksi. Jos erรคn kooksi on asetettu 7, tensori syรถttรครค 5,488 28 arvoa (28 * 7 * XNUMX).

Vaihe 3: Konvoluutiokerros

# first Convolutional Layer
  conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=14,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

Ensimmรคisessรค konvoluutiokerroksessa on 14 suodatinta, joiden ydin on kooltaan 5 ร— 5 ja samalla tรคyte. Sama tรคyte tarkoittaa, ettรค sekรค lรคhtรถtensorilla ettรค tulotensorilla tulee olla sama korkeus ja leveys. Tensorflow lisรครค nollia riveihin ja sarakkeisiin varmistaakseen saman koon.

Kรคytรคt Relu-aktivointitoimintoa. Tulosteen koko on [28, 28, 14].

Vaihe 4: Pooling kerros

Seuraava vaihe konvoluution jรคlkeen on poolauslaskenta. Poolilaskenta vรคhentรครค tietojen ulottuvuutta. Voit kรคyttรครค moduulia max_pooling2d, jonka koko on 2ร—2 ja stride 2. Kรคytรคt syรถtteenรค edellistรค kerrosta. Tulostuskoko on [batch_size, 14, 14, 14]

# first Pooling Layer 
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

Vaihe 5: Toinen konvoluutiokerros ja Pooling Kerros

Toisessa konvoluutiokerroksessa on 32 suodatinta, joiden lรคhtรถkoko on [batch_size, 14, 14, 32]. Poolauskerros on samankokoinen kuin ennen ja tulosteen muoto on [erรคn_koko, 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)

Vaihe 6: Tiheรค kerros

Sitten sinun on mรครคritettรคvรค tรคysin yhdistetty kerros. Piirrekartta on tasoitettava ennen kuin se yhdistetรครคn tiheรครคn kerrokseen. Voit kรคyttรครค moduulin uudelleenmuotoilua koossa 7*7*36.

Tiheรค kerros yhdistรครค 1764 neuronia. Lisรครคt Relu-aktivointitoiminnon. Lisรคksi lisรครคt keskeyttรคmisen tasoitustermin 0.3 prosentilla, mikรค tarkoittaa, ettรค 30 prosenttia painoista asetetaan nollaan. Huomaa, ettรค keskeyttรคminen tapahtuu vain harjoitusvaiheessa. Funktiolla cnn_model_fn on argumenttitila, joka ilmoittaa, tarvitseeko mallia harjoitella tai arvioida, kuten alla olevassa CNN-kuvaluokituksen TensorFlow-esimerkissรค on esitetty.

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)

Vaihe 7: Logit Layer

Lopuksi TensorFlow-kuvan luokitteluesimerkissรค voit mรครคrittรครค viimeisen kerroksen mallin ennusteella. Tulostusmuoto on yhtรค suuri kuin erรคkoko ja 10, kuvien kokonaismรครคrรค.

# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=10)

Voit luoda sanakirjan, joka sisรคltรครค luokat ja kunkin luokan todennรคkรถisyyden. Moduuli tf.argmax() palauttaa suurimman arvon, jos logit kerrostuu. Softmax-funktio palauttaa kunkin luokan todennรคkรถisyyden.

predictions = {				
	# Generate predictions				
    "classes": tf.argmax(input=logits, axis=1),				
    "probabilities": tf.nn.softmax(logits, name="softmax_tensor")  }			

Haluat palauttaa sanakirjan ennusteen vain, kun tilaksi on asetettu ennakointi. Lisรครคt nรคmรค koodit nรคyttรครคksesi ennusteet

if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

Seuraava vaihe on mallin hรคviรถn laskeminen. Viimeisessรค opetusohjelmassa opit, ettรค moniluokkaisen mallin hรคviรถfunktio on ristientropia. Tappio on helppo laskea seuraavalla koodilla:

# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

TensorFlow CNN -esimerkin viimeinen vaihe on mallin optimointi, eli painojen parhaiden arvojen lรถytรคminen. Tรคtรค varten kรคytรคt gradientin laskeutumisoptimointiohjelmaa, jonka oppimisnopeus on 0.001. Tavoitteena on minimoida tappiot

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())

Olet valmis CNN:n kanssa. Haluat kuitenkin nรคyttรครค suorituskykymittarit arviointitilan aikana. Moniluokkaisen mallin suorituskykymittarit ovat tarkkuusmittarit. Tensorflow on varustettu moduulin tarkkuudella kahdella argumentilla, otsikoilla ja ennusteilla.

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)

Se siitรค. Loit ensimmรคisen CNN:si ja olet valmis kรครคrimรครคn kaiken funktioksi, jotta voit kรคyttรครค sitรค mallin kouluttamiseen ja arviointiin.

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)

Alla olevat vaiheet ovat samat kuin edellisissรค opetusohjelmissa.

Ensinnรคkin mรครคritรคt estimaattorin CNN-mallilla kuvien luokittelua varten.

# Create the Estimator
mnist_classifier = tf.estimator.Estimator(
    model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")

CNN:n harjoitteleminen kestรครค monta kertaa, joten luot kirjauskoukun, joka tallentaa softmax-kerrosten arvot 50 iteroinnin vรคlein.

# Set up logging for predictions
tensors_to_log = {"probabilities": "softmax_tensor"}
logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

Olet valmis arvioimaan mallin. Asetat erรคn kooksi 100 ja sekoitat tiedot. Huomaa, ettรค asetamme harjoitusaskeleiksi 16.000 XNUMX, joten harjoittelu voi viedรค paljon aikaa. Ole kรคrsivรคllinen.

# 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])

Nyt kun malli on koulutettu, voit arvioida sen ja tulostaa tulokset

# 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}

Nykyisellรค arkkitehtuurilla saat 97 %:n tarkkuuden. Voit muuttaa arkkitehtuuria, erรคkokoa ja iterointien mรครคrรครค tarkkuuden parantamiseksi. CNN-hermoverkko on toiminut paljon paremmin kuin ANN tai logistinen regressio. Keinotekoisen hermoverkon opetusohjelmassa sinulla oli 96 %:n tarkkuus, mikรค on pienempi kuin CNN. CNN:n esitykset ovat vaikuttavia suuremmalla kuvalla setti, sekรค nopeuden laskennan ettรค tarkkuuden suhteen.

Yhteenveto

Konvoluutiohermoverkko toimii erittรคin hyvin kuvan arvioinnissa. Tรคmรคntyyppinen arkkitehtuuri on hallitseva tunnistamaan esineitรค kuvasta tai videosta.

TensorFlow CNN:n rakentamiseksi sinun on noudatettava seitsemรคn vaihetta:

Vaihe 1: Lataa tietojoukko:

MNIST-tietojoukko on saatavilla scikitillรค oppimista varten. Lataa se ja tallenna se Lataukset-kansioon. Voit ladata sen komennolla fetch_mldata('MNIST original').

Vaihe 2: Syรถttรถtaso:

Tรคmรค vaihe muokkaa tiedot. Muoto on yhtรค suuri kuin pikselien lukumรครคrรคn neliรถjuuri. Esimerkiksi, jos kuvassa on 156 pikseliรค, muoto on 26 ร— 26. Sinun on mรครคritettรคvรค, onko kuva vรคrillinen vai ei. Jos kyllรค, sinulla oli 3 muotoon - 3 RGB:lle, muuten 1.

input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

Vaihe 3: Konvoluutiokerros

Seuraavaksi sinun on luotava konvoluutiokerrokset. Kรคytรคt erilaisia โ€‹โ€‹suodattimia, jotta verkko oppii tรคrkeรคn ominaisuuden. Voit mรครคrittรครค ytimen koon ja suodattimien mรครคrรคn.

conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=14,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

Vaihe 4: Pooling kerros

Kolmannessa vaiheessa lisรครคt poolauskerroksen. Tรคmรค kerros pienentรครค syรถtteen kokoa. Se tekee sen ottamalla alimatriisin maksimiarvon. Jos alimatriisi on esimerkiksi [3,1,3,2], yhdistรคminen palauttaa maksimiarvon, joka on 3.

pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

Vaihe 5: Lisรครค konvoluutiokerros ja Pooling Kerros

Tรคssรค vaiheessa voit lisรคtรค niin paljon kuin haluat konv-tasoja ja poolaustasoja. Google kรคyttรครค arkkitehtuuria, jossa on yli 20 konversiotasoa.

Vaihe 6: Tiheรค kerros

Vaihe 6 tasoittaa edellistรค luodaksesi tรคysin yhdistetyt tasot. Tรคssรค vaiheessa voit kรคyttรครค eri aktivointitoimintoja ja lisรคtรค dropout-efektin.

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)

Vaihe 7: Logit Layer

Viimeinen vaihe on ennustaminen.

logits = tf.layers.dense(inputs=dropout, units=10)

Tiivistรค tรคmรค viesti seuraavasti: