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.
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.

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.
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:
- foldning
- Ikke-linearitet (ReLU)
- Pooling eller Sub Sampling
- 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.
Animationen nedenfor viser den samme foldning, der lรธber over hele billedet.
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.
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.
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.
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.
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.
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
skridt 2
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.
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:
- 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
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:
- 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.
- 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.
- 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.











