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.

  • 🔘 Neljä komponenttia: Konvoluutio, ReLU-epälineaarisuus, yhdistäminen ja täysin kytketty luokittelukerrospino jokaisessa konvnetissä.
  • ☑️ Konvoluutiomekaniikka: 3×3- tai 5×5-suodatin liukuu kuvan poikki ja elementtikohtainen kertolasku rakentaa ominaisuuskartan.
  • ✅ Kolme säätöä: Syvyys (Depth) asettaa suodattimien määrän, askel (stide) asettaa ikkunoiden välisen hypyn ja nollatäyttö säilyttää tulosteen ulottuvuuden.
  • 🧪 Pooling-vaikutus: Maksimaalinen yhdistäminen 2×2-ikkunalla ja askellusaskeleen puolikkaat kummallakin akselilla, mikä vähentää painoja ja rajoittaa ylisovitusta.
  • 🛠️ Seitsemän rakennusvaihetta: Lataa datajoukko ja määritä sitten syöttö-, konvoluutio-, yhdistämis-, toinen konvoluutio-, tiheä- ja logit-kerros.
  • 📈 Mitattu tulos: Arvioidun estimaattorin tarkkuudeksi MNIST-menetelmässä on ilmoitettu 0.9689286, mikä on parempi kuin tavallisen neuroverkon saavuttama 96 %.

CNN-kuvien luokittelu TensorFlow'ssa

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.

Päästä päähän -konvnet-arkkitehtuuri syöttökuvasta konvoluutiovaiheiden kautta ennustettuun numeroon
Archikonvoluutiohermoverkon (CNN) rakenne

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.

Käsin kirjoitettu MNIST-numero sen 28 x 28 pikselin matriisin vieressä, jonka arvot on standardoitu välille 0 ja 1

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:

  1. Kierre
  2. Ei-lineaarisuus (ReLU)
  3. Pooling tai Sub Sampling
  4. 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.

3:3-kuvalaastarin elementtikohtainen kertolasku suodattimella, joka tuottaa yhden arvon ominaisuuskartasta

Alla oleva animaatio näyttää saman konvoluution koko kuvan poikki.

Animoitu suodatin, joka liukuu syötetyn kuvan yli ja rakentaa ominaisuuskartan solu solulta

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.

Taulukko yleisistä konvoluutioytimistä, kuten reunantunnistus, terävöitys ja sumennus, sekä niiden tuloksena syntyvistä kuvista

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.

Vaiheittainen animaatio 3 x 3 -suodattimesta, joka kertoo kuvan arvot ja summaa ne tulosmatriisiksi

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.

5 x 5 -ominaisuuskartta, joka on supistettu 3 x 3 -tulosteeksi, koska 3 x 3 -suodatin ei yllä reunoille

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.

5 x 5 -kokoinen syöte, jota ympäröi nollatäytteinen rengas, joten konvoluutio palauttaa 5 x 5 -kokoisen tulosteen

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.

Kolme erillistä suodatinta, jotka yhdistävät saman syötteen ja tuottavat kolme pinottua ominaisuuskarttaa

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

Suodatinikkuna liikkuu pikseli kerrallaan syöterivillä askeleen ollessa asetettu arvoon 1

askel 2

Suodatinikkunan ohitusping kaksi pikseliä asentojen välillä askeleen ollessa asetettu arvoon 2, mikä tuottaa lyhyemmän tulosteen

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.

4 x 4 -ominaisuuskartta, joka on pelkistetty 2 x 2 -tulosteeksi maksimaalisella yhdistämisellä, 2 x 2 -ikkunalla ja askeleella 2

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:

  1. Vaihe 1: Lataa tietojoukko
  2. Vaihe 2: Syötä kerros
  3. Vaihe 3: Konvoluutiokerros
  4. Vaihe 4: Pooling kerros
  5. Vaihe 5: Toinen konvoluutiokerros ja Pooling Kerros
  6. Vaihe 6: Tiheä kerros
  7. 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ä:

  1. Konvoluutiokerros: Käytä n suodatinta ominaisuuskartassa. Konvoluution jälkeen sinun on käytettävä ReLU-aktivointifunktiota lisätäksesi verkkoon epälineaarisuuden.
  2. 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.
  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 (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.

UKK

Kelvollinen täyttö ei lisää mitään, joten tuloste kutistuu ja reunapikselit syöttävät vähemmän neuroneja. Sama täyttö ympäröi syötteen nollilla, joten tuloste säilyttää syötteen korkeuden ja leveyden, mitä conv2d kutsuu tässä tutoriaalipyynnössä.

Ei muutoksia. tf.layers ja tf.estimator.inputs.numpy_input_fn poistettiin. Rakenna sama pino uudelleen tf.keras.layers.Conv2D:llä, MaxPooling2D, tiheä ja pudotus sisällä TensorFlow Keras-malli ja kouluta se sitten model.fit()-funktiolla estimaattorin sijaan.

Automaattiset hakukirjastot tarkistavat suodattimien määrät, ytimien koot, keskeyttämisprosentit ja oppimisprosentit rinnakkain ja järjestävät sitten ajoja validointitarkkuuden perusteella. Ne korvaavat arvailun mitatuilla vertailuilla, vaikka ihminen päättää edelleen laskentabudjetin ja tärkeän mittarin.

Kyllä. GitHub Copilot luonnostelee toistuvia konvoluutio- ja yhdistämispinoja sekä syöttöputken lyhyen kommentin perusteella. Tarkista tulostemuodot itse, koska ehdotukset sekoittavat usein poistettuja TensorFlow 1 -API-rajapintoja nykyisiin Keras-API-rajapintoihin.

Satunnaiset käännöt, rotaatiot, siirrot ja zoomaukset luovat uusia variaatioita jokaisesta harjoituskuvasta, joten verkko näkee laajemman valikoiman esimerkkejä eikä yksittäisiä kuvia tarvitse muistaa. Tämä sopii hyvin yhteen keskeyttämisen kanssa ja yleensä kaventaa harjoitus- ja validointitarkkuuden välistä kuilua.

Tässä ajossa käytetään 16 000 askelta 100 erän koossa. Suurin osa tarkkuudesta saavutetaan paljon aikaisemmin, joten seuraa arviointimetriikkaa ja lopeta, kun se tasaantuu, sen sijaan, että odottaisit koko laskurin suorittamista hitaalla koneella.

mldata.org suljettiin ja apuohjelma poistettiin scikit-learn versiossa 0.22. Käytä sen sijaan fetch_openml('mnist_784', version=1). Se palauttaa samat 70 000 litistettyä 784 pikselin numeroa, joten tämän opetusohjelman skaalaus- ja jakovaiheet toimivat edelleen.

Ne luetaan seuraavasti: erä, korkeus, leveys, kanavat. Joten 14 x 14 on spatiaalinen koko yhden yhdistämisvaiheen jälkeen 28 x 28-numeroisella näytöllä ja 36 on suodattimien lukumäärä kyseisessä konvoluutiokerroksessa, yksi ominaisuuskartta suodatinta kohden.

Tiivistä tämä viesti seuraavasti: