CNN-kuvan luokittelu TensorFlow'ssa vaiheineen ja esimerkein
โก รlykรคs yhteenveto
Konvoluutiohermoverkot skannaavat kuvaa pienillรค suodattimilla sen sijaan, ettรค ne painottaisivat jokaista pikseliรค tasaisesti, minkรค vuoksi ne hallitsevat konenรคkรถรค. Tรคssรค ohjeessa selitetรครคn jokainen taso ja sitten MNIST-numerot luokitellaan TensorFlow'lla.
Mikรค on konvoluutiohermoverkko?
Konvoluutiohermoverkko, joka tunnetaan myรถs nimellรค convnet tai CNN, on tunnettu menetelmรค konenรครถn sovelluksissa. Se on syvien neuroverkkojen luokka, joita kรคytetรครคn visuaalisten kuvien analysointiin. Tรคmรคn tyyppinen arkkitehtuuri on hallitseva kohteiden tunnistamisessa kuvasta tai videosta. Sitรค kรคytetรครคn sovelluksissa, kuten kuvan- tai videontunnistuksessa, luonnollisen kielen kรคsittelyssรค ja suosittelujรคrjestelmissรค.
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 konvnet-arkkitehtuuri voidaan tiivistรครค alla olevaan kuvaan. Ensinnรคkin kuva lรคhetetรครคn verkkoon; tรคtรค kutsutaan syรถtekuvaksi. Sitten syรถtekuva kรคy lรคpi sarjan vaiheita; tรคmรค on verkon konvoluutio-osa. Lopuksi neuroverkko voi ennustaa kuvan numeron.

Kuva koostuu pikselimatriisista, joilla on korkeus ja leveys. Harmaasรคvykuvassa on vain yksi kanava, kun taas vรคrikuvassa on kolme kanavaa (jokainen punaiselle, vihreรคlle ja siniselle). Kanavat ovat pรครคllekkรคin. Tรคssรค opetusohjelmassa kรคytรคt harmaasรคvykuvaa, jossa on vain yksi kanava. Jokaisella pikselillรค on arvo 0โ255, joka heijastaa vรคrin intensiteettiรค. Esimerkiksi pikseli, jonka arvo on 0, nรคyttรครค valkoisen vรคrin, kun taas pikseli, jonka arvo on lรคhellรค 255, on tummempi.
Katsotaanpa kuvaa, joka on tallennettu MNIST-tietojoukkoAlla oleva kuva nรคyttรครค, miten vasemmalla oleva kuva esitetรครคn matriisimuodossa. Huomaa, ettรค alkuperรคinen matriisi on standardoitu arvoksi 0โ1. Tummemmilla vรคreillรค matriisin arvo on noin 0.9, kun taas valkoisten pikselien arvo on 0.
Konvoluutiotoiminta
Mallin kriittisin komponentti on konvoluutiokerros. Tรคmรคn osan tavoitteena on pienentรครค kuvan kokoa painojen nopeampaa laskentaa ja yleistyksen parantamista varten.
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 selvittรครคkseentracvain olennaisimpia pikseleitรค. Tรคtรค matemaattista operaatiota kutsutaan konvoluutioksi. Tรคmรค tekniikka mahdollistaa verkon oppia yhรค monimutkaisempia ominaisuuksia jokaisella tasolla. Konvoluutio jakaa matriisin pieniin osiin oppiakseen kunkin osan olennaisimmat elementit.
Konvoluutiohermoverkon komponentit (ConvNet tai CNN)
Konvnetissรค on neljรค osaa:
- Kierre
- Ei-lineaarisuus (ReLU)
- Pooling tai Sub Sampling
- Luokittelu (tรคysin yhdistetty kerros)
Kierre
Konvoluution tarkoituksena on selvittรครคtract kuvassa olevan kohteen ominaisuuksia paikallisesti. Tรคmรค tarkoittaa, ettรค verkko oppii kuvan tietyt kuviot ja pystyy tunnistamaan ne kaikkialla kuvassa.
Konvoluutio on elementtikohtainen kertolasku. Kรคsite on helppo ymmรคrtรครค. Tietokone skannaa osan kuvasta, yleensรค 3ร3-ulotteisen osan, ja kertoo sen suodattimella. Elementtikohtaisen kertolaskun tulosta kutsutaan ominaisuuskartaksi. Tรคtรค vaihetta toistetaan, kunnes koko kuva on skannattu. Huomaa, ettรค konvoluution jรคlkeen kuvan kokoa pienennetรครคn.
Alla oleva kaavio nรคyttรครค, kuinka yksi kuvan osa kerrotaan suodattimella, jolloin saadaan yksi ominaisuuskartan solu.
Alla oleva animaatio nรคyttรครค saman konvoluution koko kuvan poikki.
Saatavilla on lukuisia suodattimia. Alla on lueteltu joitakin niistรค. Nรคet, ettรค jokaisella suodattimella on tietty tarkoitus. Huomaa, ettรค alla olevassa kuvassa ydin on suodattimen synonyymi.
Aritmetiikka konvoluution takana
Konvoluutiovaiheessa suodatinta kรคytetรครคn pieneen kuvassa olevaan pikseliryhmรครคn. Suodatin liikkuu syรถtekuvaa pitkin yleisessรค 3ร3- tai 5ร5-muodossa. Tรคmรค tarkoittaa, ettรค verkko liu'uttaa nรคitรค ikkunoita koko syรถtekuvan yli ja laskee konvoluution. Alla oleva animaatio nรคyttรครค, miten konvoluutio toimii. Paikan koko on 3ร3, ja tulosmatriisi on kuvamatriisin ja suodattimen vรคlisen elementtikohtaisen toiminnan tulos.
Huomaat, ettรค tulosteen leveys ja korkeus voivat poiketa tulon leveydestรค ja korkeudesta. Se tapahtuu rajaefektin takia.
Rajaefekti
Kuvassa on 5ร5-kokoinen ominaisuuskartta ja 3ร3-suodin. Keskellรค on vain yksi ikkuna, jossa suodin voi seuloa 3ร3-ruudukon. Tulosteessa oleva ominaisuuskartta kutistuu kahdella ruudulla kummallakin akselilla, jolloin jรคljelle jรครค 3ร3-ulottuvuus.
Saadaksesi saman ulostulomitan kuin syรถtemitan, sinun on lisรคttรคvรค tรคyttรถรค. Tรคyttรถ tarkoittaa oikean mรครคrรคn rivien ja sarakkeiden lisรครคmistรค matriisin kummallekin puolelle. Se mahdollistaa konvoluution sovittaa jokaisen syรถtelaatan keskelle. Alla olevassa kuvassa syรถte- ja tulosmatriiseilla on sama ulottuvuus, 5ร5.
Kun mรครคritรคt verkon, konvoloituneita ominaisuuksia ohjataan kolmella parametrilla:
Syvyys: Se mรครคrittรครค konvoluution aikana kรคytettรคvien suodattimien mรครคrรคn. Edellisessรค esimerkissรค syvyys oli 1, mikรค tarkoittaa, ettรค kรคytetรครคn vain yhtรค suodatinta. Useimmissa tapauksissa suodattimia on useampi kuin yksi. Alla oleva animaatio nรคyttรครค toiminnot, jotka tehdรครคn tilanteessa, jossa on kolme suodatinta.
Askel: Se mรครคrittรครค kahden viipaleen vรคlisten "pikselihyppyjen" mรครคrรคn. Jos askel on 1, ikkuna liikkuu yhden pikselin verran. Jos askel on kaksi, ikkuna hyppรครค 2 pikseliรค. Jos askelta lisรคtรครคn, ominaisuuskartat pienenevรคt. Alla olevat kaksi kaaviota vertaavat askelta 1 ja askelta 2.
Esimerkki askel 1
askel 2
Nollatรคyttรถ: Tรคydennys on operaatio, jossa syรถtekarttojen kummallekin puolelle lisรคtรครคn vastaava mรครคrรค rivejรค ja sarakkeita. Tรคssรค tapauksessa tulosteella on sama ulottuvuus kuin syรถtteellรค.
Ei-lineaarisuus (ReLU)
Konvoluutiooperaation lopussa lรคhtรถรถn sovelletaan aktivointifunktiota epรคlineaarisuuden mahdollistamiseksi. Tavanomainen konvnetin aktivointifunktio on ReLU. Kaikki negatiivisen arvon omaavat pikselit korvataan nollalla.
Pooling OperaTUKSEN
Tรคmรค vaihe on helppo ymmรคrtรครค. Yhdistรคmisen tarkoituksena on vรคhentรครค syรถtekuvan dimensionaalisuutta. Vaiheet tehdรครคn operaation laskennallisen monimutkaisuuden vรคhentรคmiseksi. Dimensionaalisuuden pienentรคmisen myรถtรค verkossa on vรคhemmรคn laskettavia painoja, mikรค estรครค ylisovituksen.
Tรคssรค vaiheessa sinun on mรครคriteltรคvรค koko ja askelmรครคrรค. Yleinen tapa yhdistรครค syรถtekuva on kรคyttรครค ominaisuuskartan maksimiarvoa. Katso alla olevaa kuvaa. Yhdistรคminen seuloo neljรค alimatriisia 4ร4-ominaisuuskartasta ja palauttaa maksimiarvon. Yhdistรคminen ottaa 2ร2-taulukon maksimiarvon ja siirtรครค sitten tรคtรค ikkunaa kahdella pikselillรค. Esimerkiksi ensimmรคinen alimatriisi on [3,1,3,2], joten yhdistรคminen palauttaa maksimiarvon, joka on 3.
On olemassa toinen yhdistรคmistoiminto, kuten keskiarvo.
Tรคmรค toiminto pienentรครค ominaisuuskartan kokoa merkittรคvรคsti.
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 tasoja ennen ennusteen tekemistรค. Hermoverkolla on:
- Konvoluutiokerros
- ReLU aktivointitoiminto
- Pooling kerros
- Tiheรคsti yhdistetty kerros
Konvoluutiokerrokset kรคyttรคvรคt erilaisia โโsuodattimia kuvan alialueille. ReLU-aktivointifunktio lisรครค epรคlineaarisuutta ja yhdistรคvรคt kerrokset vรคhentรคvรคt ominaisuuskarttojen dimensionaalisuutta.
Kaikki nรคmรค kerrokset esim.tracKuvista saatavat olennaiset tiedot. Lopuksi ominaisuuskartat syรถtetรครคn tรคysin yhdistetylle tasolle, jossa kรคytetรครคn softmax-funktiota ennusteen tekemiseksi.
Harjoittele CNN:tรค TensorFlow'lla
Nyt kun olet perehtynyt convnetin rakennuspalikoihin, 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
Versiohuomautus: Alla olevat listaukset koskevat TensorFlow 1.x:รครค. TensorFlow 2:ssa tf.layers-nimiavaruutta ja tf.estimator.inputs.numpy_input_fn:รครค ei enรครค ole; vastineet ovat tf.keras.layers.Conv2D, MaxPooling2D, Dense ja Dropout koottu tf.keras.Model-tiedostoon ja koulutettu model.fit()-funktiolla. Lue kunkin tason mekaniikan vaiheet ja yhdistรค ne sitten Keras-rajapintaan.
Vaihe 1: Lataa tietojoukko
MNIST-aineisto on saatavilla scikit-learnin kautta. Lataa se ja tallenna se Lataukset-kansioon. Voit ladata sen palvelimelle komennolla fetch_mldata('MNIST original').
Versiohuomautus: mldata.org on suljettu ja fetch_mldata() on poistettu scikit-learn 0.22 -versiosta. Lataa samat numerot missรค tahansa nykyisessรค asennuksessa seuraavasti: hae_openml sen sijaan kรคytetรครคn fetch_openml('mnist_784', version=1). Loput prosessista pysyvรคt muuttumattomina.
Luo juna/testisarja
Sinun tรคytyy jakaa tietojoukko train_test_split-metodilla.
Skaalaa ominaisuuksia
Lopuksi voit skaalata ominaisuuksia MinMaxScalerilla, kuten alla olevassa kuvaluokittelussa on esitetty TensorFlow CNN -esimerkin avulla.
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 raakapikseleissรค oppiakseen yksityiskohtien kuvioita verrattuna perinteisen neuroverkon oppimiin globaaleihin kuvioihin. CNN:n rakentamiseksi sinun on mรครคriteltรคvรค:
- Konvoluutiokerros: Kรคytรค n suodatinta ominaisuuskartassa. Konvoluution jรคlkeen sinun on kรคytettรคvรค ReLU-aktivointifunktiota lisรคtรคksesi verkkoon epรคlineaarisuuden.
- Pooling-kerros: Konvoluution jรคlkeen seuraava vaihe on ominaisuuskartan alasnรคytteistรคminen. Tarkoituksena on pienentรครค ominaisuuskartan dimensionaalisuutta ylisovituksen estรคmiseksi ja laskentanopeuden parantamiseksi. Maksimaalinen yhdistรคminen on perinteinen tekniikka, jossa ominaisuuskartat jaetaan alialueisiin (yleensรค 2ร2-koolla) ja sรคilytetรครคn vain maksimiarvot.
- 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 (esim.trac5ร5 pikselin alialueiden muodostaminen), 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รครคrittelet funktion CNN:n rakentamiseksi. Katsotaanpa yksityiskohtaisesti, miten kukin rakennuspalikka rakennetaan ennen rivitystรค.ping kaikki yhdessรค funktiossa.
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-datajoukko on yksivรคrinen kuva, jonka koko on 28 ร 28. Asetamme erรคn kooksi muoto-argumentissa -1, jotta se ottaa ominaisuuksien muodon ["x"]. Etuna on, ettรค erรคn koosta tulee viritettรคvรค hyperparametri. Jos erรคn kooksi asetetaan 7, tensori syรถttรครค 5 488 arvoa (28 * 28 * 7).
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 ytimen koko on 5ร5 ja tรคyttรถ on sama. Sama tรคyttรถ tarkoittaa, ettรค sekรค lรคhtรถ- ettรค syรถttรถtensorilla tulee olla sama korkeus ja leveys. TensorFlow lisรครค riveille ja sarakkeille nollia varmistaakseen saman koon.
Kรคytรคt ReLU-aktivointifunktiota. Tulosteen koko on [28, 28, 14].
Vaihe 4: Pooling kerros
Konvoluution jรคlkeen seuraava vaihe on yhdistรคmislaskenta. Yhdistรคmislaskenta vรคhentรครค datan dimensionaalisuutta. Voit kรคyttรครค moduulia max_pooling2d, jonka koko on 2ร2 ja stride-arvo 2. Kรคytรคt edellistรค tasoa syรถtteenรค. Tulosteen koko 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
Toinen konvoluutiokerros kรคyttรครค 36 suodatinta, jolloin tulostekooksi saadaan [batch_size, 14, 14, 36]. Yhdistรคmiskerros kรคyttรครค samaa 2ร2-ikkunaa ja 2:n askelta kuin aiemmin, joten se puolittaa jokaisen spatiaalisen akselin ja tulostemuodosta tulee [batch_size, 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)
Vaihe 6: Tiheรค kerros
Sitten sinun on mรครคriteltรคvรค tรคysin yhdistetty taso. Ominaisuuskartta on litistettรคvรค ennen sen yhdistรคmistรค tiheรครคn tasoon. Voit kรคyttรครค moduulin uudelleenmuotoilua koossa 7*7*36.
Tiheรค kerros yhdistรครค 1 764 neuronia. Lisรครคt ReLU-aktivointifunktion. Lisรคksi lisรครคt keskeyttรคmisregularisointitermin, jonka arvo on 0.3, mikรค tarkoittaa, ettรค 30 prosenttia aktivoinneista asetetaan arvoon 0. Huomaa, ettรค keskeyttรคminen tapahtuu vain koulutusvaiheen aikana. Funktiolla cnn_model_fn on argumenttitila, jolla mรครคritetรครคn, tarvitseeko mallia kouluttaa vai arvioida, kuten alla olevassa CNN-kuvien luokittelun 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-kuvanluokitteluesimerkissรค voit mรครคrittรครค viimeisen tason mallin ennusteella. Tulosteen muoto on yhtรค suuri kuin erรคn koko ja 10, kohdeluokkien 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. Funktio tf.argmax() palauttaa logits-kerroksen suurimman arvon indeksin. 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 ennustesanakirjan vain, kun tilaksi on asetettu ennustus. Lisรครค tรคmรค koodi ennusteiden nรคyttรคmiseksi.
if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
Seuraava vaihe koostuu mallin hรคviรถn laskemisesta. Edellisessรค tutoriaalissa opit, ettรค moniluokkaisen mallin hรคviรถfunktio on ristientropia. Hรคviรถ lasketaan helposti 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รคytetรครคn gradienttilaskeutumisoptimointia, jonka oppimisnopeus on 0.001. Tavoitteena on minimoida hรคvikki.
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 arviointitilassa. Moniluokkaisen mallin suorituskykymittari on tarkkuus. TensorFlow on varustettu tarkkuusmoduulilla, joka ottaa vastaan โโkaksi argumenttia: otsikot ja ennustetut arvot.
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)
Huomautus kootusta toiminnosta: Yllรค oleva kรครคritty versio asettaa ensimmรคisen konvoluutiokerroksen arvoon 32 suodatinta ja pudotuksen arvoon 0.4, kun taas vaiheittaiset koodinpรคtkรคt kรคyttรคvรคt 14 suodatinta ja 0.3. Molemmat toimivat, mutta valitse yksi arvopari ja pidรค se yhtenรคisenรค, jotta tulostetut muodot vastaavat kerrostaulukkoa.
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 kouluttaminen vie kauan, joten luot lokikirjauskoukun, joka tallentaa softmax-kerrosten arvot 50 iteraation 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 mallia. Asetat erรคn kooksi 100 ja sekoitat tiedot. Huomaa, ettรค asetamme koulutusaskeleiden mรครคrรคksi 16 000, minkรค kouluttaminen 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 sitรค 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)
Arviointi tulostaa palautetun tarkistuspisteen, vaiheen, johon se pysรคhtyi, ja lopullisen mittariluettelon.
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 arviointisanakirja raportoi tarkkuudeksi 0.9689286 eli noin 97 %. Voit muuttaa arkkitehtuuria, erรคn kokoa ja iteraatioiden mรครคrรครค tarkkuuden parantamiseksi. CNN on suoriutunut paljon paremmin kuin keinotekoinen hermoverkko tai logistinen regressio: tekoรคlyverkkoja kรคsittelevรคssรค tutoriaalissa tarkkuus oli 96 %, mikรค on alhaisempi kuin CNN:llรค. CNN:n suorituskyky on vaikuttava suuremmalla kuvajoukolla sekรค laskentanopeuden ettรค tarkkuuden suhteen.











