CNN-bildklassificering i TensorFlow med steg och exempel

โšก Smart sammanfattning

Konvolutionella neurala nรคtverk skannar en bild med smรฅ filter istรคllet fรถr att vikta varje pixel lika, vilket รคr anledningen till att de dominerar datorseende. Denna genomgรฅng fรถrklarar varje lager och klassificerar sedan MNIST-siffror med TensorFlow.

  • ๐Ÿ”˜ Fyra komponenter: Konvolution, ReLU-icke-linjรคritet, pooling och en fullstรคndigt ansluten klassificeringslagerstack i varje konvnรคt.
  • โ˜‘๏ธ Konvolutionsmekanik: Ett 3ร—3- eller 5ร—5-filter glider รถver bilden och elementvis multiplikation bygger funktionskartan.
  • โœ… Tre kontroller: Djup anger filterantalet, steg anger hoppet mellan fรถnster och nollutfyllnad bevarar utdatadimensionen.
  • ๐Ÿงช Pooling-effekt: Maximal pooling med ett 2ร—2-fรถnster och 2 steghalvor per axel, vilket minskar vikter och begrรคnsar รถveranpassning.
  • ๐Ÿ› ๏ธ Sju byggsteg: Ladda upp datamรคngden och definiera sedan indata, faltning, poolning, andra faltning, density och logits-lager.
  • ๐Ÿ“ˆ Uppmรคtt resultat: Den utvรคrderade estimatorn rapporterar en noggrannhet pรฅ 0.9689286 pรฅ MNIST, vilket รคr hรถgre รคn de 96 % som uppnรฅs av ett vanligt neuralt nรคtverk.

CNN-bildklassificering i TensorFlow

Vad รคr Convolutional Neural Network?

Konvolutionellt neuralt nรคtverk, รคven kรคnt som convnets eller CNN, รคr en vรคlkรคnd metod inom datorseendetillรคmpningar. Det รคr en klass av djupa neurala nรคtverk som anvรคnds fรถr att analysera visuella bilder. Denna typ av arkitektur รคr dominerande fรถr att kรคnna igen objekt frรฅn en bild eller video. Den anvรคnds i tillรคmpningar som bild- eller videoigenkรคnning, naturlig sprรฅkbehandling och rekommendationssystem.

ArchiTecture of a Convolutional Neural Network

Tรคnk pรฅ Facebook fรถr nรฅgra รฅr sedan, efter att du laddat upp en bild till din profil blev du ombedd att lรคgga till ett namn till ansiktet pรฅ bilden manuellt. Nufรถrtiden anvรคnder Facebook convnet fรถr att tagga din vรคn i bilden automatiskt.

Ett konvolutionellt neuralt nรคtverk fรถr bildklassificering รคr inte sรคrskilt svรฅrt att fรถrstรฅ. En ingรฅngsbild bearbetas under faltningsfasen och tilldelas senare en etikett.

En typisk convnet-arkitektur kan sammanfattas i bilden nedan. Fรถrst skickas en bild till nรคtverket; detta kallas inmatningsbilden. Sedan gรฅr inmatningsbilden igenom en serie steg; detta รคr den faltningsmรคssiga delen av nรคtverket. Slutligen kan det neurala nรคtverket fรถrutsรคga siffran pรฅ bilden.

End-to-end convnet-arkitektur frรฅn inmatningsbilden genom faltningsstegen till den fรถrutspรฅdda siffran
ArchiTecture of a Convolutional Neural Network (CNN)

En bild bestรฅr av en matris med pixlar med hรถjd och bredd. En grรฅskalig bild har bara en kanal medan fรคrgbilden har tre kanaler (var och en fรถr rรถd, grรถn och blรฅ). Kanalerna รคr staplade ovanpรฅ varandra. I den hรคr handledningen kommer du att anvรคnda en grรฅskalig bild med bara en kanal. Varje pixel har ett vรคrde frรฅn 0 till 255 fรถr att รฅterspegla fรคrgens intensitet. Till exempel kommer en pixel lika med 0 att visa en vit fรคrg medan en pixel med ett vรคrde nรคra 255 kommer att vara mรถrkare.

Lรฅt oss ta en titt pรฅ en bild lagrad i MNIST-datauppsรคttningBilden nedan visar hur man representerar bilden till vรคnster i ett matrisformat. Observera att den ursprungliga matrisen har standardiserats till att vara mellan 0 och 1. Fรถr mรถrkare fรคrger รคr vรคrdet i matrisen cirka 0.9 medan vita pixlar har ett vรคrde pรฅ 0.

Handskriven MNIST-siffra som visas bredvid dess 28 x 28 pixlars matris med vรคrden standardiserade mellan 0 och 1

Konvolutionell drift

Den viktigaste komponenten i modellen รคr faltningsskiktet. Denna del syftar till att minska bildens storlek fรถr snabbare berรคkningar av vikterna och fรถrbรคttra generaliseringen.

Under faltningsdelen behรฅller nรคtverket de vรคsentliga egenskaperna i bilden och utesluter irrelevant brus. Modellen lรคr sig till exempel att kรคnna igen en elefant frรฅn en bild med ett berg i bakgrunden. Om du anvรคnder ett traditionellt neuralt nรคtverk kommer modellen att tilldela alla pixlar en vikt, inklusive de frรฅn berget, vilket inte รคr nรถdvรคndigt och kan vilseleda nรคtverket.

Istรคllet a Keras ett faltningsneuralt nรคtverk kommer att anvรคnda en matematisk teknik fรถr att extracbara de mest relevanta pixlarna. Denna matematiska operation kallas faltning. Denna teknik gรถr det mรถjligt fรถr nรคtverket att lรคra sig alltmer komplexa funktioner i varje lager. Faltningen delar upp matrisen i smรฅ bitar fรถr att lรคra sig de viktigaste elementen i varje del.

Komponenter i Convolutional Neural Network (ConvNet eller CNN)

Det finns fyra komponenter i ett convnet:

  1. Faltning
  2. Icke linjรคritet (ReLU)
  3. Pooling eller Subsampling
  4. Klassificering (Fullstรคndigt anslutet lager)

Faltning

Syftet med konvolutionen รคr att extracobjektets egenskaper lokalt pรฅ bilden. Det betyder att nรคtverket kommer att lรคra sig specifika mรถnster i bilden och kommer att kunna kรคnna igen dem รถverallt i bilden.

Konvolution รคr en elementvis multiplikation. Konceptet รคr lรคtt att fรถrstรฅ. Datorn skannar en del av bilden, vanligtvis med en dimension pรฅ 3ร—3, och multiplicerar den med ett filter. Utdata frรฅn den elementvisa multiplikationen kallas en feature map (funktionskarta). Detta steg upprepas tills hela bilden รคr skannad. Observera att bildens storlek minskas efter konvolutionen.

Diagrammet nedan visar en del av bilden som multipliceras med filtret fรถr att producera en enda cell i objektkartan.

Elementvis multiplikation av en 3 gรฅnger 3-bildpatch med ett filter som producerar ett vรคrde av objektkartan

Animationen nedan visar samma faltning som lรถper รถver hela bilden.

Animerat filter som glider รถver en inmatningsbild och bygger objektkartan cell fรถr cell

Det finns mรฅnga filter tillgรคngliga. Nedan listar vi nรฅgra av dem. Du kan se att varje filter har ett specifikt syfte. Observera att kรคrnan i bilden nedan รคr en synonym till filtret.

Tabell รถver vanliga faltningskรคrnor som kantdetektering, skรคrpa och oskรคrpa med deras resulterande utdatabilder

Aritmetik bakom faltningen

Faltningsfasen applicerar filtret pรฅ en liten uppsรคttning pixlar i bilden. Filtret rรถr sig lรคngs inmatningsbilden med en generell form av 3ร—3 eller 5ร—5. Det betyder att nรคtverket skjuter dessa fรถnster รถver hela inmatningsbilden och berรคknar faltningen. Animationen nedan visar hur faltningen fungerar. Patchens storlek รคr 3ร—3, och utmatningsmatrisen รคr resultatet av den elementvisa operationen mellan bildmatrisen och filtret.

Steg-fรถr-steg-animering av ett 3 gรฅnger 3-filter som multiplicerar bildvรคrden och summerar dem till utmatningsmatrisen.

Du mรคrker att utmatningens bredd och hรถjd kan skilja sig frรฅn ingรฅngens bredd och hรถjd. Det hรคnder pรฅ grund av grรคnseffekten.

Grรคnseffekt

Bilden har en 5ร—5-funktionskarta och ett 3ร—3-filter. Det finns bara ett fรถnster i mitten dรคr filtret kan visa ett 3ร—3-rutnรคt. Funktionskartan som visas krymper med tvรฅ rutor pรฅ varje axel, vilket ger en 3ร—3-dimension.

En 5x5-funktionskarta reducerad till en 3x3-utgรฅng eftersom 3x3-filtret inte kan nรฅ grรคnserna

Fรถr att fรฅ samma utgรฅngsdimension som ingรฅngsdimension mรฅste du lรคgga till utfyllnad. Utfyllnad bestรฅr av att lรคgga till rรคtt antal rader och kolumner pรฅ varje sida av matrisen. Det gรถr att faltningen centreras och passar varje ingรฅngsruta. I bilden nedan har ingรฅngs- och utgรฅngsmatriserna samma dimension, 5ร—5.

En 5 x 5-ingรฅng omgiven av en ring med noll utfyllnad sรฅ att faltningen returnerar en 5 x 5-utgรฅng

Nรคr du definierar nรคtverket styrs de invecklade funktionerna av tre parametrar:

Djup: Den definierar antalet filter som ska tillรคmpas under faltningen. I fรถregรฅende exempel sรฅg du ett djup pรฅ 1, vilket innebรคr att endast ett filter anvรคnds. I de flesta fall finns det mer รคn ett filter. Animationen nedan visar de operationer som utfรถrs i en situation med tre filter.

Tre separata filter som konvolverar samma indata och producerar tre staplade funktionskartor

Kliva: Den definierar antalet "pixelhopp" mellan tvรฅ skivor. Om steglรคngden รคr lika med 1, kommer fรถnstret att rรถra sig med en pixelspridning pรฅ ett. Om steglรคngden รคr lika med tvรฅ, kommer fรถnstret att hoppa med 2 pixlar. Om du รถkar steglรคngden fรฅr du mindre funktionskartor. De tvรฅ diagrammen nedan jรคmfรถr ett steg pรฅ 1 med ett steg pรฅ 2.

Exempel steg 1

Filterfรถnstret rรถr sig en pixel i taget รถver inmatningsraden med steglรคngden instรคlld pรฅ 1

steg 2

Hoppa รถver filterfรถnstretping tvรฅ pixlar mellan positioner med steglรคngd instรคlld pรฅ 2, vilket ger en kortare utdata

Nollfyllning: Padding รคr en operation dรคr man lรคgger till ett motsvarande antal rader och kolumner pรฅ varje sida av inmatningsfunktionskartorna. I det hรคr fallet har utdata samma dimension som indata.

Icke linjรคritet (ReLU)

I slutet av faltningsoperationen aktiveras utdata med en aktiveringsfunktion fรถr att mรถjliggรถra icke-linjรคritet. Den vanliga aktiveringsfunktionen fรถr ett konvolutionsnรคt รคr ReLU. Alla pixlar med ett negativt vรคrde ersรคtts med noll.

Pooling Operation

Det hรคr steget รคr lรคtt att fรถrstรฅ. Syftet med poolningen รคr att minska dimensionaliteten hos inmatningsbilden. Stegen utfรถrs fรถr att minska operationens berรคkningskomplexitet. Genom att minska dimensionaliteten har nรคtverket fรคrre vikter att berรคkna, vilket fรถrhindrar รถveranpassning.

I det hรคr steget behรถver du definiera storleken och steglรคngden. Ett standardsรคtt att poola inmatningsbilden รคr att anvรคnda det maximala vรคrdet fรถr objektkartan. Titta pรฅ bilden nedan. Poolningen screenar fyra delmatriser av 4ร—4-objektkartan och returnerar det maximala vรคrdet. Poolningen tar det maximala vรคrdet fรถr en 2ร—2-array och flyttar sedan detta fรถnster med tvรฅ pixlar. Till exempel รคr den fรถrsta delmatrisen [3,1,3,2], sรฅ poolningen returnerar det maximala, vilket รคr 3.

En 4x4-funktionskarta reducerad till en 2x2-utgรฅng genom maximal poolning med ett 2x2-fรถnster och steg 2

Det finns en annan poolningsoperation sรฅsom medelvรคrdet.

Den hรคr รฅtgรคrden minskar storleken pรฅ objektkartan kraftigt.

Fullt anslutna lager

Det sista steget bestรฅr av att bygga en traditionell artificiellt neuralt nรคtverk som du gjorde i fรถregรฅende handledning. Du kopplar alla neuroner frรฅn fรถregรฅende lager till nรคsta lager. Du anvรคnder en softmax-aktiveringsfunktion fรถr att klassificera numret pรฅ inmatningsbilden.

Recap:

Ett TensorFlow-faltningsneuralt nรคtverk kompilerar olika lager innan en fรถrutsรคgelse gรถrs. Ett neuralt nรคtverk har:

  • Ett veckskikt
  • ReLU aktiveringsfunktion
  • Pooling lager
  • Tรคtt sammanhรคngande lager

Faltningslagren tillรคmpar olika filter pรฅ en delregion av bilden. ReLU-aktiveringsfunktionen lรคgger till icke-linjรคritet, och poolningslagren minskar dimensionaliteten hos objektkartorna.

Alla dessa lager extracviktig information frรฅn bilderna. Slutligen matas funktionskartorna till ett helt sammankopplat lager med en softmax-funktion fรถr att gรถra en fรถrutsรคgelse.

Trรคna CNN med TensorFlow

Nu nรคr du รคr bekant med byggstenarna i ett convnet รคr du redo att bygga ett med TensorFlow. Vi kommer att anvรคnda MNIST-datauppsรคttningen fรถr CNN-bildklassificering.

Datafรถrberedelsen รคr densamma som den tidigare handledningen. Du kan kรถra koderna och hoppa direkt till CNN:s arkitektur.

Du kommer att fรถlja stegen nedan fรถr bildklassificering med CNN:

  1. Steg 1: Ladda upp datauppsรคttning
  2. Steg 2: Indatalager
  3. Steg 3: Konvolutionellt lager
  4. Steg 4: Pooling lager
  5. Steg 5: Andra konvolutionella lagret och Pooling Lager
  6. Steg 6: Tรคt lager
  7. Steg 7: Logit Layer

Versionsnotering: Listningarna nedan riktar sig mot TensorFlow 1.x. I TensorFlow 2 finns inte lรคngre namnrymden tf.layers och tf.estimator.inputs.numpy_input_fn; motsvarigheterna รคr tf.keras.layers.Conv2D, MaxPooling2D, Dense och Dropout monterade i en tf.keras.Model och trรคnade med model.fit(). Lรคs stegen fรถr mekaniken fรถr varje lager och mappa dem sedan till Keras API.

Steg 1: Ladda upp datauppsรคttning

MNIST-datasetet รคr tillgรคngligt via scikit-learn. Ladda ner det och lagra det i Nedladdningar. Du kan ladda upp det med fetch_mldata('MNIST original').

Versionsnotering: mldata.org har stรคngts ner och fetch_mldata() togs bort i scikit-learn 0.22. Ladda in samma siffror med hรคmta_รถppenml istรคllet anvรคnder man fetch_openml('mnist_784', version=1). Resten av pipelinen รคr ofรถrรคndrad.

Skapa ett tรฅg/testset

Du mรฅste dela upp datamรคngden med train_test_split.

Skala funktionerna

Slutligen kan du skala funktionerna med MinMaxScaler som visas i bildklassificeringen nedan med hjรคlp av TensorFlow CNN-exemplet.

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

Definiera CNN

Ett CNN anvรคnder filter pรฅ de rรฅa pixlarna i en bild fรถr att lรคra sig detaljmรถnster jรคmfรถrt med de globala mรถnster som lรคrs ut av ett traditionellt neuralt nรคtverk. Fรถr att konstruera ett CNN mรฅste du definiera:

  1. Ett faltningslager: Applicera n antal filter pรฅ objektkartan. Efter faltningen behรถver du anvรคnda en ReLU-aktiveringsfunktion fรถr att lรคgga till icke-linjรคritet i nรคtverket.
  2. Pooling-lager: Nรคsta steg efter faltningen รคr att nedsampla objektkartan. Syftet รคr att minska objektkartans dimensionalitet fรถr att fรถrhindra รถveranpassning och fรถrbรคttra berรคkningshastigheten. Maxpooling รคr den konventionella tekniken som delar upp objektkartorna i delregioner (vanligtvis med en storlek pรฅ 2ร—2) och endast behรฅller de maximala vรคrdena.
  3. Fullstรคndigt anslutna skikt: Alla neuroner frรฅn fรถregรฅende skikt รคr anslutna till nรคsta skikt. CNN kommer att klassificera etiketten enligt sรคrdragen frรฅn faltningsskikten och reduceras med poolskiktet.

CNN arkitektur

  • Konvolutionellt lager: Tillรคmpar 14 5ร—5-filter (t.ex.trac(5ร—5-pixel-underregioner), med ReLU-aktiveringsfunktion
  • Pooling Lager: Utfรถr maximal poolning med ett 2ร—2-filter och steg pรฅ 2 (vilket anger att poolade regioner inte รถverlappar varandra)
  • Convolutional Layer: Applicerar 36 5ร—5-filter, med ReLU-aktiveringsfunktion
  • Pooling Layer #2: ร…terigen, utfรถr max pooling med ett 2ร—2 filter och steg pรฅ 2
  • 1,764 0.4 neuroner, med avbrottsregulariseringshastighet pรฅ 0.4 (sannolikheten XNUMX fรถr att nรฅgot givet element kommer att tappas under trรคning)
  • Tรคt lager (Logits lager): 10 neuroner, en fรถr varje siffra mรฅlklass (0โ€“9).

Det finns tre viktiga moduler att anvรคnda fรถr att skapa ett CNN:

  • conv2d(). Konstruerar ett tvรฅdimensionellt faltningslager med antalet filter, filterkรคrnans storlek, utfyllnad och aktiveringsfunktion som argument.
  • max_pooling2d(). Konstruerar ett tvรฅdimensionellt poollager med hjรคlp av algoritmen fรถr maxpoolning.
  • tรคt(). Konstruerar ett tรคtt lager med de dolda lagren och enheterna

Du kommer att definiera en funktion fรถr att bygga CNN. Lรฅt oss se i detalj hur man konstruerar varje byggsten innan omslag.ping allt tillsammans i funktionen.

Steg 2: Indatalager

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

Du mรฅste definiera en tensor med formen pรฅ data. Fรถr det kan du anvรคnda modulen tf.reshape. I den hรคr modulen mรฅste du fรถrklara att tensorn ska omformas och formen pรฅ tensorn. Det fรถrsta argumentet รคr egenskaperna hos datan, som definieras i funktionens argument.

En bild har en hรถjd, en bredd och en kanal. MNIST-datasetet รคr en monokrom bild med storleken 28ร—28. Vi stรคller in batchstorleken till -1 i argumentet form sรฅ att den tar formen av features["x"]. Fรถrdelen รคr att gรถra batchstorleken till en hyperparameter att finjustera. Om batchstorleken รคr satt till 7, kommer tensorn att mata in 5 488 vรคrden (28*28*7).

Steg 3: Konvolutionellt lager

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

Det fรถrsta faltningslagret har 14 filter med en kรคrnstorlek pรฅ 5ร—5 och samma utfyllnad. Samma utfyllnad innebรคr att bรฅde utgรฅngstensorn och ingรฅngstensorn ska ha samma hรถjd och bredd. TensorFlow lรคgger till nollor i raderna och kolumnerna fรถr att sรคkerstรคlla samma storlek.

Du anvรคnder ReLU-aktiveringsfunktionen. Utdatastorleken blir [28, 28, 14].

Steg 4: Pooling lager

Nรคsta steg efter faltningen รคr poolningsberรคkningen. Poolningsberรคkningen kommer att minska datadimensionaliteten. Du kan anvรคnda modulen max_pooling2d med en storlek pรฅ 2ร—2 och ett stridlรคge pรฅ 2. Du anvรคnder fรถregรฅende lager som indata. Utdatastorleken blir [batch_size, 14, 14, 14].

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

Steg 5: Andra konvolutionella lagret och Pooling Lager

Det andra faltningslagret tillรคmpar 36 filter, vilket ger en utmatningsstorlek pรฅ [batch_size, 14, 14, 36]. Poolningslagret anvรคnder samma 2ร—2-fรถnster och strid pรฅ 2 som tidigare, sรฅ det halverar varje rumslig axel och utmatningsformen blir [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)

Steg 6: Tรคt lager

Sedan mรฅste du definiera det helt sammankopplade lagret. Featurekartan mรฅste plattas ut innan den ansluts till det tรคta lagret. Du kan anvรคnda modulen fรถr omformning med en storlek pรฅ 7*7*36.

Det tรคta lagret kommer att koppla samman 1 764 neuroner. Du lรคgger till en ReLU-aktiveringsfunktion. Dessutom lรคgger du till en bortfallsregulariseringsterm med en frekvens pรฅ 0.3, vilket innebรคr att 30 procent av aktiveringarna kommer att sรคttas till 0. Observera att bortfallet endast sker under trรคningsfasen. Funktionen cnn_model_fn har ett argumentlรคge fรถr att deklarera om modellen behรถver trรคnas eller utvรคrderas, som visas i exemplet med CNN-bildklassificeringen TensorFlow nedan.

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)

Steg 7: Logit Layer

Slutligen, i exemplet med TensorFlow-bildklassificering, kan du definiera det sista lagret med modellens fรถrutsรคgelse. Utdataformen รคr lika med batchstorleken och 10 รคr det totala antalet mรฅlklasser.

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

Du kan skapa en ordbok som innehรฅller klasserna och sannolikheten fรถr varje klass. Funktionen tf.argmax() returnerar indexet fรถr det hรถgsta vรคrdet i logits-lagret. Softmax-funktionen returnerar sannolikheten fรถr varje klass.

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

Du vill bara returnera prediktionsordlistan nรคr lรคget รคr instรคllt pรฅ prediktion. Du lรคgger till den hรคr koden fรถr att visa prediktionerna.

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

Nรคsta steg bestรฅr av att berรคkna modellens fรถrlust. I den senaste handledningen lรคrde du dig att fรถrlustfunktionen fรถr en flerklassmodell รคr korsentropi. Fรถrlusten berรคknas enkelt med fรถljande kod:

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

Det sista steget i TensorFlow CNN-exemplet รคr att optimera modellen, det vill sรคga att hitta de bรคsta vรคrdena fรถr vikterna. Fรถr det anvรคnder du en gradient descent-optimerare med en inlรคrningshastighet pรฅ 0.001. Mรฅlet รคr att minimera fรถrlusten.

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

Du รคr klar med CNN. Du vill dock visa prestandamรฅtten under utvรคrderingslรคget. Prestandamรคtet fรถr en flerklassmodell รคr noggrannhet. TensorFlow รคr utrustad med en noggrannhetsmodul som tar tvรฅ argument, etiketterna och de fรถrutspรฅdda vรคrdena.

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)

Det รคr allt. Du skapade ditt fรถrsta CNN och du รคr redo att slรฅ in allt i en funktion fรถr att anvรคnda den fรถr att trรคna och utvรคrdera modellen.

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)

Anmรคrkning om den sammansatta funktionen: Den inslagna versionen ovan stรคller in det fรถrsta faltningslagret till 32 filter och bortfall till 0.4, medan steg-fรถr-steg-kodavsnitten anvรคnder 14 filter och 0.3. Bรฅda kรถrs, men vรคlj ett vรคrdepar och hรฅll det konsekvent sรฅ att de utskrivna formerna matchar lagertabellen.

Stegen nedan รคr desamma som de tidigare handledningarna.

Fรถrst och frรคmst definierar du en estimator med CNN-modellen fรถr bildklassificering.

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

Ett CNN tar lรฅng tid att trรคna, dรคrfรถr skapar du en loggningskrok fรถr att lagra vรคrdena fรถr softmax-lagren var 50:e iteration.

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

Du รคr redo att uppskatta modellen. Du stรคller in en batchstorlek pรฅ 100 och blandar data. Observera att vi har satt in trรคningssteg pรฅ 16 000, vilket kan ta lรฅng tid att trรคna. Ha tรฅlamod.

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

Nu nรคr modellen รคr trรคnad kan du utvรคrdera den och skriva ut resultaten.

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

Utvรคrderingen skriver ut den รฅterstรคllda kontrollpunkten, steget den stoppades vid och den slutliga mรคtvรคrdesordlistan.

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}

Med den nuvarande arkitekturen rapporterar utvรคrderingslexikonet en noggrannhet pรฅ 0.9689286, ungefรคr 97 %. Du kan รคndra arkitekturen, batchstorleken och antalet iterationer fรถr att fรถrbรคttra noggrannheten. CNN har presterat mycket bรคttre รคn en artificiellt neuralt nรคtverk eller logistisk regression: i handledningen om artificiella neurala nรคtverk hade du en noggrannhet pรฅ 96 %, vilket รคr lรคgre รคn CNN:s. CNN:s prestanda รคr imponerande med en stรถrre bilduppsรคttning, bรฅde vad gรคller berรคkningshastighet och noggrannhet.

Vanliga frรฅgor

Giltig utfyllnad lรคgger inte till nรฅgot, sรฅ utdata krymper och kantpixlar matar fรคrre neuroner. Samma utfyllnad ringar indata med nollor sรฅ att utdata behรฅller indatahรถjden och bredden, vilket รคr vad conv2d anropar i denna handledningsfรถrfrรฅgan.

Inte ofรถrรคndrad. tf.layers och tf.estimator.inputs.numpy_input_fn togs bort. ร…teruppbygg samma stack med tf.keras.layers.Conv2D, Max.Pooling2D, tรคt och bortfall inuti en TensorFlow Keras-modellen, trรคna den sedan med model.fit() istรคllet fรถr en estimator.

Automatiserade sรถkbibliotek sveper filterantal, kรคrnstorlekar, bortfallsfrekvenser och inlรคrningsfrekvenser parallellt och rangordnar sedan kรถrningar efter valideringsnoggrannhet. De ersรคtter gissningar med uppmรคtta jรคmfรถrelser, รคven om en mรคnniska fortfarande bestรคmmer berรคkningsbudgeten och vilken mรคtmetrik som รคr viktig.

Ja. GitHub Copilot utarbetar repetitiva faltningar och poolningsstackar och inmatningspipelinen frรฅn en kort kommentar. Kontrollera utmatningsformerna sjรคlv, eftersom fรถrslag ofta blandar borttagna TensorFlow 1 API:er med nuvarande Keras-API:er.

Slumpmรคssiga vรคndningar, rotationer, fรถrskjutningar och zoomningar skapar nya variationer av varje trรคningsbild, sรฅ att nรคtverket ser ett bredare utbud av exempel och slutar memorera enskilda bilder. Det fungerar bra med bortfall och minskar vanligtvis gapet mellan trรคnings- och valideringsnoggrannhet.

Lรถpningen hรคr anvรคnder 16 000 steg med en batchstorlek pรฅ 100. Noggrannheten kommer mycket tidigare, sรฅ hรฅll koll pรฅ utvรคrderingsmรฅttet och sluta nรคr det nรฅr en platรฅ istรคllet fรถr att vรคnta ut hela rรคkningen pรฅ en lรฅngsam maskin.

mldata.org stรคngdes av och hjรคlparen togs bort i scikit-learn 0.22. Anvรคnd fetch_openml('mnist_784', version=1) istรคllet. Den returnerar samma 70 000 utplattade 784-pixel siffror, sรฅ skalnings- och delningsstegen i den hรคr handledningen fortsรคtter att fungera.

De lรคses som batch, hรถjd, bredd, kanaler. Sรฅ 14 gรฅnger 14 รคr den spatiala storleken efter ett poolningssteg pรฅ en 28 gรฅnger 28 siffra, och 36 รคr antalet filter i det faltningsskiktet, en funktionskarta per filter.

Sammanfatta detta inlรคgg med: