CNN-billedklassificering i TensorFlow med trin og eksempler

โšก Smart opsummering

Konvolutionelle neurale netvรฆrk scanner et billede med smรฅ filtre i stedet for at vรฆgte hver pixel lige meget, hvilket er grunden til, at de dominerer computer vision. Denne gennemgang forklarer hvert lag og klassificerer derefter MNIST-cifre med TensorFlow.

  • ๐Ÿ”˜ Fire komponenter: Konvolution, ReLU-ikke-linearitet, pooling og en fuldt forbundet klassifikationslagsstak i hvert convnet.
  • โ˜‘๏ธ Konvolutionsmekanik: Et 3ร—3- eller 5ร—5-filter glider hen over billedet, og elementvis multiplikation opbygger funktionskortet.
  • โœ… Tre kontroller: Dybde angiver filterantallet, stride angiver springet mellem vinduer, og nul-padding bevarer outputdimensionen.
  • ๐Ÿงช Pooling-effekt: Maksimal pooling med et 2ร—2 vindue og 2 stridehalvdele pรฅ hver akse, hvilket reducerer vรฆgte og begrรฆnser overfitting.
  • ๐Ÿ› ๏ธ Syv byggetrin: Upload datasรฆttet, og definer derefter input, convolution, pooling, second convolution, dense og logits lag.
  • ๐Ÿ“ˆ Mรฅlt resultat: Den evaluerede estimator rapporterer en nรธjagtighed pรฅ 0.9689286 pรฅ MNIST, hvilket er foran de 96 %, der opnรฅs af et almindeligt neuralt netvรฆrk.

CNN-billedklassificering i TensorFlow

Hvad er Convolutional Neural Network?

Konvolutionelt neuralt netvรฆrk, ogsรฅ kendt som convnets eller CNN, er en velkendt metode inden for computer vision-applikationer. Det er en klasse af dybe neurale netvรฆrk, der bruges til at analysere visuelle billeder. Denne type arkitektur er dominerende til at genkende objekter fra et billede eller en video. Den bruges i applikationer som billed- eller videogenkendelse, behandling af naturligt sprog og anbefalingssystemer.

ArchiTecture of a Convolutional Neural Network

Tรฆnk pรฅ Facebook for et par รฅr siden, efter at du uploadede et billede til din profil, blev du bedt om at tilfรธje et navn til ansigtet pรฅ billedet manuelt. I dag bruger Facebook convnet til automatisk at tagge din ven pรฅ billedet.

Et konvolutionelt neuralt netvรฆrk til billedklassificering er ikke sรฆrlig svรฆrt at forstรฅ. Et inputbillede behandles under foldningsfasen og tildeles senere en etiket.

En typisk convnet-arkitektur kan opsummeres i billedet nedenfor. Fรธrst sendes et billede til netvรฆrket; dette kaldes inputbilledet. Derefter gennemgรฅr inputbilledet en rรฆkke trin; dette er den konvolutionelle del af netvรฆrket. Endelig kan det neurale netvรฆrk forudsige cifferet pรฅ billedet.

End-to-end convnet-arkitektur fra inputbilledet gennem foldningsfaserne til det forudsagte ciffer
ArchiTecture of a Convolutional Neural Network (CNN)

Et billede er sammensat af en rรฆkke pixels med hรธjde og bredde. Et grรฅtonebillede har kun รฉn kanal, mens farvebilledet har tre kanaler (hver for rรธd, grรธn og blรฅ). Kanalerne er stablet oven pรฅ hinanden. I denne vejledning bruger du et grรฅtonebillede med kun รฉn kanal. Hver pixel har en vรฆrdi fra 0 til 255 for at afspejle farvens intensitet. For eksempel vil en pixel lig med 0 vise en hvid farve, mens en pixel med en vรฆrdi tรฆt pรฅ 255 vil vรฆre mรธrkere.

Lad os se pรฅ et billede, der er gemt i MNIST datasรฆtBilledet nedenfor viser, hvordan billedet til venstre reprรฆsenteres i et matrixformat. Bemรฆrk, at den originale matrix er standardiseret til at vรฆre mellem 0 og 1. For mรธrkere farver er vรฆrdien i matrixen omkring 0.9, mens hvide pixels har en vรฆrdi pรฅ 0.

Hรฅndskrevet MNIST-ciffer vist ved siden af โ€‹โ€‹dets 28 x 28 pixel matrix med vรฆrdier standardiseret mellem 0 og 1

Konvolutionsdrift

Den mest kritiske komponent i modellen er det konvolutionelle lag. Denne del sigter mod at reducere billedets stรธrrelse for hurtigere beregninger af vรฆgtene og forbedre generaliseringen.

Under foldningsdelen bevarer netvรฆrket de vรฆsentlige funktioner i billedet og udelukker irrelevant stรธj. For eksempel lรฆrer modellen at genkende en elefant fra et billede med et bjerg i baggrunden. Hvis du bruger et traditionelt neuralt netvรฆrk, vil modellen tildele en vรฆgt til alle pixels, inklusive dem fra bjerget, som ikke er afgรธrende og kan vildlede netvรฆrket.

I stedet for a Keras et konvolutionelt neuralt netvรฆrk vil bruge en matematisk teknik til at illustreretrackun de mest relevante pixels. Denne matematiske operation kaldes konvolution. Denne teknik gรธr det muligt for netvรฆrket at lรฆre stadig mere komplekse funktioner pรฅ hvert lag. Konvolutionen opdeler matricen i smรฅ stykker for at lรฆre de mest essentielle elementer i hvert stykke.

Komponenter af Convolutional Neural Network (ConvNet eller CNN)

Der er fire komponenter i et convnet:

  1. foldning
  2. Ikke-linearitet (ReLU)
  3. Pooling eller Sub Sampling
  4. Klassifikation (fuldt forbundet lag)

foldning

Formรฅlet med konvolutionen er attracgenkende objektets funktioner lokalt pรฅ billedet. Det betyder, at netvรฆrket vil lรฆre specifikke mรธnstre i billedet og vil vรฆre i stand til at genkende dem overalt i billedet.

Konvolution er en elementvis multiplikation. Konceptet er let at forstรฅ. Computeren scanner en del af billedet, normalt med en dimension pรฅ 3ร—3, og multiplicerer den med et filter. Outputtet af den elementvise multiplikation kaldes et feature map. Dette trin gentages, indtil hele billedet er scannet. Bemรฆrk, at billedets stรธrrelse reduceres efter konvolutionen.

Diagrammet nedenfor viser et omrรฅde af billedet, der ganges med filteret for at producere en enkelt celle i objektkortet.

Elementvis multiplikation af en 3 x 3 billedpatch med et filter, der producerer รฉn vรฆrdi af featurekortet

Animationen nedenfor viser den samme foldning, der lรธber over hele billedet.

Animeret filter, der glider hen over et inputbillede og opbygger funktionskortet celle for celle

Der findes adskillige filtre. Nedenfor har vi listet nogle af dem. Du kan se, at hvert filter har et specifikt formรฅl. Bemรฆrk, at kernen pรฅ billedet nedenfor er et synonym for filteret.

Tabel over almindelige konvolutionskerner sรฅsom kantdetektion, skarphed og slรธring med deres resulterende outputbilleder

Aritmetik bag foldningen

Konvolutionsfasen vil anvende filteret pรฅ et lille array af pixels i billedet. Filteret vil bevรฆge sig langs inputbilledet med en generel form pรฅ 3ร—3 eller 5ร—5. Det betyder, at netvรฆrket vil skubbe disse vinduer hen over hele inputbilledet og beregne konvolutionen. Animationen nedenfor viser, hvordan konvolutionen fungerer. Stรธrrelsen af โ€‹โ€‹patchen er 3ร—3, og outputmatricen er resultatet af den elementvise operation mellem billedmatricen og filteret.

Trin-for-trin animation af et 3 x 3 filter, der multiplicerer billedvรฆrdier og summerer dem ind i outputmatricen.

Du bemรฆrker, at bredden og hรธjden af โ€‹โ€‹output kan vรฆre forskellig fra bredden og hรธjden af โ€‹โ€‹input. Det sker pรฅ grund af grรฆnseeffekten.

Grรฆnseeffekt

Billedet har et 5ร—5-funktionskort og et 3ร—3-filter. Der er kun รฉt vindue i midten, hvor filteret kan screene et 3ร—3-gitter. Funktionskortet pรฅ outputtet krymper med to felter pรฅ hver akse, hvilket efterlader en 3ร—3-dimension.

Et 5 x 5-funktionskort reduceret til et 3 x 3-output, fordi 3 x 3-filteret ikke kan nรฅ grรฆnserne

For at fรฅ den samme outputdimension som inputdimensionen skal du tilfรธje padding. Padding bestรฅr af at tilfรธje det rigtige antal rรฆkker og kolonner pรฅ hver side af matricen. Det vil tillade foldningen at centrere hver inputfelt. Pรฅ billedet nedenfor har input- og outputmatricerne den samme dimension, 5ร—5.

Et 5 x 5 input omgivet af en ring med nul padding, sรฅ konvolutionen returnerer et 5 x 5 output

Nรฅr du definerer netvรฆrket, styres de indviklede funktioner af tre parametre:

Dybde: Den definerer antallet af filtre, der skal anvendes under konvolutionen. I det foregรฅende eksempel sรฅ du en dybde pรฅ 1, hvilket betyder, at kun รฉt filter bruges. I de fleste tilfรฆlde er der mere end รฉt filter. Animationen nedenfor viser de operationer, der udfรธres i en situation med tre filtre.

Tre separate filtre, der konvolverer det samme input og producerer tre stablede funktionskort

Skridt: Den definerer antallet af "pixelspring" mellem to skiver. Hvis skridtlรฆngden er lig med 1, bevรฆger vinduet sig med en pixelspredning pรฅ รฉn. Hvis skridtlรฆngden er lig med to, hopper vinduet med 2 pixels. Hvis du รธger skridtlรฆngden, fรฅr du mindre featurekort. De to diagrammer nedenfor sammenligner et skridtlรฆngde pรฅ 1 med et skridtlรฆngde pรฅ 2.

Eksempel skridt 1

Filtervindue bevรฆger sig รฉn pixel ad gangen hen over inputrรฆkken med stride indstillet til 1

skridt 2

Spring filtervindue overping to pixels mellem positioner med skridtlรฆngde indstillet til 2, hvilket giver et kortere output

Nulpolstring: En padding er en operation, hvor man tilfรธjer et tilsvarende antal rรฆkker og kolonner pรฅ hver side af input-funktionskortene. I dette tilfรฆlde har outputtet samme dimension som inputtet.

Ikke-linearitet (ReLU)

Ved afslutningen af โ€‹โ€‹konvolutionsoperationen er outputtet underlagt en aktiveringsfunktion for at tillade ikke-linearitet. Den sรฆdvanlige aktiveringsfunktion for et konvolutionsnet er ReLU. Alle pixels med en negativ vรฆrdi vil blive erstattet af nul.

Pooling Operation

Dette trin er let at forstรฅ. Formรฅlet med poolingen er at reducere dimensionaliteten af โ€‹โ€‹inputbilledet. Trinnene udfรธres for at reducere operationens beregningsmรฆssige kompleksitet. Ved at mindske dimensionaliteten har netvรฆrket fรฆrre vรฆgte at beregne, hvilket forhindrer overfitting.

I denne fase skal du definere stรธrrelsen og skridtlรฆngden. En standardmรฅde at samle inputbilledet pรฅ er at bruge den maksimale vรฆrdi af featurekortet. Se pรฅ billedet nedenfor. Poolingen vil screene fire undermatricer af 4ร—4-featurekortet og returnere den maksimale vรฆrdi. Poolingen tager den maksimale vรฆrdi af et 2ร—2-array og flytter derefter dette vindue med to pixels. For eksempel er den fรธrste undermatrix [3,1,3,2], sรฅ poolingen vil returnere det maksimale, som er 3.

Et 4 x 4-funktionskort reduceret til et 2 x 2-output ved maksimal pooling med et 2 x 2-vindue og stride 2

Der er en anden pooling operation, sรฅsom middelvรฆrdien.

Denne operation reducerer stรธrrelsen pรฅ funktionskortet markant.

Fuldt forbundne lag

Det sidste trin bestรฅr i at bygge en traditionel kunstigt neuralt netvรฆrk som du gjorde i den forrige tutorial. Du forbinder alle neuroner fra det forrige lag til det nรฆste lag. Du bruger en softmax aktiveringsfunktion til at klassificere nummeret pรฅ inputbilledet.

resumรฉ:

Et TensorFlow-konvolutionelt neuralt netvรฆrk kompilerer forskellige lag, fรธr det foretager en forudsigelse. Et neuralt netvรฆrk har:

  • Et foldet lag
  • ReLU aktiveringsfunktion
  • Pooling lag
  • Tรฆt forbundet lag

De konvolutionelle lag anvender forskellige filtre pรฅ et delomrรฅde af billedet. ReLU-aktiveringsfunktionen tilfรธjer ikke-linearitet, og poolingslagene reducerer dimensionaliteten af โ€‹โ€‹โ€‹โ€‹featurekortene.

Alle disse lag eks.tracVigtig information fra billederne. Til sidst fรธres funktionskortene til et fuldt forbundet lag med en softmax-funktion for at lave en forudsigelse.

Trรฆn CNN med TensorFlow

Nu hvor du er bekendt med byggestenene i et convnet, er du klar til at bygge et med TensorFlow. Vi vil bruge MNIST-datasรฆttet til CNN-billedklassificering.

Dataforberedelsen er den samme som den forrige tutorial. Du kan kรธre koderne og hoppe direkte til CNN's arkitektur.

Du vil fรธlge nedenstรฅende trin for billedklassificering ved hjรฆlp af CNN:

  1. Trin 1: Upload datasรฆt
  2. Trin 2: Inputlag
  3. Trin 3: Konvolutionslag
  4. Trin 4: Pooling lag
  5. Trin 5: Andet foldningslag og Pooling lag
  6. Trin 6: Tรฆt lag
  7. Trin 7: Logit Layer

Versionsnotat: Listerne nedenfor er rettet mod TensorFlow 1.x. I TensorFlow 2 findes navnerummet tf.layers og tf.estimator.inputs.numpy_input_fn ikke lรฆngere; de โ€‹โ€‹tilsvarende er tf.keras.layers.Conv2D, MaxPooling2D, Dense og Dropout samlet i en tf.keras.Model og trรฆnet med model.fit(). Lรฆs trinnene for mekanikken i hvert lag, og kortlรฆg dem derefter til Keras API'en.

Trin 1: Upload datasรฆt

MNIST-datasรฆttet er tilgรฆngeligt via scikit-learn. Download det og gem det i Downloads. Du kan uploade det med fetch_mldata('MNIST original').

Versionsnotat: mldata.org er lukket ned, og fetch_mldata() blev fjernet i scikit-learn 0.22. Indlรฆs de samme cifre med i enhver nuvรฆrende installation. fetch_openml i stedet bruger man fetch_openml('mnist_784', version=1). Resten af โ€‹โ€‹pipelinen er uรฆndret.

Lav et tog/testsรฆt

Du skal opdele datasรฆttet med train_test_split.

Skaler funktionerne

Endelig kan du skalere funktionerne med MinMaxScaler som vist i nedenstรฅende billedklassificering ved hjรฆlp af 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 bruger filtre pรฅ de rรฅ pixels i et billede til at lรฆre detaljemรธnstre sammenlignet med de globale mรธnstre, der lรฆres af et traditionelt neuralt netvรฆrk. For at konstruere et CNN skal du definere:

  1. Et konvolutionelt lag: Anvend n antal filtre pรฅ featurekortet. Efter konvolutionen skal du bruge en ReLU-aktiveringsfunktion til at tilfรธje ikke-linearitet til netvรฆrket.
  2. Pooling-lag: Det nรฆste trin efter konvolutionen er at nedskalere featurekortet. Formรฅlet er at reducere dimensionaliteten af โ€‹โ€‹featurekortet for at forhindre overfitting og forbedre beregningshastigheden. Maksimal pooling er den konventionelle teknik, der opdeler featurekortene i underregioner (normalt med en stรธrrelse pรฅ 2ร—2) og kun beholder de maksimale vรฆrdier.
  3. Fuldt forbundne lag: Alle neuroner fra de foregรฅende lag er forbundet til de nรฆste lag. CNN vil klassificere etiketten i henhold til funktionerne fra foldningslagene og reduceret med poolinglaget.

CNN arkitektur

  • Konvolutionelt lag: Anvender 14 5ร—5 filtre (f.eks.trac5ร—5-pixel underregioner), med ReLU-aktiveringsfunktion
  • Pooling Layer: Udfรธrer maksimal pooling med et 2ร—2 filter og skridt pรฅ 2 (hvilket specificerer, at poolede omrรฅder ikke overlapper)
  • Convolutional Layer: Anvender 36 5ร—5 filtre, med ReLU aktiveringsfunktion
  • Pooling Layer #2: Igen, udfรธrer maksimal pooling med et 2ร—2 filter og et skridt pรฅ 2
  • 1,764 neuroner med frafaldsregulariseringsrate pรฅ 0.4 (sandsynlighed pรฅ 0.4 for, at et givet element vil blive droppet under trรฆning)
  • Tรฆt lag (Logits-lag): 10 neuroner, en for hver ciffermรฅlklasse (0โ€“9).

Der er tre vigtige moduler, der skal bruges til at oprette et CNN:

  • conv2d(). Konstruerer et todimensionelt foldningslag med antallet af filtre, filterkernestรธrrelse, udfyldning og aktiveringsfunktion som argumenter.
  • max_pooling2d(). Konstruerer et todimensionalt poolinglag ved hjรฆlp af max-pooling-algoritmen.
  • tรฆt(). Konstruerer et tรฆt lag med de skjulte lag og enheder

Du skal definere en funktion til at bygge CNN'en. Lad os se nรฆrmere pรฅ, hvordan man konstruerer hver byggesten fรธr indpakning.ping alt sammen i funktionen.

Trin 2: Inputlag

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

Du skal definere en tensor med formen af โ€‹โ€‹dataene. Til det kan du bruge modulet tf.reshape. I dette modul skal du erklรฆre, at tensoren skal omformes, og formen pรฅ tensoren. Det fรธrste argument er funktionerne i dataene, som er defineret i argumentet for funktionen.

Et billede har en hรธjde, en bredde og en kanal. MNIST-datasรฆttet er et monokromt billede med en stรธrrelse pรฅ 28ร—28. Vi sรฆtter batchstรธrrelsen til -1 i formargumentet, sรฅ det tager formen af โ€‹โ€‹features["x"]. Fordelen er at gรธre batchstรธrrelsen til en hyperparameter, der skal justeres. Hvis batchstรธrrelsen er indstillet til 7, vil tensoren fรธde 5,488 vรฆrdier (28*28*7).

Trin 3: Konvolutionslag

# 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 konvolutionelle lag har 14 filtre med en kernestรธrrelse pรฅ 5ร—5 med samme padding. Den samme padding betyder, at bรฅde outputtensoren og inputtensoren skal have samme hรธjde og bredde. TensorFlow tilfรธjer nuller til rรฆkkerne og kolonnerne for at sikre samme stรธrrelse.

Du bruger ReLU-aktiveringsfunktionen. Outputstรธrrelsen vil vรฆre [28, 28, 14].

Trin 4: Pooling lag

Det nรฆste trin efter konvolutionen er pooling-beregningen. Pooling-beregningen vil reducere dataenes dimensionalitet. Du kan bruge modulet max_pooling2d med en stรธrrelse pรฅ 2ร—2 og en stride pรฅ 2. Du bruger det foregรฅende lag som input. Outputstรธ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)

Trin 5: Andet foldningslag og Pooling lag

Det andet konvolutionelle lag anvender 36 filtre, hvilket giver en outputstรธrrelse pรฅ [batch_size, 14, 14, 36]. Poolinglaget bruger det samme 2ร—2-vindue og stride pรฅ 2 som fรธr, sรฅ det halverer hver rumlig akse, og outputformen bliver [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)

Trin 6: Tรฆt lag

Derefter skal du definere det fuldt forbundne lag. Featurekortet skal udjรฆvnes, fรธr det forbindes med det tรฆtte lag. Du kan bruge modulet til at omforme med en stรธrrelse pรฅ 7*7*36.

Det tรฆtte lag vil forbinde 1,764 neuroner. Du tilfรธjer en ReLU-aktiveringsfunktion. Derudover tilfรธjer du et regulariseringsterm for frafald med en rate pรฅ 0.3, hvilket betyder, at 30 procent af aktiveringerne vil blive sat til 0. Bemรฆrk, at frafaldet kun finder sted under trรฆningsfasen. Funktionen cnn_model_fn har en argumenttilstand til at deklarere, om modellen skal trรฆnes eller evalueres, som vist i nedenstรฅende eksempel pรฅ CNN-billedklassificering med TensorFlow.

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)

Trin 7: Logit Layer

Endelig kan du i eksemplet med TensorFlow-billedklassificeringen definere det sidste lag med modellens forudsigelse. Outputformen er lig med batchstรธrrelsen, og 10 er det samlede antal mรฅlklasser.

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

Du kan oprette en ordbog, der indeholder klasserne og sandsynligheden for hver klasse. Funktionen tf.argmax() returnerer indekset for den hรธjeste vรฆrdi i logits-laget. Softmax-funktionen returnerer sandsynligheden for hver klasse.

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

Du รธnsker kun at returnere prรฆdiktionsordbogen, nรฅr tilstanden er indstillet til prรฆdiktion. Du tilfรธjer denne kode for at vise forudsigelserne.

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

Det nรฆste trin bestรฅr i at beregne modellens tab. I den sidste vejledning lรฆrte du, at tabsfunktionen for en multiklassemodel er krydsentropi. Tabet beregnes nemt med fรธlgende kode:

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

Det sidste trin i TensorFlow CNN-eksemplet er at optimere modellen, det vil sige at finde de bedste vรฆrdier for vรฆgtene. Til det bruger du en gradient descent optimizer med en lรฆringsrate pรฅ 0.001. Mรฅlet er at minimere tabet.

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

Du er fรฆrdig med CNN. Du vil dog gerne vise prรฆstationsmรฅlingerne under evalueringstilstanden. Prรฆstationsmรฅlingerne for en multiklassemodel er nรธjagtighed. TensorFlow er udstyret med et nรธjagtighedsmodul, der tager to argumenter, etiketterne og de forudsagte vรฆrdier.

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 oprettede dit fรธrste CNN, og du er klar til at pakke alt ind i en funktion for at bruge den til at trรฆne 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)

Bemรฆrkning om den samlede funktion: Den indpakkede version ovenfor sรฆtter det fรธrste foldningslag til 32 filtre og dropout til 0.4, mens de trinvise snippets bruger 14 filtre og 0.3. Begge kรธrer, men vรฆlg รฉt par vรฆrdier og hold det konsistent, sรฅ de udskrevne former matcher lagtabellen.

Trinene nedenfor er de samme som de tidligere selvstudier.

Fรธrst og fremmest definerer du en estimator med CNN-modellen til billedklassificering.

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

Et CNN tager lang tid at trรฆne, derfor opretter du en logging hook til at gemme vรฆrdierne for softmax-lagene hver 50 iterationer.

# 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 at estimere modellen. Du angiver en batchstรธrrelse pรฅ 100 og blander dataene. Bemรฆrk, at vi har angivet trรฆningstrin pรฅ 16,000, hvilket kan tage lang tid at trรฆne. 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])

Nu hvor modellen er trรฆnet, kan du evaluere den og udskrive resultaterne.

# 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 udskriver det gendannede kontrolpunkt, det trin, det stoppede ved, og den endelige metrikordbog.

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 nuvรฆrende arkitektur rapporterer evalueringsordbogen en nรธjagtighed pรฅ 0.9689286, hvilket er cirka 97 %. Du kan รฆndre arkitekturen, batchstรธrrelsen og antallet af iterationer for at forbedre nรธjagtigheden. CNN har klaret sig langt bedre end en ... kunstigt neuralt netvรฆrk eller logistisk regression: i vejledningen om kunstige neurale netvรฆrk havde du en nรธjagtighed pรฅ 96%, hvilket er lavere end CNN's. CNN's ydeevne er imponerende med et stรธrre billedsรฆt, bรฅde med hensyn til beregningshastighed og nรธjagtighed.

Ofte Stillede Spรธrgsmรฅl

Gyldig padding tilfรธjer ingenting, sรฅ outputtet krymper, og kantpixels fodrer fรฆrre neuroner. Samme padding omringer inputtet med nuller, sรฅ outputtet beholder inputtets hรธjde og bredde, hvilket er det, conv2d kalder i denne tutorial-anmodning.

Ikke uรฆndret. tf.layers og tf.estimator.inputs.numpy_input_fn blev fjernet. Genopbyg den samme stak med tf.keras.layers.Conv2D, Max.Pooling2D, tรฆthed og dropout indeni en TensorFlow Keras-modellen, og trรฆn den derefter med model.fit() i stedet for en estimator.

Automatiserede sรธgebiblioteker scanner filterantal, kernestรธrrelser, frafaldsrater og lรฆringsrater parallelt og rangerer derefter kรธrsler efter valideringsnรธjagtighed. De erstatter gรฆtvรฆrk med mรฅlte sammenligninger, selvom et menneske stadig bestemmer beregningsbudgettet og den metrik, der betyder noget.

Ja. GitHub Copilot laver udkast til gentagne konvolutions- og pooling-stakke samt input-pipelinen fra en kort kommentar. Tjek selv outputformerne, da forslag ofte blander fjernede TensorFlow 1 API'er med nuvรฆrende Keras-API'er.

Tilfรฆldige vendinger, rotationer, forskydninger og zoom skaber nye variationer af hvert trรฆningsbillede, sรฅ netvรฆrket ser et bredere udvalg af eksempler og stopper med at huske individuelle billeder. Det fungerer godt sammen med frafald og mindsker normalt forskellen mellem trรฆnings- og valideringsnรธjagtighed.

Lรธbet her bruger 16,000 skridt med en batchstรธrrelse pรฅ 100. Det meste af nรธjagtigheden kommer langt tidligere, sรฅ hold รธje med evalueringsmรฅlingerne og stop, nรฅr de nรฅr et plateau, i stedet for at vente pรฅ, at den fulde optรฆlling er nรฅet pรฅ en langsom maskine.

mldata.org lukkede ned, og hjรฆlperen blev fjernet i scikit-learn 0.22. Brug i stedet fetch_openml('mnist_784', version=1). Den returnerer de samme 70,000 fladede 784-pixel cifre, sรฅ skalerings- og opdelingstrinnene i denne vejledning fortsรฆtter med at virke.

De lรฆses som batch, hรธjde, bredde, kanaler. Sรฅ 14 gange 14 er den rumlige stรธrrelse efter et pooling-trin pรฅ et 28 gange 28 ciffer, og 36 er antallet af filtre i det konvolutionelle lag, รฉt feature map pr. filter.

Opsummer dette indlรฆg med: