CNN bildeklassifisering i TensorFlow med trinn og eksempler

โšก Smart oppsummering

Konvolusjonelle nevrale nettverk skanner et bilde med smรฅ filtre i stedet for รฅ vekte hver piksel likt, og det er derfor de dominerer datasyn. Denne gjennomgangen forklarer hvert lag og klassifiserer deretter MNIST-sifre med TensorFlow.

  • ๐Ÿ”˜ Fire komponenter: Konvolusjon, ReLU-ikke-linearitet, pooling og en fullstendig tilkoblet klassifiseringslagstabel i hvert konvnett.
  • โ˜‘๏ธ Konvolusjonsmekanikk: Et 3ร—3- eller 5ร—5-filter glir over bildet, og elementvis multiplikasjon bygger funksjonskartet.
  • โœ… Tre kontroller: Dybde angir filterantall, skritt angir hoppet mellom vinduer, og nullpolstring bevarer utdatadimensjonen.
  • ๐Ÿงช Pooling-effekt: Maksimal pooling med et 2ร—2-vindu og 2 skritthalvdeler pรฅ hver akse, noe som reduserer vekter og begrenser overtilpasning.
  • ๐Ÿ› ๏ธ Syv byggetrinn: Last opp datasettet, og definer deretter input, konvolusjon, pooling, andre konvolusjon, tette lag og logits-lag.
  • ๐Ÿ“ˆ Mรฅlt resultat: Den evaluerte estimatoren rapporterer en nรธyaktighet pรฅ 0.9689286 pรฅ MNIST, foran de 96 % som nรฅs av et vanlig nevralt nettverk.

CNN-bildeklassifisering i TensorFlow

Hva er Convolutional Neural Network?

Konvolusjonelt nevralt nettverk, ogsรฅ kjent som convnets eller CNN, er en velkjent metode innen datasynsapplikasjoner. Det er en klasse dype nevrale nettverk som brukes til รฅ analysere visuelle bilder. Denne typen arkitektur er dominerende for รฅ gjenkjenne objekter fra et bilde eller en video. Den brukes i applikasjoner som bilde- eller videogjenkjenning, naturlig sprรฅkbehandling og anbefalingssystemer.

ArchiTecture of a Convolutional Neural Network

Tenk pรฅ Facebook for noen รฅr siden, etter at du lastet opp et bilde til profilen din, ble du bedt om รฅ legge til et navn til ansiktet pรฅ bildet manuelt. I dag bruker Facebook convnet for รฅ tagge vennen din i bildet automatisk.

Et konvolusjonelt nevralt nettverk for bildeklassifisering er ikke veldig vanskelig รฅ forstรฅ. Et inngangsbilde behandles under konvolusjonsfasen og tilskrives senere en etikett.

En typisk convnet-arkitektur kan oppsummeres i bildet nedenfor. Fรธrst sendes et bilde til nettverket; dette kalles inngangsbildet. Deretter gรฅr inngangsbildet gjennom en rekke trinn; dette er den konvolusjonelle delen av nettverket. Til slutt kan det nevrale nettverket forutsi sifferet pรฅ bildet.

Ende-til-ende convnet-arkitektur fra inngangsbildet gjennom konvolusjonstrinnene til det forutsagte sifferet
ArchiTecture of a Convolutional Neural Network (CNN)

Et bilde er satt sammen av en rekke piksler med hรธyde og bredde. Et grรฅtonebilde har bare รฉn kanal, mens fargebildet har tre kanaler (hver for rรธd, grรธnn og blรฅ). Kanalene er stablet oppรฅ hverandre. I denne veiledningen skal du bruke et grรฅtonebilde med bare รฉn kanal. Hver piksel har en verdi fra 0 til 255 for รฅ gjenspeile fargens intensitet. For eksempel vil en piksel lik 0 vise en hvit farge, mens en piksel med en verdi nรฆr 255 vil vรฆre mรธrkere.

La oss ta en titt pรฅ et bilde som er lagret i MNIST datasettBildet nedenfor viser hvordan man representerer bildet til venstre i et matriseformat. Merk at den opprinnelige matrisen er standardisert til รฅ vรฆre mellom 0 og 1. For mรธrkere farger er verdien i matrisen omtrent 0.9, mens hvite piksler har en verdi pรฅ 0.

Hรฅndskrevet MNIST-siffer vist ved siden av matrisen pรฅ 28 x 28 piksler med verdier standardisert mellom 0 og 1

Konvolusjonsoperasjon

Den viktigste komponenten i modellen er konvolusjonslaget. Denne delen tar sikte pรฅ รฅ redusere stรธrrelsen pรฅ bildet for raskere beregninger av vektene og forbedre generalisering.

Under konvolusjonsdelen beholder nettverket de essensielle egenskapene til bildet og utelukker irrelevant stรธy. For eksempel lรฆrer modellen รฅ gjenkjenne en elefant fra et bilde med et fjell i bakgrunnen. Hvis du bruker et tradisjonelt nevralt nettverk, vil modellen tildele en vekt til alle pikslene, inkludert de fra fjellet som ikke er avgjรธrende og kan villede nettverket.

I stedet for a Keras et konvolusjonelt nevralt nettverk vil bruke en matematisk teknikk for รฅtracbare de mest relevante pikslene. Denne matematiske operasjonen kalles konvolusjon. Denne teknikken lar nettverket lรฆre stadig mer komplekse funksjoner pรฅ hvert lag. Konvolusjonen deler matrisen inn i smรฅ biter for รฅ lรฆre de viktigste elementene i hver del.

Komponenter i Convolutional Neural Network (ConvNet eller CNN)

Det er fire komponenter i et konvnett:

  1. Konvolusjon
  2. Ikke-linearitet (ReLU)
  3. Pooling eller Sub Sampling
  4. Klassifisering (fullt tilkoblet lag)

Konvolusjon

Hensikten med konvolusjonen er รฅ eks.tracgjenkjenne objektets egenskaper lokalt pรฅ bildet. Det betyr at nettverket vil lรฆre spesifikke mรธnstre i bildet og vil kunne gjenkjenne dem overalt i bildet.

Konvolusjon er en elementvis multiplikasjon. Konseptet er lett รฅ forstรฅ. Datamaskinen skanner en del av bildet, vanligvis med en dimensjon pรฅ 3 ร— 3, og multipliserer den med et filter. Resultatet av den elementvise multiplikasjonen kalles et funksjonskart. Dette trinnet gjentas til hele bildet er skannet. Merk at stรธrrelsen pรฅ bildet reduseres etter konvolusjonen.

Diagrammet nedenfor viser รฉn del av bildet som multipliseres med filteret for รฅ produsere รฉn celle i funksjonskartet.

Elementvis multiplikasjon av en 3 x 3 bildelapp med et filter som produserer รฉn verdi av funksjonskartet

Animasjonen nedenfor viser den samme konvolusjonen som gรฅr over hele bildet.

Animert filter som glir over et inngangsbilde og bygger funksjonskartet celle for celle

Det finnes en rekke filtre tilgjengelig. Nedenfor har vi listet opp noen av dem. Du kan se at hvert filter har et spesifikt formรฅl. Merk at kjernen pรฅ bildet nedenfor er et synonym for filteret.

Tabell over vanlige konvolusjonskjerner som kantdeteksjon, skjerping og uskarphet med de resulterende utdatabildene

Aritmetikk bak konvolusjonen

Konvolusjonsfasen vil bruke filteret pรฅ en liten gruppe piksler i bildet. Filteret vil bevege seg langs inngangsbildet med en generell form pรฅ 3ร—3 eller 5ร—5. Det betyr at nettverket vil skyve disse vinduene over hele inngangsbildet og beregne konvolusjonen. Animasjonen nedenfor viser hvordan konvolusjonen fungerer. Stรธrrelsen pรฅ lappen er 3ร—3, og utgangsmatrisen er resultatet av den elementvise operasjonen mellom bildematrisen og filteret.

Steg-for-steg-animasjon av et 3 x 3-filter som multipliserer bildeverdier og summerer dem inn i utdatamatrisen.

Du legger merke til at bredden og hรธyden pรฅ utgangen kan vรฆre forskjellig fra bredden og hรธyden pรฅ inngangen. Det skjer pรฅ grunn av grenseeffekten.

Grenseeffekt

Bildet har et 5ร—5-funksjonskart og et 3ร—3-filter. Det er bare ett vindu i midten der filteret kan skjerme et 3ร—3-rutenett. Funksjonskartet som vises krymper med to fliser pรฅ hver akse, slik at det blir en 3ร—3-dimensjon.

Et 5 x 5-funksjonskart redusert til et 3 x 3-utdata fordi 3 x 3-filteret ikke kan nรฅ grensene

For รฅ fรฅ samme utdatadimensjon som inndatadimensjonen, mรฅ du legge til padding. Padding bestรฅr av รฅ legge til riktig antall rader og kolonner pรฅ hver side av matrisen. Dette vil tillate at konvolusjonen sentrerer hver inndataflis. I bildet nedenfor har inndata- og utdatamatrisene samme dimensjon, 5ร—5.

En 5 x 5-inngang omgitt av en ring med nullpolstring, slik at konvolusjonen returnerer en 5 x 5-utgang

Nรฅr du definerer nettverket, styres de konvolverte funksjonene av tre parametere:

Dybde: Den definerer antall filtre som skal brukes under konvolusjonen. I det forrige eksemplet sรฅ du en dybde pรฅ 1, som betyr at bare ett filter brukes. I de fleste tilfeller er det mer enn ett filter. Animasjonen nedenfor viser operasjonene som utfรธres i en situasjon med tre filtre.

Tre separate filtre som konvolverer den samme inngangen og produserer tre stablede funksjonskart

Skritt: Den definerer antall ยซpikselhoppยป mellom to skiver. Hvis skrittet er lik 1, vil vinduet bevege seg med en pikselspredning pรฅ รฉn. Hvis skrittet er lik to, vil vinduet hoppe med 2 piksler. Hvis du รธker skrittet, vil du ha mindre funksjonskart. De to diagrammene nedenfor sammenligner et skritt pรฅ 1 med et skritt pรฅ 2.

Eksempel skritt 1

Filtervinduet beveger seg รฉn piksel om gangen over inndataraden med stridstyrke satt til 1

skritt 2

Hopp over filtervinduping to piksler mellom posisjoner med skrittlengde satt til 2, noe som gir en kortere utgang

Nullpolstring: Padding er en operasjon der man legger til et tilsvarende antall rader og kolonner pรฅ hver side av input-funksjonskartene. I dette tilfellet har utdataene samme dimensjon som input.

Ikke-linearitet (ReLU)

Pรฅ slutten av konvolusjonsoperasjonen er utgangen underlagt en aktiveringsfunksjon for รฅ tillate ikke-linearitet. Den vanlige aktiveringsfunksjonen for et konvolusjonsnett er ReLU. Alle piksler med en negativ verdi vil bli erstattet av null.

Pooling Operasjon

Dette trinnet er lett รฅ forstรฅ. Formรฅlet med poolingen er รฅ redusere dimensjonaliteten til inngangsbildet. Trinnene utfรธres for รฅ redusere operasjonens beregningsmessige kompleksitet. Ved รฅ redusere dimensjonaliteten har nettverket fรฆrre vekter รฅ beregne, slik at det forhindrer overtilpasning.

I dette stadiet mรฅ du definere stรธrrelsen og steglengden. En standard mรฅte รฅ samle inndatabildet pรฅ er รฅ bruke maksimumsverdien til funksjonskartet. Se pรฅ bildet nedenfor. Samlingen vil screene fire delmatriser av 4ร—4-funksjonskartet og returnere maksimumsverdien. Samlingen tar maksimumsverdien til en 2ร—2-matrise og flytter deretter dette vinduet med to piksler. For eksempel er den fรธrste delmatrisen [3,1,3,2], sรฅ samlingen vil returnere maksimumsverdien, som er 3.

Et 4 x 4-funksjonskart redusert til et 2 x 2-utdata ved maksimal pooling med et 2 x 2-vindu og skritt 2

Det er en annen sammenslรฅingsoperasjon som for eksempel gjennomsnittet.

Denne operasjonen reduserer stรธrrelsen pรฅ funksjonskartet betraktelig.

Fullt tilkoblede lag

Det siste trinnet bestรฅr i รฅ bygge en tradisjonell kunstig nevrale nettverk som du gjorde i forrige veiledning. Du kobler alle nevroner fra forrige lag til neste lag. Du bruker en softmax-aktiveringsfunksjon for รฅ klassifisere nummeret pรฅ inndatabildet.

Oppsummering:

Et TensorFlow-konvolusjonelt nevralt nettverk kompilerer forskjellige lag fรธr det foretar en prediksjon. Et nevralt nettverk har:

  • Et konvolusjonslag
  • ReLU aktiveringsfunksjon
  • Pooling lag
  • Tett forbundet lag

Konvolusjonslagene bruker forskjellige filtre pรฅ et delomrรฅde av bildet. ReLU-aktiveringsfunksjonen legger til ikke-linearitet, og samlingslagene reduserer dimensjonaliteten til funksjonskartene.

Alle disse lagene eks.tracviktig informasjon fra bildene. Til slutt mates funksjonskartene til et fullstendig tilkoblet lag med en softmax-funksjon for รฅ lage en prediksjon.

Tren CNN med TensorFlow

Nรฅ som du er kjent med byggesteinene i et convnet, er du klar til รฅ bygge et med tensorflow. Vi vil bruke MNIST-datasettet for CNN-bildeklassifisering.

Dataforberedelsen er den samme som den forrige opplรฆringen. Du kan kjรธre kodene og hoppe direkte til arkitekturen til CNN.

Du fรธlger trinnene nedenfor for bildeklassifisering ved รฅ bruke CNN:

  1. Trinn 1: Last opp datasett
  2. Trinn 2: Inndatalag
  3. Trinn 3: Konvolusjonslag
  4. Trinn 4: Pooling lag
  5. Trinn 5: Andre konvolusjonslag og Pooling Lag
  6. Trinn 6: Tett lag
  7. Trinn 7: Logit Layer

Versjonsmerknad: Listene nedenfor er rettet mot TensorFlow 1.x. I TensorFlow 2 finnes ikke lenger navnerommet tf.layers og tf.estimator.inputs.numpy_input_fn; ekvivalentene er tf.keras.layers.Conv2D, MaxPooling2D, Dense og Dropout satt sammen i en tf.keras.Model og trent med model.fit(). Les trinnene for mekanikken til hvert lag, og kartlegg dem deretter til Keras API.

Trinn 1: Last opp datasett

MNIST-datasettet er tilgjengelig via scikit-learn. Vennligst last det ned og lagre det i Nedlastinger. Du kan laste det opp med fetch_mldata('MNIST original').

Versjonsmerknad: mldata.org har stengt ned og fetch_mldata() ble fjernet i scikit-learn 0.22. Last inn de samme sifrene med fetch_openml i stedet bruker man fetch_openml('mnist_784', versjon=1). Resten av pipelinen er uendret.

Lag et tog/testsett

Du mรฅ dele datasettet med train_test_split.

Skaler funksjonene

Til slutt kan du skalere funksjonene med MinMaxScaler som vist i bildeklassifiseringen nedenfor ved hjelp av TensorFlow CNN-eksemplet.

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

Definer CNN

Et CNN bruker filtre pรฅ de rรฅ pikslene i et bilde for รฅ lรฆre detaljmรธnstre sammenlignet med de globale mรธnstrene som lรฆres av et tradisjonelt nevralt nettverk. For รฅ konstruere et CNN mรฅ du definere:

  1. Et konvolusjonslag: Bruk n antall filtre pรฅ funksjonskartet. Etter konvolusjonen mรฅ du bruke en ReLU-aktiveringsfunksjon for รฅ legge til ikke-linearitet i nettverket.
  2. Pooling-laget: Neste trinn etter konvolusjonen er รฅ nedsample funksjonskartet. Hensikten er รฅ redusere dimensjonaliteten til funksjonskartet for รฅ forhindre overtilpasning og forbedre beregningshastigheten. Maksimal pooling er den konvensjonelle teknikken, som deler funksjonskartene inn i underregioner (vanligvis med en 2ร—2-stรธrrelse) og bare beholder maksimumsverdiene.
  3. Fullt koblede lag: Alle nevroner fra de forrige lagene er koblet til de neste lagene. CNN vil klassifisere etiketten i henhold til funksjonene fra konvolusjonslagene og reduseres med sammenslรฅingslaget.

CNN arkitektur

  • Konvolusjonslag: Bruker 14 5ร—5-filtre (f.eks.trac(5ร—5-piksel underregioner), med ReLU-aktiveringsfunksjon
  • Pooling Lag: Utfรธrer maksimal pooling med et 2ร—2-filter og skritt pรฅ 2 (som spesifiserer at sammenslรฅtte omrรฅder ikke overlapper hverandre)
  • Convolutional Layer: Bruker 36 5ร—5-filtre, med ReLU-aktiveringsfunksjon
  • Pooling Layer #2: Igjen, utfรธrer maksimal pooling med et 2ร—2-filter og et skritt pรฅ 2
  • 1,764 0.4 nevroner, med frafallsregulariseringsrate pรฅ 0.4 (sannsynlighet pรฅ XNUMX for at et gitt element vil bli droppet under trening)
  • Tett lag (Logits-lag): 10 nevroner, en for hver siffermรฅlklasse (0โ€“9).

Det er tre viktige moduler รฅ bruke for รฅ lage en CNN:

  • conv2d(). Konstruerer et todimensjonalt konvolusjonslag med antall filtre, filterkjernestรธrrelse, utfylling og aktiveringsfunksjon som argumenter.
  • max_pooling2d(). Konstruerer et todimensjonalt sammenslรฅingslag ved hjelp av maks-pooling-algoritmen.
  • tett(). Konstruerer et tett lag med de skjulte lagene og enhetene

Du skal definere en funksjon for รฅ bygge CNN-en. La oss se nรฆrmere pรฅ hvordan du konstruerer hver byggekloss fรธr innpakning.ping alt sammen i funksjonen.

Trinn 2: Inndatalag

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

Du mรฅ definere en tensor med formen pรฅ dataene. Til det kan du bruke modulen tf.reshape. I denne modulen mรฅ du erklรฆre at tensoren skal omformes og formen pรฅ tensoren. Det fรธrste argumentet er egenskapene til dataene, som er definert i argumentet til funksjonen.

Et bilde har en hรธyde, en bredde og en kanal. MNIST-datasettet er et monokromt bilde med en stรธrrelse pรฅ 28ร—28. Vi setter batchstรธrrelsen til -1 i formargumentet slik at den tar formen til funksjonene["x"]. Fordelen er รฅ gjรธre batchstรธrrelsen til en hyperparameter som skal justeres. Hvis batchstรธrrelsen er satt til 7, vil tensoren mate 5,488 verdier (28*28*7).

Trinn 3: Konvolusjonslag

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

Det fรธrste konvolusjonslaget har 14 filtre med en kjernestรธrrelse pรฅ 5ร—5 og samme polstring. Samme polstring betyr at bรฅde utgangstensoren og inngangstensoren skal ha samme hรธyde og bredde. TensorFlow vil legge til nuller i radene og kolonnene for รฅ sikre samme stรธrrelse.

Du bruker ReLU-aktiveringsfunksjonen. Utdatastรธrrelsen vil vรฆre [28, 28, 14].

Trinn 4: Pooling lag

Det neste trinnet etter konvolusjonen er pooling-beregningen. Pooling-beregningen vil redusere dimensjonaliteten til dataene. Du kan bruke modulen max_pooling2d med en stรธrrelse pรฅ 2ร—2 og en stride pรฅ 2. Du bruker det forrige laget som input. Utdatastรธrrelsen vil vรฆre [batch_size, 14, 14, 14].

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

Trinn 5: Andre konvolusjonslag og Pooling Lag

Det andre konvolusjonslaget bruker 36 filtre, noe som gir en utdatastรธrrelse pรฅ [batch_size, 14, 14, 36]. Poolingslaget bruker det samme 2ร—2-vinduet og striden pรฅ 2 som fรธr, sรฅ det halverer hver romlige akse og utdataformen 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)

Trinn 6: Tett lag

Deretter mรฅ du definere det fullstendig tilkoblede laget. Funksjonskartet mรฅ flates ut fรธr det kobles til det tette laget. Du kan bruke modulen for omforming med en stรธrrelse pรฅ 7*7*36.

Det tette laget vil koble sammen 1,764 nevroner. Du legger til en ReLU-aktiveringsfunksjon. I tillegg legger du til et regulariseringsterm for frafall med en rate pรฅ 0.3, som betyr at 30 prosent av aktiveringene vil bli satt til 0. Merk at frafallet bare skjer i lรธpet av treningsfasen. Funksjonen cnn_model_fn har en argumentmodus for รฅ deklarere om modellen mรฅ trenes eller evalueres, som vist i eksemplet med CNN-bildeklassifiseringen TensorFlow nedenfor.

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)

Trinn 7: Logit Layer

Til slutt, i eksemplet med TensorFlow-bildeklassifisering, kan du definere det siste laget med modellens prediksjon. Utdataformen er lik batchstรธrrelsen og 10 er det totale antallet mรฅlklasser.

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

Du kan opprette en ordbok som inneholder klassene og sannsynligheten for hver klasse. Funksjonen tf.argmax() returnerer indeksen for den hรธyeste verdien i logits-laget. softmax-funksjonen returnerer sannsynligheten for hver klasse.

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

Du vil bare returnere prediksjonsordboken nรฅr modus er satt til prediksjon. Du legger til denne koden for รฅ vise prediksjonene.

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

Det neste trinnet bestรฅr i รฅ beregne tapet av modellen. I den siste veiledningen lรฆrte du at tapsfunksjonen for en flerklassemodell er kryssentropi. Tapet beregnes enkelt med fรธlgende kode:

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

Det siste trinnet i TensorFlow CNN-eksemplet er รฅ optimalisere modellen, det vil si รฅ finne de beste verdiene for vektene. Til det bruker du en gradient descent optimizer med en lรฆringsrate pรฅ 0.001. Mรฅlet er รฅ minimere tapet.

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

Du er ferdig med CNN. Du vil imidlertid vise ytelsesmรฅlingene i evalueringsmodus. Ytelsesmรฅlingen for en flerklassemodell er nรธyaktighet. TensorFlow er utstyrt med en nรธyaktighetsmodul som tar to argumenter, etikettene og de predikerte verdiene.

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 er det. Du opprettet ditt fรธrste CNN, og du er klar til รฅ pakke alt inn i en funksjon for รฅ bruke den til รฅ trene og evaluere 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)

Merknad om den monterte funksjonen: Den innpakkede versjonen ovenfor setter det fรธrste konvolusjonslaget til 32 filtre og dropout til 0.4, mens trinnvise snippets bruker 14 filtre og 0.3. Begge kjรธrer, men velg ett verdipar og hold det konsistent slik at de utskrevne figurene samsvarer med lagtabellen.

Trinnene nedenfor er de samme som de tidligere veiledningene.

Fรธrst og fremst definerer du en estimator med CNN-modellen for bildeklassifisering.

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

Et CNN tar lang tid รฅ trene, derfor oppretter du en loggingskrok for รฅ lagre verdiene til softmax-lagene hver 50. iterasjon.

# 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 er klar til รฅ estimere modellen. Du setter en batchstรธrrelse pรฅ 100 og blander dataene. Merk at vi setter treningstrinn pรฅ 16 000, noe som kan ta mye tid รฅ trene. Vรฆr tรฅlmodig.

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

Nรฅ som modellen er trent, kan du evaluere den og skrive ut resultatene.

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

Evalueringen skriver ut det gjenopprettede kontrollpunktet, trinnet det stoppet ved og den endelige metrikkordboken.

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 nรฅvรฆrende arkitekturen rapporterer evalueringsordboken en nรธyaktighet pรฅ 0.9689286, omtrent 97 %. Du kan endre arkitekturen, batchstรธrrelsen og antall iterasjoner for รฅ forbedre nรธyaktigheten. CNN har prestert langt bedre enn en kunstig nevrale nettverk eller logistisk regresjon: i veiledningen om kunstige nevrale nettverk hadde du en nรธyaktighet pรฅ 96 %, som er lavere enn CNN. Ytelsen til CNN er imponerende med et stรธrre bildesett, bรฅde nรฅr det gjelder beregningshastighet og nรธyaktighet.

Spรธrsmรฅl og svar

Gyldig polstring legger ikke til noe, sรฅ utdataene krymper og kantpiksler mater fรฆrre nevroner. Samme polstring omringer input med nuller, slik at utdataene beholder inputhรธyden og -bredden, som er det conv2d kaller i denne veiledningsforespรธrselen.

Ikke uendret. tf.layers og tf.estimator.inputs.numpy_input_fn ble fjernet. Gjenoppbygg den samme stakken med tf.keras.layers.Conv2D, MaxPooling2D, tetthet og frafall inni en tensorflow Keras-modellen, og tren den deretter med model.fit() i stedet for en estimator.

Automatiserte sรธkebiblioteker sjekker filterantall, kjernestรธrrelser, frafallsrater og lรฆringsrater parallelt, og rangerer deretter kjรธringer etter valideringsnรธyaktighet. De erstatter gjetting med mรฅlte sammenligninger, selv om et menneske fortsatt bestemmer beregningsbudsjettet og den viktige metrikken.

Ja. GitHub Copilot utkaster repeterende konvolusjon og pooling-stabler og input-pipelinen fra en kort kommentar. Sjekk utdataformene selv, siden forslag ofte blander fjernede TensorFlow 1 API-er med nรฅvรฆrende Keras-API-er.

Tilfeldige vendinger, rotasjoner, forskyvninger og zoominger skaper nye variasjoner av hvert treningsbilde, slik at nettverket ser et bredere spekter av eksempler og slutter รฅ huske individuelle bilder. Dette fungerer godt sammen med frafall og reduserer vanligvis gapet mellom trenings- og valideringsnรธyaktighet.

Lรธpet her bruker 16 000 skritt med en batchstรธrrelse pรฅ 100. Mesteparten av nรธyaktigheten kommer mye tidligere, sรฅ fรธlg med pรฅ evalueringsmรฅlingene og stopp nรฅr de platรฅer i stedet for รฅ vente ut full telling pรฅ en treg maskin.

mldata.org ble avsluttet, og hjelperen ble fjernet i scikit-learn 0.22. Bruk fetch_openml('mnist_784', version=1) i stedet. Den returnerer de samme 70 000 flate sifrene pรฅ 784 piksler, slik at skalerings- og delingstrinnene i denne veiledningen fortsetter รฅ fungere.

De leses som batch, hรธyde, bredde, kanaler. Sรฅ 14 x 14 er den romlige stรธrrelsen etter ett pooling-trinn pรฅ et 28 x 28 siffer, og 36 er antall filtre i det konvolusjonelle laget, ett funksjonskart per filter.

Oppsummer dette innlegget med: