Klasifikacija slik TensorFlow: CNN (konvolucijska nevronska mreža)

Kazalo:

Anonim

Kaj je konvolucijska nevronska mreža?

Konvolucijska nevronska mreža, znana tudi kot konvneti ali CNN, je dobro znana metoda v aplikacijah računalniškega vida. Ta vrsta arhitekture je prevladujoča za prepoznavanje predmetov iz slike ali videoposnetka.

V tej vadnici boste izvedeli, kako zgraditi convnet in kako uporabiti TensorFlow za reševanje ročno napisanega nabora podatkov.

V tej vadnici boste izvedeli

  • Konvolucijska nevronska mreža
  • Arhitektura konvolucijske nevronske mreže
  • Sestavni deli Convnets
  • Vadite CNN s TensorFlowom
  • 1. korak: naložite nabor podatkov
  • 2. korak: Vhodna plast
  • 3. korak: Konvolucijski sloj
  • 4. korak: Združevanje sloja
  • 5. korak: Drugi zvitek in združevalni sloj
  • 6. korak: Gosta plast
  • 7. korak: Logit Layer

Arhitektura konvolucijske nevronske mreže

Pomislite na Facebook pred nekaj leti, potem ko ste na svoj profil naložili sliko, ste bili pozvani, da na obraz na sliki dodate ročno ime. Danes Facebook uporablja convnet za samodejno označevanje vašega prijatelja na sliki.

Konvolucijske nevronske mreže ni zelo težko razumeti. Vhodna slika se obdela v fazi zvijanja in ji kasneje pripiše oznako.

Tipično arhitekturo convnet lahko povzamemo na spodnji sliki. Najprej se slika potisne v omrežje; to se imenuje vhodna slika. Nato gre vhodna slika skozi neskončno število korakov; to je zapletni del omrežja. Nevronska mreža lahko napove tudi številko na sliki.

Slika je sestavljena iz niza slikovnih pik z višino in širino. Slika v sivinah ima samo en kanal, barvna slika pa tri (vsak za rdečo, zeleno in modro). Kanal je zložen drug čez drugega. V tej vadnici boste uporabili sivinsko sliko s samo enim kanalom. Vsaka slikovna pika ima vrednost od 0 do 255, ki odraža intenzivnost barve. Na primer, piksel, enak 0, bo pokazal belo barvo, piksel z vrednostjo blizu 255 pa bo temnejši.

Oglejmo si sliko, shranjeno v naboru podatkov MNIST. Spodnja slika prikazuje, kako predstaviti sliko levice v matričnem formatu. Upoštevajte, da je bila izvirna matrika standardizirana tako, da je med 0 in 1. Za temnejše barve je vrednost v matriki približno 0,9, medtem ko imajo bele pike vrednost 0.

Konvolucijsko delovanje

Najbolj kritična komponenta v modelu je konvolucijski sloj. Cilj tega dela je zmanjšati velikost slike za hitrejše izračune uteži in izboljšati njeno posploševanje.

Med konvolucijskim delom mreža ohranja bistvene značilnosti slike in izključuje nepomemben šum. Model se na primer uči, kako prepoznati slona na sliki z goro v ozadju. Če uporabljate tradicionalno nevronsko mrežo, bo model dodelil utež vsem slikovnim pikam, tudi tistim z gore, kar ni bistveno in lahko zavede omrežje.

Namesto tega bo konvolucijska nevronska mreža uporabila matematično tehniko za pridobivanje samo najpomembnejših slikovnih pik. Ta matematična operacija se imenuje zvijanje. Ta tehnika omogoča omrežju, da se nauči vedno bolj zapletenih lastnosti na vsaki plasti. Konvolucija matriko razdeli na majhne koščke, da se nauči najpomembnejših elementov znotraj vsakega kosa.

Sestavni deli Convnets

Obstajajo štiri komponente Convnets

  1. Konvolucija
  2. Nelinearnost (ReLU)
  3. Združevanje ali podvzorčenje
  4. Klasifikacija (popolnoma povezan sloj)
  • Konvolucija

Namen konvolucije je lokalno izluščiti značilnosti predmeta na sliki. To pomeni, da se bo mreža naučila določenih vzorcev znotraj slike in jo bo lahko prepoznala povsod na sliki.

Konvolucija je pomnožitev elementov. Koncept je lahko razumljiv. Računalnik bo optično prebral del slike, običajno v dimenziji 3x3, in jo pomnožil na filter. Rezultat množenja po elementih se imenuje zemljevid lastnosti. Ta korak se ponavlja, dokler ni skenirana vsa slika. Upoštevajte, da se po konvoluciji velikost slike zmanjša.

Spodaj je URL, ki si lahko ogledate, kako deluje zvijanje.

Na voljo so številni kanali. Spodaj smo našteli nekatere kanale. Vidite lahko, da ima vsak filter določen namen. Opomba, na spodnji sliki; jedro je sinonim filtra.

Vir

Aritmetika za konvolucijo

Konvolucijska faza bo filter uporabila za majhno paleto slikovnih pik znotraj slike. Filter se bo premikal vzdolž vhodne slike s splošno obliko 3x3 ali 5x5. To pomeni, da bo omrežje ta okna potisnilo po celotni vhodni sliki in izračunalo konvolucijo. Spodnja slika prikazuje delovanje konvolucije. Velikost popravka je 3x3, izhodna matrica pa je rezultat elementovskega delovanja med slikovno matrico in filtrom.

Vir

Opazili ste, da se širina in višina izhoda lahko razlikujeta od širine in višine vhoda. To se zgodi zaradi mejnega učinka.

Mejni učinek

Slika ima zemljevid funkcij 5x5 in filter 3x3. V sredini je samo eno okno, kjer lahko filter prikaže mrežo 3x3. Zemljevid izhodnih lastnosti se bo skupaj z dimenzijo 3x3 skrčil za dve ploščici.

Če želite dobiti enako izhodno dimenzijo kot vhodna dimenzija, morate dodati oblazinjenje. Oblazinjenje je sestavljeno iz dodajanja pravega števila vrstic in stolpcev na vsaki strani matrike. Omogočil bo, da se konvolucija na sredini prilega vsaki vhodni ploščici. Na spodnji sliki imata vhodno / izhodna matrica enako dimenzijo 5x5

Ko definirate omrežje, krtačene funkcije nadzirajo trije parametri:

  1. Globina: Določa število filtrov, ki jih je treba uporabiti med zvijanjem. V prejšnjem primeru ste videli globino 1, kar pomeni, da se uporablja samo en filter. V večini primerov obstaja več kot en filter. Spodnja slika prikazuje postopke, opravljene v razmerah s tremi filtri

  1. Stride: Določa število "skokov pikslov" med dvema rezinama. Če je korak enak 1, se okna premaknejo z razmikom pikslov enega. Če je korak enak dvema, se okna poskočijo za 2 slikovni piki. Če povečate korak, boste imeli manjše zemljevide funkcij.

Primer koraka 1

Korak slike 2

  1. Ničelno oblazinjenje: oblazinjenje je postopek dodajanja ustreznega števila vrstic in stolpcev na vsaki strani zemljevidov vhodnih lastnosti. V tem primeru ima izhod enako dimenzijo kot vhod.
  2. Nelinearnost (ReLU)

Na koncu postopka zvijanja je izhod predmet funkcije aktiviranja, ki omogoča nelinearnost. Običajna aktivacijska funkcija za convnet je Relu. Vse slikovne pike z negativno vrednostjo bomo nadomestili z nič.

  • Operacija največjega združevanja

Ta korak je enostavno razumeti. Namen združevanja je zmanjšati dimenzionalnost vhodne slike. Koraki so narejeni za zmanjšanje računske zapletenosti operacije. Z zmanjšanjem dimenzionalnosti ima mreža za izračun nižje uteži, zato preprečuje prekomerno opremljanje.

V tej fazi morate določiti velikost in korak. Standardni način združevanja vhodne slike je uporaba največje vrednosti zemljevida lastnosti. Poglejte spodnjo sliko. "Združevanje" bo prikazalo štiri podmatrice mape lastnosti 4x4 in vrnilo največjo vrednost. Združevanje zavzame največjo vrednost matrike 2x2 in nato ta okna premakne za dve slikovni piki. Na primer, prva pod matrica je [3,1,3,2], združevanje bo vrnilo največ, kar je 3.

Obstaja še ena operacija združevanja, kot je povprečje.

Ta operacija agresivno zmanjša velikost zemljevida lastnosti

  • Popolnoma povezane plasti

Zadnji korak je gradnja tradicionalne umetne nevronske mreže, kot ste storili v prejšnji vadnici. Vse nevrone iz prejšnje plasti povežete z naslednjo plastjo. Številko na vhodni sliki razvrstite s funkcijo aktiviranja softmax.

Povzetek:

Konvolucijska nevronska mreža pred napovedovanjem sestavi različne plasti. Nevronska mreža ima:

  • Konvolucijski sloj
  • Funkcija aktivacije Relu
  • Združevalni sloj
  • Gosto povezana plast

Zavojni sloji uporabljajo različne filtre za podregijo slike. Funkcija aktivacije Relu doda nelinearnost, sloji združevanja pa zmanjšajo dimenzionalnost zemljevidov funkcij.

Vse te plasti iz slik izvlečejo bistvene informacije. Nazadnje se zemljevid funkcij dovede do primarnega popolnoma povezanega sloja s funkcijo softmax za napovedovanje.

Vadite CNN s TensorFlowom

Zdaj, ko poznate gradnik konvneta, ste ga pripravljeni zgraditi s TensorFlowom. Za razvrščanje slik bomo uporabili nabor podatkov MNIST.

Priprava podatkov je enaka prejšnji vadnici. Lahko zaženete kode in skočite neposredno na arhitekturo CNN.

Sledite spodnjim korakom:

1. korak: naložite nabor podatkov

2. korak: Vhodna plast

3. korak: Konvolucijski sloj

4. korak: Združevanje sloja

5. korak: Drugi zvitek in združevalni sloj

6. korak: Gosta plast

7. korak: Logit Layer

1. korak: naložite nabor podatkov

Podatkovni niz MNIST je na voljo s scikitom za učenje na tem URL-ju. Prosimo, prenesite ga in shranite v Prenosi. Lahko ga naložite s fetch_mldata ('MNIST original').

Ustvari vlak / testni sklop

Nabor podatkov morate razdeliti z train_test_split

Prilagodite funkcije

Končno lahko funkcijo prilagodite z MinMaxScaler

import numpy as npimport tensorflow as tffrom sklearn.datasets import fetch_mldata#Change USERNAME by the username of your machine## Windows USERmnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')## Mac Usermnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')print(mnist.data.shape)print(mnist.target.shape)from sklearn.model_selection import train_test_splitX_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 )## resclaefrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()# TrainX_train_scaled = scaler.fit_transform(X_train.astype(np.float64))# testX_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:]

Določite CNN

CNN uporablja filtre na neobdelani slikovni sliki slike, da se nauči podrobnosti vzorca v primerjavi z globalnim vzorcem s tradicionalno nevronsko mrežo. Če želite zgraditi CNN, morate določiti:

  1. Konvolucijski sloj: na zemljevid značilnosti uporabite n števila filtrov. Po konvoluciji morate uporabiti funkcijo aktivacije Relu, da dodate omrežju nelinearnost.
  2. Sloj združevanja: Naslednji korak po konvoluciji je zmanjšanje vzorca funkcije max. Namen je zmanjšati dimenzionalnost karte lastnosti, da se prepreči prekomerno opremljanje in izboljša hitrost izračuna. Največje združevanje je običajna tehnika, ki razdeli zemljevide funkcij v podregije (običajno z velikostjo 2x2) in ohrani le največje vrednosti.
  3. Popolnoma povezane plasti: Vsi nevroni iz prejšnjih plasti so povezani z naslednjimi plastmi. CNN bo nalepko razvrstil glede na značilnosti zavojnih slojev in zmanjšano s slojem združevanja.

Arhitektura CNN

  • Konvolucijski sloj: uporablja 14 filtrov 5x5 (ekstrahiranje podregij 5x5 slikovnih pik) s funkcijo aktiviranja ReLU
  • Sloj združevanja: opravi največje združevanje s filtrom 2x2 in korakom 2 (kar določa, da se združena območja ne prekrivajo)
  • Konvolucijski sloj: Uporablja 36 filtrov 5x5 s funkcijo aktiviranja ReLU
  • Združevanje plasti št. 2: spet izvede največje združevanje s filtrom 2x2 in korakom 2
  • 1.764 nevronov, s stopnjo regularizacije osipa 0,4 (verjetnost 0,4, da bo kateri koli element med treningom izpuščen)
  • Gosta plast (Logits Layer): 10 nevronov, po en za vsak cifreni ciljni razred (0-9).

Za ustvarjanje CNN lahko uporabite tri pomembne module:

  • conv2d (). Konstruira dvodimenzionalno zvijalno plast s številom filtrov, velikostjo jedra filtra, oblazinjenjem in funkcijo aktiviranja kot argumente.
  • max_pooling2d (). Konstruira dvodimenzionalno plast združevanja z uporabo algoritma največjega združevanja.
  • gosto (). Konstruira gosto plast s skritimi plastmi in enotami

Določili boste funkcijo za gradnjo CNN. Poglejmo podrobno, kako zgraditi vsak gradnik, preden vse skupaj zavijemo v funkcijo.

2. korak: Vhodna plast

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

Določiti morate tenzor z obliko podatkov. Za to lahko uporabite modul tf.reshape. V tem modulu morate razglasiti tenzor za preoblikovanje in obliko tenzorja. Prvi argument so značilnosti podatkov, ki so opredeljene v argumentu funkcije.

Slika ima višino, širino in kanal. Nabor podatkov MNIST je enobarvna slika velikosti 28 x 28. Velikost serije nastavimo na -1 v argumentu shape, tako da dobi obliko elementov ["x"]. Prednost je prilagoditev hiperparametrov velikosti serije. Če je velikost serije nastavljena na 7, bo napetost podala 5.488 vrednosti (28 * 28 * 7).

Step 3: Convolutional layer
# first Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

Prva zvitka ima 14 filtrov z velikostjo jedra 5x5 z enakim oblazinjenjem. Enako oblazinjenje pomeni, da morata imeti izhodni in vhodni tenzor enako višino in širino. Tensorflow bo vrsticam in stolpcem dodal ničle, da se zagotovi enaka velikost.

Uporabljate funkcijo aktiviranja Relu. Izhodna velikost bo [28, 28, 14].

4. korak: Združevanje sloja

Naslednji korak po konvoluciji je izračun združevanja. Izračun združevanja bo zmanjšal dimenzionalnost podatkov. Uporabite lahko modul max_pooling2d z velikostjo 2x2 in korakom 2. Kot vhod uporabite prejšnjo plast. Izhodna velikost bo [velikost_paketa, 14, 14, 14]

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

5. korak: Drugi zvitek in združevalni sloj

Drugi zavojni sloj ima 32 filtrov z izhodno velikostjo [batch_size, 14, 14, 32]. Plast združevanja ima enako velikost kot prej, izhodna oblika pa je [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)

6. korak: Gosta plast

Nato morate definirati popolnoma povezan sloj. Zemljevid lastnosti je treba poravnati, preden je povezan z gosto plastjo. Uporabite lahko preoblikovanje modula z velikostjo 7 * 7 * 36.

Gosta plast bo povezala 1764 nevronov. Dodate funkcijo za aktiviranje Relu. Poleg tega dodate izraz regularizacije osipa s stopnjo 0,3, kar pomeni, da bo 30 odstotkov uteži nastavljeno na 0. Upoštevajte, da opustitev poteka samo v fazi treninga. Funkcija cnn_model_fn ima način argumenta, s katerim ugotovi, ali je treba model usposobiti ali ovrednotiti.

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)

7. korak: Logit Layer

Na koncu lahko določite še zadnji sloj s predvidevanjem modela. Izhodna oblika je enaka velikosti serije in 10, skupnemu številu slik.

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

Ustvarite lahko slovar, ki vsebuje razrede in verjetnost vsakega predavanja. Modul tf.argmax () s vrne najvišjo vrednost, če je logit plast. Funkcija softmax vrne verjetnost vsakega razreda.

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

Vrniti napoved dikcionarja želite le, če je način nastavljen na predvidevanje. Te kode dodate, da prikažejo predvidevanja

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

Naslednji korak je izračunavanje izgube modela. V zadnji vadnici ste izvedeli, da je funkcija izgube za večrazredni model navzkrižna entropija. Izgubo je enostavno izračunati z naslednjo kodo:

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

Zadnji korak je optimizacija modela, to je iskanje najboljših vrednosti uteži. Za to uporabite Gradient spust optimizator s stopnjo učenja 0,001. Cilj je zmanjšati izgubo

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

Z CNN ste končali. Vendar pa želite v načinu ocenjevanja prikazati meritve uspešnosti. Meritve uspešnosti za večrazredni model so meritve natančnosti. Tensorflow je opremljen z natančnostjo modula z dvema argumentoma, nalepkama in predvidenimi vrednostmi.

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)

To je to. Ustvarili ste svoj prvi CNN in ste pripravljeni vse zaviti v funkcijo, da jo lahko uporabite za urjenje in oceno modela.

def cnn_model_fn(features, labels, mode):"""Model function for CNN."""# Input Layerinput_layer = tf.reshape(features["x"], [-1, 28, 28, 1])# Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)# Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)# Convolutional Layer #2 and Pooling Layerconv2 = 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 Layerpool2_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 Layerlogits = 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 Lossloss = 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 modeeval_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)

Spodnji koraki so enaki prejšnjim vajam.

Najprej določite ocenjevalnik z modelom CNN.

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

CNN se velikokrat uči, zato ustvarite kavelj za beleženje, da shranite vrednosti plasti softmax vsakih 50 ponovitev.

# Set up logging for predictionstensors_to_log = {"probabilities": "softmax_tensor"}logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

Pripravljeni ste na oceno modela. Nastavite velikost paketa 100 in premešajte podatke. Upoštevajte, da smo določili 16.000 korakov za trening, da lahko traja veliko časa za trening. Bodi potrpežljiv.

# Train the modeltrain_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])

Zdaj, ko je model vlak, ga lahko ocenite in natisnete rezultate

# Evaluate the model and print resultseval_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:41INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56INFO: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}

S trenutno arhitekturo dobite natančnost 97%. Za izboljšanje natančnosti lahko spremenite arhitekturo, velikost serije in število ponovitev. Nevronska mreža CNN se je izkazala veliko bolje kot ANN ali logistična regresija. V vadnici o umetnem nevronskem omrežju ste imeli natančnost 96%, kar je nižje od CNN. Zmogljivosti CNN-ja so impresivne z večjim naborom slik , tako v smislu izračuna hitrosti kot natančnosti.

Povzetek

Konvolucijska nevronska mreža zelo dobro deluje za oceno slike. Ta vrsta arhitekture je prevladujoča za prepoznavanje predmetov iz slike ali videoposnetka.

Če želite zgraditi CNN, sledite šestim korakom:

1. korak: Vhodna plast:

Ta korak preoblikuje podatke. Oblika je enaka kvadratnemu korenu števila slikovnih pik. Če ima slika na primer 156 slikovnih pik, je oblika 26x26. Določiti morate, ali je slika barvna ali ne. Če je odgovor pritrdilen, ste imeli 3 na obliko - 3 za RGB -, sicer 1.

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

2. korak: Konvolucijski sloj

Nato morate ustvariti zavite sloje. Uporabljate različne filtre, da omogočite omrežju, da se nauči pomembne funkcije. Določite velikost jedra in količino filtrov.

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

3. korak: Združevanje sloja

V tretjem koraku dodate plast združevanja. Ta plast zmanjša velikost vnosa. To stori tako, da vzame največjo vrednost pod matrike. Če je na primer pod-matrika [3,1,3,2], bo združevanje vrnilo največ, kar je 3.

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

4. korak: dodajte zvit sloj in sloj združevanja

V tem koraku lahko dodate toliko, kolikor želite conv slojev in združevanje slojev. Google uporablja arhitekturo z več kot 20 konverzijskimi plastmi.

5. korak: Gosta plast

Korak 5 poravna prejšnji, da ustvari popolnoma povezane plasti. V tem koraku lahko uporabite drugačno funkcijo aktiviranja in dodate učinek osipa.

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)

6. korak: Logit Layer

Zadnji korak je napoved.

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