CNN-bildklassificering i TensorFlow med steg och exempel
โก Smart sammanfattning
Konvolutionella neurala nรคtverk skannar en bild med smรฅ filter istรคllet fรถr att vikta varje pixel lika, vilket รคr anledningen till att de dominerar datorseende. Denna genomgรฅng fรถrklarar varje lager och klassificerar sedan MNIST-siffror med TensorFlow.
Vad รคr Convolutional Neural Network?
Konvolutionellt neuralt nรคtverk, รคven kรคnt som convnets eller CNN, รคr en vรคlkรคnd metod inom datorseendetillรคmpningar. Det รคr en klass av djupa neurala nรคtverk som anvรคnds fรถr att analysera visuella bilder. Denna typ av arkitektur รคr dominerande fรถr att kรคnna igen objekt frรฅn en bild eller video. Den anvรคnds i tillรคmpningar som bild- eller videoigenkรคnning, naturlig sprรฅkbehandling och rekommendationssystem.
ArchiTecture of a Convolutional Neural Network
Tรคnk pรฅ Facebook fรถr nรฅgra รฅr sedan, efter att du laddat upp en bild till din profil blev du ombedd att lรคgga till ett namn till ansiktet pรฅ bilden manuellt. Nufรถrtiden anvรคnder Facebook convnet fรถr att tagga din vรคn i bilden automatiskt.
Ett konvolutionellt neuralt nรคtverk fรถr bildklassificering รคr inte sรคrskilt svรฅrt att fรถrstรฅ. En ingรฅngsbild bearbetas under faltningsfasen och tilldelas senare en etikett.
En typisk convnet-arkitektur kan sammanfattas i bilden nedan. Fรถrst skickas en bild till nรคtverket; detta kallas inmatningsbilden. Sedan gรฅr inmatningsbilden igenom en serie steg; detta รคr den faltningsmรคssiga delen av nรคtverket. Slutligen kan det neurala nรคtverket fรถrutsรคga siffran pรฅ bilden.

En bild bestรฅr av en matris med pixlar med hรถjd och bredd. En grรฅskalig bild har bara en kanal medan fรคrgbilden har tre kanaler (var och en fรถr rรถd, grรถn och blรฅ). Kanalerna รคr staplade ovanpรฅ varandra. I den hรคr handledningen kommer du att anvรคnda en grรฅskalig bild med bara en kanal. Varje pixel har ett vรคrde frรฅn 0 till 255 fรถr att รฅterspegla fรคrgens intensitet. Till exempel kommer en pixel lika med 0 att visa en vit fรคrg medan en pixel med ett vรคrde nรคra 255 kommer att vara mรถrkare.
Lรฅt oss ta en titt pรฅ en bild lagrad i MNIST-datauppsรคttningBilden nedan visar hur man representerar bilden till vรคnster i ett matrisformat. Observera att den ursprungliga matrisen har standardiserats till att vara mellan 0 och 1. Fรถr mรถrkare fรคrger รคr vรคrdet i matrisen cirka 0.9 medan vita pixlar har ett vรคrde pรฅ 0.
Konvolutionell drift
Den viktigaste komponenten i modellen รคr faltningsskiktet. Denna del syftar till att minska bildens storlek fรถr snabbare berรคkningar av vikterna och fรถrbรคttra generaliseringen.
Under faltningsdelen behรฅller nรคtverket de vรคsentliga egenskaperna i bilden och utesluter irrelevant brus. Modellen lรคr sig till exempel att kรคnna igen en elefant frรฅn en bild med ett berg i bakgrunden. Om du anvรคnder ett traditionellt neuralt nรคtverk kommer modellen att tilldela alla pixlar en vikt, inklusive de frรฅn berget, vilket inte รคr nรถdvรคndigt och kan vilseleda nรคtverket.
Istรคllet a Keras ett faltningsneuralt nรคtverk kommer att anvรคnda en matematisk teknik fรถr att extracbara de mest relevanta pixlarna. Denna matematiska operation kallas faltning. Denna teknik gรถr det mรถjligt fรถr nรคtverket att lรคra sig alltmer komplexa funktioner i varje lager. Faltningen delar upp matrisen i smรฅ bitar fรถr att lรคra sig de viktigaste elementen i varje del.
Komponenter i Convolutional Neural Network (ConvNet eller CNN)
Det finns fyra komponenter i ett convnet:
- Faltning
- Icke linjรคritet (ReLU)
- Pooling eller Subsampling
- Klassificering (Fullstรคndigt anslutet lager)
Faltning
Syftet med konvolutionen รคr att extracobjektets egenskaper lokalt pรฅ bilden. Det betyder att nรคtverket kommer att lรคra sig specifika mรถnster i bilden och kommer att kunna kรคnna igen dem รถverallt i bilden.
Konvolution รคr en elementvis multiplikation. Konceptet รคr lรคtt att fรถrstรฅ. Datorn skannar en del av bilden, vanligtvis med en dimension pรฅ 3ร3, och multiplicerar den med ett filter. Utdata frรฅn den elementvisa multiplikationen kallas en feature map (funktionskarta). Detta steg upprepas tills hela bilden รคr skannad. Observera att bildens storlek minskas efter konvolutionen.
Diagrammet nedan visar en del av bilden som multipliceras med filtret fรถr att producera en enda cell i objektkartan.
Animationen nedan visar samma faltning som lรถper รถver hela bilden.
Det finns mรฅnga filter tillgรคngliga. Nedan listar vi nรฅgra av dem. Du kan se att varje filter har ett specifikt syfte. Observera att kรคrnan i bilden nedan รคr en synonym till filtret.
Aritmetik bakom faltningen
Faltningsfasen applicerar filtret pรฅ en liten uppsรคttning pixlar i bilden. Filtret rรถr sig lรคngs inmatningsbilden med en generell form av 3ร3 eller 5ร5. Det betyder att nรคtverket skjuter dessa fรถnster รถver hela inmatningsbilden och berรคknar faltningen. Animationen nedan visar hur faltningen fungerar. Patchens storlek รคr 3ร3, och utmatningsmatrisen รคr resultatet av den elementvisa operationen mellan bildmatrisen och filtret.
Du mรคrker att utmatningens bredd och hรถjd kan skilja sig frรฅn ingรฅngens bredd och hรถjd. Det hรคnder pรฅ grund av grรคnseffekten.
Grรคnseffekt
Bilden har en 5ร5-funktionskarta och ett 3ร3-filter. Det finns bara ett fรถnster i mitten dรคr filtret kan visa ett 3ร3-rutnรคt. Funktionskartan som visas krymper med tvรฅ rutor pรฅ varje axel, vilket ger en 3ร3-dimension.
Fรถr att fรฅ samma utgรฅngsdimension som ingรฅngsdimension mรฅste du lรคgga till utfyllnad. Utfyllnad bestรฅr av att lรคgga till rรคtt antal rader och kolumner pรฅ varje sida av matrisen. Det gรถr att faltningen centreras och passar varje ingรฅngsruta. I bilden nedan har ingรฅngs- och utgรฅngsmatriserna samma dimension, 5ร5.
Nรคr du definierar nรคtverket styrs de invecklade funktionerna av tre parametrar:
Djup: Den definierar antalet filter som ska tillรคmpas under faltningen. I fรถregรฅende exempel sรฅg du ett djup pรฅ 1, vilket innebรคr att endast ett filter anvรคnds. I de flesta fall finns det mer รคn ett filter. Animationen nedan visar de operationer som utfรถrs i en situation med tre filter.
Kliva: Den definierar antalet "pixelhopp" mellan tvรฅ skivor. Om steglรคngden รคr lika med 1, kommer fรถnstret att rรถra sig med en pixelspridning pรฅ ett. Om steglรคngden รคr lika med tvรฅ, kommer fรถnstret att hoppa med 2 pixlar. Om du รถkar steglรคngden fรฅr du mindre funktionskartor. De tvรฅ diagrammen nedan jรคmfรถr ett steg pรฅ 1 med ett steg pรฅ 2.
Exempel steg 1
steg 2
Nollfyllning: Padding รคr en operation dรคr man lรคgger till ett motsvarande antal rader och kolumner pรฅ varje sida av inmatningsfunktionskartorna. I det hรคr fallet har utdata samma dimension som indata.
Icke linjรคritet (ReLU)
I slutet av faltningsoperationen aktiveras utdata med en aktiveringsfunktion fรถr att mรถjliggรถra icke-linjรคritet. Den vanliga aktiveringsfunktionen fรถr ett konvolutionsnรคt รคr ReLU. Alla pixlar med ett negativt vรคrde ersรคtts med noll.
Pooling Operation
Det hรคr steget รคr lรคtt att fรถrstรฅ. Syftet med poolningen รคr att minska dimensionaliteten hos inmatningsbilden. Stegen utfรถrs fรถr att minska operationens berรคkningskomplexitet. Genom att minska dimensionaliteten har nรคtverket fรคrre vikter att berรคkna, vilket fรถrhindrar รถveranpassning.
I det hรคr steget behรถver du definiera storleken och steglรคngden. Ett standardsรคtt att poola inmatningsbilden รคr att anvรคnda det maximala vรคrdet fรถr objektkartan. Titta pรฅ bilden nedan. Poolningen screenar fyra delmatriser av 4ร4-objektkartan och returnerar det maximala vรคrdet. Poolningen tar det maximala vรคrdet fรถr en 2ร2-array och flyttar sedan detta fรถnster med tvรฅ pixlar. Till exempel รคr den fรถrsta delmatrisen [3,1,3,2], sรฅ poolningen returnerar det maximala, vilket รคr 3.
Det finns en annan poolningsoperation sรฅsom medelvรคrdet.
Den hรคr รฅtgรคrden minskar storleken pรฅ objektkartan kraftigt.
Fullt anslutna lager
Det sista steget bestรฅr av att bygga en traditionell artificiellt neuralt nรคtverk som du gjorde i fรถregรฅende handledning. Du kopplar alla neuroner frรฅn fรถregรฅende lager till nรคsta lager. Du anvรคnder en softmax-aktiveringsfunktion fรถr att klassificera numret pรฅ inmatningsbilden.
Recap:
Ett TensorFlow-faltningsneuralt nรคtverk kompilerar olika lager innan en fรถrutsรคgelse gรถrs. Ett neuralt nรคtverk har:
- Ett veckskikt
- ReLU aktiveringsfunktion
- Pooling lager
- Tรคtt sammanhรคngande lager
Faltningslagren tillรคmpar olika filter pรฅ en delregion av bilden. ReLU-aktiveringsfunktionen lรคgger till icke-linjรคritet, och poolningslagren minskar dimensionaliteten hos objektkartorna.
Alla dessa lager extracviktig information frรฅn bilderna. Slutligen matas funktionskartorna till ett helt sammankopplat lager med en softmax-funktion fรถr att gรถra en fรถrutsรคgelse.
Trรคna CNN med TensorFlow
Nu nรคr du รคr bekant med byggstenarna i ett convnet รคr du redo att bygga ett med TensorFlow. Vi kommer att anvรคnda MNIST-datauppsรคttningen fรถr CNN-bildklassificering.
Datafรถrberedelsen รคr densamma som den tidigare handledningen. Du kan kรถra koderna och hoppa direkt till CNN:s arkitektur.
Du kommer att fรถlja stegen nedan fรถr bildklassificering med CNN:
- Steg 1: Ladda upp datauppsรคttning
- Steg 2: Indatalager
- Steg 3: Konvolutionellt lager
- Steg 4: Pooling lager
- Steg 5: Andra konvolutionella lagret och Pooling Lager
- Steg 6: Tรคt lager
- Steg 7: Logit Layer
Versionsnotering: Listningarna nedan riktar sig mot TensorFlow 1.x. I TensorFlow 2 finns inte lรคngre namnrymden tf.layers och tf.estimator.inputs.numpy_input_fn; motsvarigheterna รคr tf.keras.layers.Conv2D, MaxPooling2D, Dense och Dropout monterade i en tf.keras.Model och trรคnade med model.fit(). Lรคs stegen fรถr mekaniken fรถr varje lager och mappa dem sedan till Keras API.
Steg 1: Ladda upp datauppsรคttning
MNIST-datasetet รคr tillgรคngligt via scikit-learn. Ladda ner det och lagra det i Nedladdningar. Du kan ladda upp det med fetch_mldata('MNIST original').
Versionsnotering: mldata.org har stรคngts ner och fetch_mldata() togs bort i scikit-learn 0.22. Ladda in samma siffror med hรคmta_รถppenml istรคllet anvรคnder man fetch_openml('mnist_784', version=1). Resten av pipelinen รคr ofรถrรคndrad.
Skapa ett tรฅg/testset
Du mรฅste dela upp datamรคngden med train_test_split.
Skala funktionerna
Slutligen kan du skala funktionerna med MinMaxScaler som visas i bildklassificeringen nedan med hjรคlp av TensorFlow CNN-exemplet.
import numpy as np import tensorflow as tf from sklearn.datasets import fetch_mldata #Change USERNAME by the username of your machine ## Windows USER mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original') ## Mac User mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original') print(mnist.data.shape) print(mnist.target.shape) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape ) ## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64)) feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])] X_train_scaled.shape[1:]
Definiera CNN
Ett CNN anvรคnder filter pรฅ de rรฅa pixlarna i en bild fรถr att lรคra sig detaljmรถnster jรคmfรถrt med de globala mรถnster som lรคrs ut av ett traditionellt neuralt nรคtverk. Fรถr att konstruera ett CNN mรฅste du definiera:
- Ett faltningslager: Applicera n antal filter pรฅ objektkartan. Efter faltningen behรถver du anvรคnda en ReLU-aktiveringsfunktion fรถr att lรคgga till icke-linjรคritet i nรคtverket.
- Pooling-lager: Nรคsta steg efter faltningen รคr att nedsampla objektkartan. Syftet รคr att minska objektkartans dimensionalitet fรถr att fรถrhindra รถveranpassning och fรถrbรคttra berรคkningshastigheten. Maxpooling รคr den konventionella tekniken som delar upp objektkartorna i delregioner (vanligtvis med en storlek pรฅ 2ร2) och endast behรฅller de maximala vรคrdena.
- Fullstรคndigt anslutna skikt: Alla neuroner frรฅn fรถregรฅende skikt รคr anslutna till nรคsta skikt. CNN kommer att klassificera etiketten enligt sรคrdragen frรฅn faltningsskikten och reduceras med poolskiktet.
CNN arkitektur
- Konvolutionellt lager: Tillรคmpar 14 5ร5-filter (t.ex.trac(5ร5-pixel-underregioner), med ReLU-aktiveringsfunktion
- Pooling Lager: Utfรถr maximal poolning med ett 2ร2-filter och steg pรฅ 2 (vilket anger att poolade regioner inte รถverlappar varandra)
- Convolutional Layer: Applicerar 36 5ร5-filter, med ReLU-aktiveringsfunktion
- Pooling Layer #2: ร terigen, utfรถr max pooling med ett 2ร2 filter och steg pรฅ 2
- 1,764 0.4 neuroner, med avbrottsregulariseringshastighet pรฅ 0.4 (sannolikheten XNUMX fรถr att nรฅgot givet element kommer att tappas under trรคning)
- Tรคt lager (Logits lager): 10 neuroner, en fรถr varje siffra mรฅlklass (0โ9).
Det finns tre viktiga moduler att anvรคnda fรถr att skapa ett CNN:
- conv2d(). Konstruerar ett tvรฅdimensionellt faltningslager med antalet filter, filterkรคrnans storlek, utfyllnad och aktiveringsfunktion som argument.
- max_pooling2d(). Konstruerar ett tvรฅdimensionellt poollager med hjรคlp av algoritmen fรถr maxpoolning.
- tรคt(). Konstruerar ett tรคtt lager med de dolda lagren och enheterna
Du kommer att definiera en funktion fรถr att bygga CNN. Lรฅt oss se i detalj hur man konstruerar varje byggsten innan omslag.ping allt tillsammans i funktionen.
Steg 2: Indatalager
def cnn_model_fn(features, labels, mode): input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Du mรฅste definiera en tensor med formen pรฅ data. Fรถr det kan du anvรคnda modulen tf.reshape. I den hรคr modulen mรฅste du fรถrklara att tensorn ska omformas och formen pรฅ tensorn. Det fรถrsta argumentet รคr egenskaperna hos datan, som definieras i funktionens argument.
En bild har en hรถjd, en bredd och en kanal. MNIST-datasetet รคr en monokrom bild med storleken 28ร28. Vi stรคller in batchstorleken till -1 i argumentet form sรฅ att den tar formen av features["x"]. Fรถrdelen รคr att gรถra batchstorleken till en hyperparameter att finjustera. Om batchstorleken รคr satt till 7, kommer tensorn att mata in 5 488 vรคrden (28*28*7).
Steg 3: Konvolutionellt lager
# first Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
Det fรถrsta faltningslagret har 14 filter med en kรคrnstorlek pรฅ 5ร5 och samma utfyllnad. Samma utfyllnad innebรคr att bรฅde utgรฅngstensorn och ingรฅngstensorn ska ha samma hรถjd och bredd. TensorFlow lรคgger till nollor i raderna och kolumnerna fรถr att sรคkerstรคlla samma storlek.
Du anvรคnder ReLU-aktiveringsfunktionen. Utdatastorleken blir [28, 28, 14].
Steg 4: Pooling lager
Nรคsta steg efter faltningen รคr poolningsberรคkningen. Poolningsberรคkningen kommer att minska datadimensionaliteten. Du kan anvรคnda modulen max_pooling2d med en storlek pรฅ 2ร2 och ett stridlรคge pรฅ 2. Du anvรคnder fรถregรฅende lager som indata. Utdatastorleken blir [batch_size, 14, 14, 14].
# first Pooling Layer
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Steg 5: Andra konvolutionella lagret och Pooling Lager
Det andra faltningslagret tillรคmpar 36 filter, vilket ger en utmatningsstorlek pรฅ [batch_size, 14, 14, 36]. Poolningslagret anvรคnder samma 2ร2-fรถnster och strid pรฅ 2 som tidigare, sรฅ det halverar varje rumslig axel och utmatningsformen blir [batch_size, 7, 7, 36].
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=36,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
Steg 6: Tรคt lager
Sedan mรฅste du definiera det helt sammankopplade lagret. Featurekartan mรฅste plattas ut innan den ansluts till det tรคta lagret. Du kan anvรคnda modulen fรถr omformning med en storlek pรฅ 7*7*36.
Det tรคta lagret kommer att koppla samman 1 764 neuroner. Du lรคgger till en ReLU-aktiveringsfunktion. Dessutom lรคgger du till en bortfallsregulariseringsterm med en frekvens pรฅ 0.3, vilket innebรคr att 30 procent av aktiveringarna kommer att sรคttas till 0. Observera att bortfallet endast sker under trรคningsfasen. Funktionen cnn_model_fn har ett argumentlรคge fรถr att deklarera om modellen behรถver trรคnas eller utvรคrderas, som visas i exemplet med CNN-bildklassificeringen TensorFlow nedan.
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])
dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)
Steg 7: Logit Layer
Slutligen, i exemplet med TensorFlow-bildklassificering, kan du definiera det sista lagret med modellens fรถrutsรคgelse. Utdataformen รคr lika med batchstorleken och 10 รคr det totala antalet mรฅlklasser.
# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=10)
Du kan skapa en ordbok som innehรฅller klasserna och sannolikheten fรถr varje klass. Funktionen tf.argmax() returnerar indexet fรถr det hรถgsta vรคrdet i logits-lagret. Softmax-funktionen returnerar sannolikheten fรถr varje klass.
predictions = {
# Generate predictions
"classes": tf.argmax(input=logits, axis=1),
"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }
Du vill bara returnera prediktionsordlistan nรคr lรคget รคr instรคllt pรฅ prediktion. Du lรคgger till den hรคr koden fรถr att visa prediktionerna.
if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
Nรคsta steg bestรฅr av att berรคkna modellens fรถrlust. I den senaste handledningen lรคrde du dig att fรถrlustfunktionen fรถr en flerklassmodell รคr korsentropi. Fรถrlusten berรคknas enkelt med fรถljande kod:
# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
Det sista steget i TensorFlow CNN-exemplet รคr att optimera modellen, det vill sรคga att hitta de bรคsta vรคrdena fรถr vikterna. Fรถr det anvรคnder du en gradient descent-optimerare med en inlรคrningshastighet pรฅ 0.001. Mรฅlet รคr att minimera fรถrlusten.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
loss=loss,
global_step=tf.train.get_global_step())
Du รคr klar med CNN. Du vill dock visa prestandamรฅtten under utvรคrderingslรคget. Prestandamรคtet fรถr en flerklassmodell รคr noggrannhet. TensorFlow รคr utrustad med en noggrannhetsmodul som tar tvรฅ argument, etiketterna och de fรถrutspรฅdda vรคrdena.
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
Det รคr allt. Du skapade ditt fรถrsta CNN och du รคr redo att slรฅ in allt i en funktion fรถr att anvรคnda den fรถr att trรคna och utvรคrdera modellen.
def cnn_model_fn(features, labels, mode): """Model function for CNN.""" # Input Layer input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) # Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) # Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) # Convolutional Layer #2 and Pooling Layer conv2 = tf.layers.conv2d( inputs=pool1, filters=36, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) # Dense Layer pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36]) dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu) dropout = tf.layers.dropout( inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) # Logits Layer logits = tf.layers.dense(inputs=dropout, units=10) predictions = { # Generate predictions (for PREDICT and EVAL mode) "classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor") } if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) # Calculate Loss loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) # Configure the Training Op (for TRAIN mode) if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step()) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) # Add evaluation metrics Evaluation mode eval_metric_ops = { "accuracy": tf.metrics.accuracy( labels=labels, predictions=predictions["classes"])} return tf.estimator.EstimatorSpec( mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
Anmรคrkning om den sammansatta funktionen: Den inslagna versionen ovan stรคller in det fรถrsta faltningslagret till 32 filter och bortfall till 0.4, medan steg-fรถr-steg-kodavsnitten anvรคnder 14 filter och 0.3. Bรฅda kรถrs, men vรคlj ett vรคrdepar och hรฅll det konsekvent sรฅ att de utskrivna formerna matchar lagertabellen.
Stegen nedan รคr desamma som de tidigare handledningarna.
Fรถrst och frรคmst definierar du en estimator med CNN-modellen fรถr bildklassificering.
# Create the Estimator mnist_classifier = tf.estimator.Estimator( model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")
Ett CNN tar lรฅng tid att trรคna, dรคrfรถr skapar du en loggningskrok fรถr att lagra vรคrdena fรถr softmax-lagren var 50:e iteration.
# Set up logging for predictions tensors_to_log = {"probabilities": "softmax_tensor"} logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)
Du รคr redo att uppskatta modellen. Du stรคller in en batchstorlek pรฅ 100 och blandar data. Observera att vi har satt in trรคningssteg pรฅ 16 000, vilket kan ta lรฅng tid att trรคna. Ha tรฅlamod.
# Train the model train_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=100, num_epochs=None, shuffle=True) mnist_classifier.train( input_fn=train_input_fn, steps=16000, hooks=[logging_hook])
Nu nรคr modellen รคr trรคnad kan du utvรคrdera den och skriva ut resultaten.
# Evaluate the model and print results eval_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, num_epochs=1, shuffle=False) eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn) print(eval_results)
Utvรคrderingen skriver ut den รฅterstรคllda kontrollpunkten, steget den stoppades vid och den slutliga mรคtvรคrdesordlistan.
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56 INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269 {'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}
Med den nuvarande arkitekturen rapporterar utvรคrderingslexikonet en noggrannhet pรฅ 0.9689286, ungefรคr 97 %. Du kan รคndra arkitekturen, batchstorleken och antalet iterationer fรถr att fรถrbรคttra noggrannheten. CNN har presterat mycket bรคttre รคn en artificiellt neuralt nรคtverk eller logistisk regression: i handledningen om artificiella neurala nรคtverk hade du en noggrannhet pรฅ 96 %, vilket รคr lรคgre รคn CNN:s. CNN:s prestanda รคr imponerande med en stรถrre bilduppsรคttning, bรฅde vad gรคller berรคkningshastighet och noggrannhet.











