CNN-billedklassificering i TensorFlow med trin og eksempler

Hvad er Convolutional Neural Network?

Konvolutionelt neuralt netvรฆrk, ogsรฅ kendt som convnets eller CNN, er en velkendt metode i computervisionsapplikationer. 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. Det bruges i applikationer som billed- eller videogenkendelse, neural sprogbehandling osv.

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 pรฅ billedet nedenfor. Fรธrst og fremmest skubbes et billede til netvรฆrket; dette kaldes inputbilledet. Derefter gennemgรฅr inputbilledet et uendeligt antal trin; dette er den konvolutionerende del af netvรฆrket. Endelig kan det neurale netvรฆrk forudsige cifferet pรฅ billedet.

ArchiTecture of a Convolutional Neural Network (CNN)
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รฅ). En kanal er stablet over hinanden. I denne vejledning vil du bruge 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 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รฆt. Billedet nedenfor viser, hvordan man reprรฆsenterer billedet af venstre i et matrixformat. Bemรฆrk, at den oprindelige matrix er blevet 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.

Konvolutionelt neuralt netvรฆrk

Konvolutionsdrift

Den mest kritiske komponent i modellen er foldningslaget. Denne del sigter mod at reducere stรธrrelsen af โ€‹โ€‹billedet for hurtigere beregninger af vรฆgtene og forbedre dets generalisering.

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 foldende neurale netvรฆrk vil bruge en matematisk teknik til kun at udtrรฆkke de mest relevante pixels. Denne matematiske operation kaldes foldning. Denne teknik gรธr det muligt for netvรฆrket at lรฆre mere og mere komplekse funktioner pรฅ hvert lag. Konvolutionen opdeler matrixen i smรฅ stykker for at lรฆre de vigtigste elementer i hvert stykke.

Komponenter af Convolutional Neural Network (ConvNet eller CNN)

Der er fire komponenter i en Convnets

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

foldning

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

Konvolution er en elementmรฆssig multiplikation. Konceptet er let at forstรฅ. Computeren scanner en del af billedet, normalt med en dimension pรฅ 3ร—3 og multiplicerer det til et filter. Outputtet af den elementvise multiplikation kaldes et funktionskort. Dette trin gentages, indtil hele billedet er scannet. Bemรฆrk, at efter foldningen reduceres stรธrrelsen af โ€‹โ€‹billedet.

foldning

Nedenfor er der en URL for at se i aktion, hvordan foldning fungerer.

foldning

Der er mange tilgรฆngelige kanaler. Nedenfor har vi listet nogle af kanalerne. Du kan se, at hvert filter har et bestemt formรฅl. Bemรฆrk, pรฅ billedet nedenfor; Kernen er et synonym for filteret.

foldning

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 glide disse vinduer hen over hele inputbilledet og beregne foldningen. Billedet nedenfor viser, hvordan foldningen fungerer. Stรธrrelsen pรฅ patchen er 3ร—3, og outputmatrixen er resultatet af den elementmรฆssige operation mellem billedmatrixen og filteret.

Aritmetik bag Convolution

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 afskรฆrme et 3ร—3 gitter. Udgangsfunktionskortet vil krympe med to fliser sammen med en 3ร—3 dimension.

Grรฆnseeffekt

For at fรฅ samme outputdimension som inputdimensionen skal du tilfรธje polstring. Padding bestรฅr i at tilfรธje det rigtige antal rรฆkker og kolonner pรฅ hver side af matrixen. Det vil tillade foldningen at centrere passer til hver inputflise. Pรฅ billedet nedenfor har input/output matrixen samme dimension 5ร—5

Grรฆnseeffekt

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

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

Grรฆnseeffekt

  1. stride: Den definerer antallet af "pixelspring" mellem to udsnit. Hvis skridtet er lig med 1, vil vinduerne bevรฆge sig med en pixels spredning pรฅ รฉn. Hvis skridtet er lig med to, vil vinduerne hoppe med 2 pixels. Hvis du รธger skridtet, vil du have mindre feature maps.

Eksempel skridt 1

Eksempel pรฅ Stride

skridt 2

Eksempel pรฅ Stride

  1. Nul-polstring: En udfyldning er en operation, hvor man tilfรธjer et tilsvarende antal rรฆkker og kolonner pรฅ hver side af inputfunktionskortene. I dette tilfรฆlde har output samme dimension som input.

Ikke-linearitet (ReLU)

Ved afslutningen af โ€‹โ€‹foldningsoperationen er outputtet underlagt en aktiveringsfunktion for at tillade ikke-linearitet. Den sรฆdvanlige aktiveringsfunktion for convnet er Relu. Alle pixel med en negativ vรฆrdi vil blive erstattet af nul.

Pooling Operation

Dette trin er let at forstรฅ. Formรฅlet med sammenlรฆgningen er at reducere dimensionaliteten af โ€‹โ€‹inputbilledet. Trinene er udfรธrt for at reducere den beregningsmรฆssige kompleksitet af operationen. Ved at formindske dimensionaliteten har netvรฆrket lavere vรฆgte at beregne, sรฅ det forhindrer overfitting.

I denne fase skal du definere stรธrrelsen og skridtet. En standard mรฅde at samle inputbilledet pรฅ er at bruge den maksimale vรฆrdi af featurekortet. Se pรฅ billedet nedenfor. "Pulning" vil screene en fire undermatrix af 4ร—4 feature map og returnere den maksimale vรฆrdi. Puljen 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], sammenlรฆgningen vil returnere maksimum, som er 3.

Pooling Operation

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

Denne handling reducerer aggressivt stรธrrelsen af โ€‹โ€‹featurekortet

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รฉ:

TensorFlow Convolutional Neural netvรฆrk kompilerer forskellige lag, fรธr de foretager en forudsigelse. Et neuralt netvรฆrk har:

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

De foldede lag anvender forskellige filtre pรฅ en underregion af billedet. Relu-aktiveringsfunktionen tilfรธjer ikke-linearitet, og poolinglagene reducerer dimensionaliteten af โ€‹โ€‹funktionskortene.

Alle disse lag udtrรฆkker vรฆsentlig information fra billederne. Til sidst fรธres funktionerne til et primรฆrt fuldt forbundet lag med en softmax-funktion til at lave en forudsigelse.

Trรฆn CNN med TensorFlow

Nu hvor du er bekendt med byggestenen i en convnets, er du klar til at bygge en 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:

Trin 1: Upload datasรฆt

Trin 2: Inputlag

Trin 3: Konvolutionslag

Trin 4: Pooling lag

Trin 5: Andet foldningslag og Pooling lag

Trin 6: Tรฆt lag

Trin 7: Logit Layer

Trin 1: Upload datasรฆt

MNIST-datasรฆttet er tilgรฆngeligt med scikit for at lรฆre dette URL. Download det og gem det i Downloads. Du kan uploade det med fetch_mldata('MNIST original').

Lav et tog/testsรฆt

Du skal opdele datasรฆttet med train_test_split

Skaler funktionerne

Endelig kan du skalere funktionen 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

En CNN bruger filtre pรฅ den rรฅ pixel af et billede for at lรฆre detaljerede mรธnstre sammenlignet med globale mรธnstre med et traditionelt neuralt net. For at konstruere et CNN skal du definere:

  1. Et foldningslag: Anvend n antal filtre pรฅ featurekortet. Efter foldningen skal du bruge en Relu-aktiveringsfunktion for at tilfรธje ikke-linearitet til netvรฆrket.
  2. Pooling-lag: Det nรฆste trin efter foldningen er at nedsample funktionen max. Formรฅlet er at reducere dimensionaliteten af โ€‹โ€‹funktionskortet for at forhindre overtilpasning og forbedre beregningshastigheden. Max pooling er den konventionelle teknik, som opdeler feature maps i underregioner (normalt med en 2ร—2 stรธrrelse) 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 (udtrรฆkker 5ร—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 vil definere en funktion til at bygge CNN. Lad os se i detaljer, hvordan man konstruerer hver byggeklods, fรธr vi pakker 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 monokront billede med en stรธrrelse pรฅ 28ร—28. Vi sรฆtter batchstรธrrelsen til -1 i formargumentet, sรฅ det tager formen af โ€‹โ€‹funktionerne[โ€œxโ€]. Fordelen er at fรฅ batchstรธrrelseshyperparametrene til at tune. 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 foldningslag har 14 filtre med en kernestรธrrelse pรฅ 5ร—5 med samme polstring. Den samme polstring 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 foldningen er pooling-beregningen. Pooling-beregningen vil reducere dimensionaliteten af โ€‹โ€‹dataene. Du kan bruge modulet max_pooling2d med en stรธrrelse pรฅ 2ร—2 og stride pรฅ 2. Du bruger det forrige 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 foldningslag har 32 filtre med en outputstรธrrelse pรฅ [batch_size, 14, 14, 32]. Poolinglaget har samme stรธrrelse som fรธr, og outputformen er [batch_size, 14, 14, 18].

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. Funktionskortet skal vรฆre fladt, fรธr det kan forbindes med det tรฆtte lag. Du kan bruge modulet omformning med en stรธrrelse pรฅ 7*7*36.

Det tรฆtte lag vil forbinde 1764 neuroner. Du tilfรธjer en Relu-aktiveringsfunktion. Desuden tilfรธjer du en frafaldsregulariseringsterm med en rate pรฅ 0.3, hvilket betyder, at 30 procent af vรฆgtene vil blive sat til 0. Bemรฆrk, at frafaldet kun finder sted i trรฆningsfasen. Funktionen cnn_model_fn har en argumenttilstand til at erklรฆre, om modellen skal trรฆnes eller til at evaluere som vist i nedenstรฅende CNN-billedklassificering TensorFlow-eksempel.

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

Til sidst i TensorFlow-billedklassificeringseksemplet kan du definere det sidste lag med modellens forudsigelse. Outputformen er lig med batchstรธrrelsen og 10, det samlede antal billeder.

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

Du kan oprette en ordbog, der indeholder klasserne og sandsynligheden for hver klasse. Modulet tf.argmax() with returnerer den hรธjeste vรฆrdi, hvis logit-lagene. Funktionen softmax 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 ordbogsforudsigelsen, nรฅr tilstanden er indstillet til forudsigelse. Du tilfรธjer disse koder 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 tabet af modellen. I den sidste tutorial 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 af vรฆgtene. Til det bruger du en Gradient descent optimizer med en indlรฆringshastighed 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. Ydeevnemรฅlingerne for en multiklassemodel er nรธjagtighedsmรฅlingerne. Tensorflow er udstyret med en modulnรธjagtighed med 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)

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

En CNN tager mange gange at trรฆne, derfor opretter du en Logging-hook til at gemme vรฆrdierne af softmax-lagene hver 50. 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 er klar til at estimere modellen. Du indstiller en batchstรธrrelse pรฅ 100 og blander dataene. Bemรฆrk at vi sรฆtter trรฆningstrin pรฅ 16.000, det kan tage meget 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 i gang, 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)
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 fรฅr du en nรธjagtighed pรฅ 97%. Du kan รฆndre arkitekturen, batchstรธrrelsen og antallet af iterationer for at forbedre nรธjagtigheden. CNNs neurale netvรฆrk har klaret sig langt bedre end ANN eller logistisk regression. I selvstudiet om kunstigt neuralt netvรฆrk havde du en nรธjagtighed pรฅ 96%, hvilket er lavere CNN. Prรฆstationerne fra CNN er imponerende med et stรธrre billede sรฆt, bรฅde hvad angรฅr hastighedsberegning og nรธjagtighed.

Resumรฉ

Et foldet neuralt netvรฆrk fungerer meget godt til at evaluere billede. Denne type arkitektur er dominerende til at genkende objekter fra et billede eller en video.

For at bygge en TensorFlow CNN skal du fรธlge syv trin:

Trin 1: Upload datasรฆt:

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

Trin 2: Input lag:

Dette trin omformer dataene. Formen er lig med kvadratroden af โ€‹โ€‹antallet af pixels. For eksempel, hvis et billede har 156 pixels, er formen 26ร—26. Du skal angive, om billedet har farve eller ej. Hvis ja, sรฅ havde du 3 til formen- 3 for RGB-, ellers 1.

input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

Trin 3: Konvolutionerende lag

Dernรฆst skal du oprette de foldede lag. Du anvender forskellige filtre for at tillade netvรฆrket at lรฆre vigtige funktioner. Du angiver stรธrrelsen pรฅ kernen og mรฆngden af โ€‹โ€‹filtre.

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

Trin 4: Pooling lag

I det tredje trin tilfรธjer du et pooling-lag. Dette lag reducerer stรธrrelsen af โ€‹โ€‹input. Det gรธr det ved at tage den maksimale vรฆrdi af en undermatrix. For eksempel, hvis undermatrixen er [3,1,3,2], vil poolingen returnere maksimum, som er 3.

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

Trin 5: Tilfรธj Convolutional Layer og Pooling lag

I dette trin kan du tilfรธje sรฅ meget som du รธnsker konv-lag og pooling-lag. Google bruger arkitektur med mere end 20 konv. lag.

Trin 6: Tรฆt lag

Trin 6 flad det forrige ud for at skabe et fuldt forbundet lag. I dette trin kan du bruge forskellige aktiveringsfunktioner og tilfรธje en frafaldseffekt.

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

Det sidste trin er forudsigelsen.

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

Opsummer dette indlรฆg med: