Klasifikacija slike TensorFlow: CNN (konvolucijska neuronska mreža)

Sadržaj:

Anonim

Što je konvolucijska neuronska mreža?

Konvolucijska neuronska mreža, također poznata kao convnets ili CNN, dobro je poznata metoda u aplikacijama računalnog vida. Ova vrsta arhitekture je dominantna za prepoznavanje predmeta sa slike ili video zapisa.

U ovom vodiču naučit ćete kako konstruirati convnet i kako koristiti TensorFlow za rješavanje rukom napisanog skupa podataka.

U ovom ćete tutorijalu naučiti

  • Konvolucijska neuronska mreža
  • Arhitektura konvolucijske neuronske mreže
  • Komponente Convneta
  • Vlak CNN s TensorFlowom
  • Korak 1: Prenesite skup podataka
  • Korak 2: Ulazni sloj
  • Korak 3: Konvolucijski sloj
  • Korak 4: Sloj za udruživanje
  • Korak 5: Drugi sloj sloja i sloj udruživanja
  • Korak 6: Gusti sloj
  • Korak 7: Sloj Logit

Arhitektura konvolucijske neuronske mreže

Razmislite o Facebooku prije nekoliko godina, nakon što ste na svoj profil prenijeli sliku, zatraženo je da ručno dodate ime licu na slici. Danas Facebook koristi convnet za automatsko označavanje vašeg prijatelja na slici.

Konvolucijsku neuronsku mrežu nije jako teško razumjeti. Ulazna slika obrađuje se tijekom faze konvolucije i kasnije joj se pripisuje oznaka.

Tipična convnet arhitektura može se sažeti na donjoj slici. Prije svega, slika se gura u mrežu; to se naziva ulaznom slikom. Zatim, ulazna slika prolazi kroz beskonačan broj koraka; ovo je konvolucijski dio mreže. Napokon, neuronska mreža može predvidjeti znamenku na slici.

Slika se sastoji od niza piksela visine i širine. Slika u sivim tonovima ima samo jedan kanal, dok slika u boji ima tri kanala (svaki za crvenu, zelenu i plavu). Kanal je složen jedan preko drugog. U ovom vodiču upotrijebit ćete sivu sliku sa samo jednim kanalom. Svaki piksel ima vrijednost od 0 do 255 da odražava intenzitet boje. Na primjer, piksel jednak 0 prikazat će bijelu boju, dok će piksel vrijednosti blizu 255 biti tamniji.

Pogledajmo sliku pohranjenu u skupu podataka MNIST. Slika ispod prikazuje kako prikazati sliku lijevo u matričnom formatu. Imajte na umu da je izvorna matrica standardizirana na između 0 i 1. Za tamniju boju vrijednost matrice je oko 0,9, dok bijeli pikseli imaju vrijednost 0.

Konvolucijski rad

Najkritičnija komponenta u modelu je konvolucijski sloj. Ovaj dio ima za cilj smanjenje veličine slike radi bržih izračunavanja pondera i poboljšanje njezine generalizacije.

Tijekom konvolucijskog dijela mreža zadržava bitne značajke slike i isključuje nebitne šume. Na primjer, model uči kako prepoznati slona sa slike s planinom u pozadini. Ako koristite tradicionalnu neuronsku mrežu, model će dodijeliti težinu svim pikselima, uključujući one s planine, što nije bitno i može zavarati mrežu.

Umjesto toga, konvolucijska neuronska mreža koristit će matematičku tehniku ​​za izdvajanje samo najrelevantnijih piksela. Ova matematička operacija naziva se konvolucija. Ova tehnika omogućuje mreži da nauči sve složenije značajke na svakom sloju. Konvolucija dijeli matricu na male dijelove kako bi naučila najvažnije elemente unutar svakog dijela.

Komponente Convneta

Postoje četiri komponente Convneta

  1. Konvolucija
  2. Nelinearnost (ReLU)
  3. Udruživanje ili poduzorkovanje
  4. Klasifikacija (potpuno povezan sloj)
  • Konvolucija

Svrha konvolucije je lokalno izdvajanje značajki predmeta na slici. To znači da će mreža naučiti određene obrasce unutar slike i moći će ih prepoznati svugdje na slici.

Konvolucija je umnožavanje elemenata. Koncept je lako razumljiv. Računalo će skenirati dio slike, obično dimenzije 3x3, i umnožava ga na filtar. Izlaz množenja po elementima naziva se karta značajki. Ovaj se korak ponavlja dok se ne skenira sva slika. Imajte na umu da se nakon konvolucije veličina slike smanjuje.

Ispod je URL za prikaz kako na djelu funkcionira konvolucija.

Dostupni su brojni kanali. U nastavku smo naveli neke od kanala. Možete vidjeti da svaki filtar ima određenu svrhu. Napomena, na donjoj slici; kernel je sinonim filtra.

Izvor

Aritmetika iza konvolucije

Konvolucijska faza primijenit će filtar na mali niz piksela unutar slike. Filtar će se kretati duž ulazne slike općenitog oblika 3x3 ili 5x5. To znači da će mreža pomaknuti ove prozore po cijeloj ulaznoj slici i izračunati konvoluciju. Slika ispod prikazuje kako konvolucija djeluje. Veličina zakrpe je 3x3, a izlazna matrica rezultat je elementne operacije između matrice slike i filtra.

Izvor

Primijetili ste da se širina i visina izlaza mogu razlikovati od širine i visine unosa. To se događa zbog učinka granice.

Učinak granice

Slika ima kartu značajki 5x5 i filter 3x3. U središtu je samo jedan prozor u kojem filtar može prikazati mrežu 3x3. Mapa izlaznih značajki smanjit će se za dvije pločice, zajedno s dimenzijom 3x3.

Da biste dobili istu izlaznu dimenziju kao i ulaznu dimenziju, trebate dodati popunjavanje. Padding se sastoji od dodavanja pravog broja redaka i stupaca sa svake strane matrice. Omogućit će da se konvolucija centrira na svaku ulaznu pločicu. Na slici ispod, ulazno / izlazna matrica imaju istu dimenziju 5x5

Kada definirate mrežu, savijene značajke kontroliraju se pomoću tri parametra:

  1. Dubina: definira broj filtara koji će se primijeniti tijekom konvolucije. U prethodnom primjeru vidjeli ste dubinu od 1, što znači da se koristi samo jedan filtar. U većini slučajeva postoji više od jednog filtra. Slika dolje prikazuje radnje izvršene u situaciji s tri filtra

  1. Korak: Definira broj "skoka piksela" između dvije kriške. Ako je korak jednak 1, prozori će se pomicati s raširenjem piksela od jednog. Ako je korak jednak dvama, prozori će skočiti za 2 piksela. Ako povećate korak, imat ćete manje značajne karte.

Primjer koraka 1

Korak slike 2

  1. Nulti padding: Padding je operacija dodavanja odgovarajućeg broja redaka i stupaca sa svake strane ulaznih mapa značajki. U ovom slučaju, izlaz ima istu dimenziju kao i ulaz.
  2. Nelinearnost (ReLU)

Na kraju operacije konvolucije, izlaz podliježe aktivirajućoj funkciji koja omogućuje nelinearnost. Uobičajena funkcija aktiviranja za convnet je Relu. Svi pikseli s negativnom vrijednošću zamijenit će se nulom.

  • Maksimalno udruživanje

Ovaj je korak lako razumljiv. Svrha udruživanja je smanjiti dimenzionalnost ulazne slike. Koraci su poduzeti kako bi se smanjila računska složenost operacije. Umanjujući dimenzionalnost, mreža ima niže težine za izračunavanje, tako da sprječava prekomjerno opremanje.

U ovoj fazi trebate definirati veličinu i korak. Standardni način udruživanja ulazne slike je korištenje maksimalne vrijednosti karte značajki. Pogledajte sliku ispod. "Udruživanje" će prikazati četiri podmatrice mape značajki 4x4 i vratiti maksimalnu vrijednost. Udruživanje uzima maksimalnu vrijednost polja 2x2, a zatim pomiče ovaj prozor za dva piksela. Na primjer, prva je pod-matrica [3,1,3,2], udruživanje će vratiti maksimum, što je 3.

Postoji još jedna operacija udruživanja kao što je srednja vrijednost.

Ova operacija agresivno smanjuje veličinu karte značajki

  • Potpuno povezani slojevi

Posljednji se korak sastoji od izgradnje tradicionalne umjetne neuronske mreže kao što ste to učinili u prethodnom tutorialu. Sve neurone iz prethodnog sloja povezujete sa sljedećim. Za klasifikaciju broja na ulaznoj slici koristite funkciju softmax aktivacije.

Rekapitulacija:

Konvolucijska neuronska mreža kompilira različite slojeve prije nego što predvidi. Neuronska mreža ima:

  • Konvolucijski sloj
  • Relu funkcija aktiviranja
  • Sloj za udruživanje
  • Gusto povezan sloj

Konvolucijski slojevi primjenjuju različite filtre na podregiju slike. Funkcija aktiviranja Relu dodaje nelinearnost, a slojevi udruživanja smanjuju dimenzionalnost karata značajki.

Svi ovi slojevi izvlače bitne informacije sa slika. Napokon se karta značajki dovodi do primarnog potpuno povezanog sloja s softmax funkcijom za predviđanje.

Vlak CNN s TensorFlowom

Sad kad ste upoznati sa građevnim elementom konvneta, spremni ste za izgradnju s TensorFlowom. Za klasifikaciju slika koristit ćemo skup podataka MNIST.

Priprema podataka ista je kao i u prethodnom vodiču. Možete pokrenuti kodove i izravno prijeći na arhitekturu CNN-a.

Slijedit ćete korake u nastavku:

Korak 1: Prenesite skup podataka

Korak 2: Ulazni sloj

Korak 3: Konvolucijski sloj

Korak 4: Sloj za udruživanje

Korak 5: Drugi sloj sloja i sloj udruživanja

Korak 6: Gusti sloj

Korak 7: Sloj Logit

Korak 1: Prenesite skup podataka

Skup podataka MNIST dostupan je s scikitom za učenje na ovom URL-u. Molimo vas preuzmite ga i spremite u Preuzimanja. Možete ga prenijeti s fetch_mldata ('MNIST original').

Stvorite vlak / testni set

Skup podataka morate podijeliti s train_test_split

Povećajte značajke

Konačno, značajku možete prilagoditi MinMaxScalerom

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:]

Definirajte CNN

CNN koristi filtre na sirovom pikselu slike kako bi naučio detalje uzoraka u usporedbi s globalnim uzorkom s tradicionalnom neuronskom mrežom. Da biste konstruirali CNN, morate definirati:

  1. Konvolucijski sloj: Primijenite n broja filtara na kartu značajki. Nakon konvolucije, morate upotrijebiti Relu funkciju aktivacije kako biste mreži dodali nelinearnost.
  2. Sloj za udruživanje: Sljedeći korak nakon konvolucije je smanjenje uzorka značajke max. Svrha je smanjiti dimenzionalnost karte značajki kako bi se spriječilo prekomjerno prilagođavanje i poboljšala brzina izračuna. Maksimalno udruživanje konvencionalna je tehnika koja dijeli mape značajki u podregije (obično veličine 2x2) i zadržava samo maksimalne vrijednosti.
  3. Potpuno povezani slojevi: Svi neuroni iz prethodnih slojeva povezani su sa sljedećim slojevima. CNN će klasificirati naljepnicu prema značajkama iz konvolucijskih slojeva i smanjenom slojem za udruživanje.

CNN arhitektura

  • Konvolucijski sloj: Primjenjuje 14 filtera 5x5 (izdvajanje podregija od 5x5 piksela), s funkcijom aktivacije ReLU
  • Sloj za udruživanje: Izvodi maksimalno udruživanje s 2x2 filtrom i korakom od 2 (što određuje da se objedinjena područja ne preklapaju)
  • Konvolucijski sloj: Primjenjuje 36 filtera 5x5, s ReLU funkcijom aktivacije
  • Sloj za udruživanje br. 2: Ponovno izvodi maksimalno udruživanje s 2x2 filtrom i korakom od 2
  • 1.764 neurona, sa stopom regularizacije osipanja od 0,4 (vjerojatnost od 0,4 da će bilo koji element pasti tijekom treninga)
  • Gusti sloj (Logits Layer): 10 neurona, po jedan za svaku znamenku ciljane klase (0-9).

Tri su važna modula koja se koriste za stvaranje CNN-a:

  • conv2d (). Konstruira dvodimenzionalni konvolucijski sloj s brojem filtara, veličinom jezgre filtra, oblogom i funkcijom aktivacije kao argumentima.
  • max_pooling2d (). Konstruira dvodimenzionalni sloj za udruživanje pomoću algoritma za maksimalno udruživanje.
  • gusta (). Konstruira gusti sloj sa skrivenim slojevima i jedinicama

Definirat ćete funkciju za izgradnju CNN-a. Pogledajmo detaljno kako konstruirati svaki građevinski blok prije nego što sve zajedno zamotamo u funkciju.

Korak 2: Ulazni sloj

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

Morate definirati tenzor s oblikom podataka. Za to možete koristiti modul tf.reshape. U ovom modulu morate navesti tenzor da se preoblikuje i oblik tenzora. Prvi argument su značajke podataka, što je definirano u argumentu funkcije.

Slika ima visinu, širinu i kanal. Skup podataka MNIST jednobojna je slika veličine 28x28. Veličinu serije postavljamo na -1 u argumentu oblika tako da poprima oblik značajki ["x"]. Prednost je prilagoditi hiperparametre veličine serije. Ako je veličina serije postavljena na 7, tada će tenzor unositi 5.488 vrijednosti (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)

Prvi slojni sloj ima 14 filtara veličine zrna 5x5 s istim uloškom. Ista podloga znači da bi izlazni i ulazni tenzor trebali imati jednaku visinu i širinu. Tensorflow će dodati nule u retke i stupce kako bi osigurao jednaku veličinu.

Koristite funkciju aktivacije Relu. Izlazna veličina bit će [28, 28, 14].

Korak 4: Sloj za udruživanje

Sljedeći korak nakon konvolucije je proračun udruživanja. Izračun udruživanja smanjit će dimenzionalnost podataka. Možete koristiti modul max_pooling2d veličine 2x2 i koraka 2. Koristite prethodni sloj kao ulaz. Izlazna veličina bit će [batch_size, 14, 14, 14]

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

Korak 5: Drugi sloj sloja i sloj udruživanja

Drugi konvolucijski sloj ima 32 filtra, s izlaznom veličinom [batch_size, 14, 14, 32]. Sloj za udruživanje ima istu veličinu kao i prije, a izlazni oblik 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)

Korak 6: Gusti sloj

Zatim trebate definirati potpuno povezani sloj. Karta značajki mora se poravnati prije nego što se poveže s gustim slojem. Možete koristiti preoblikovanje modula veličine 7 * 7 * 36.

Gusti sloj spojit će 1764 neurona. Dodajete Relu funkciju aktivacije. Osim toga, dodajete termin reguliranja napuštanja sa stopom 0,3, što znači da će 30 posto utega biti postavljeno na 0. Imajte na umu da se napuštanje događa samo tijekom faze treninga. Funkcija cnn_model_fn ima način argumentiranja da izjavi treba li model trenirati ili procijeniti.

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)

Korak 7: Sloj Logit

Napokon, možete definirati zadnji sloj s predviđanjem modela. Izlazni oblik jednak je veličini serije i 10, ukupnom broju slika.

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

Možete stvoriti rječnik koji sadrži klase i vjerojatnost svakog razreda. Modul tf.argmax () s vraća najveću vrijednost ako su slojevi logita. Softmax funkcija vraća vjerojatnost svake klase.

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

Dicionarsko predviđanje želite vratiti samo kada je način rada postavljen na predviđanje. Ove kodove dodajete da biste prikazali predviđanja

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

Sljedeći se korak sastoji u izračunavanju gubitka modela. U posljednjem uputstvu saznali ste da je funkcija gubitka za višerazredni model unakrsna entropija. Gubitak se lako izračunava pomoću sljedećeg koda:

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

Posljednji korak je optimizacija modela, odnosno pronalaženje najboljih vrijednosti težina. Za to koristite optimizator spuštanja s gradijentom sa stopom učenja 0,001. Cilj je minimizirati gubitak

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

Gotovi ste s CNN-om. Međutim, želite prikazati mjerne podatke o izvedbi tijekom načina ocjenjivanja. Mjerne vrijednosti izvedbe za višerazredni model su metrike točnosti. Tensorflow je opremljen preciznošću modula s dva argumenta, oznakama i predviđenim vrijednostima.

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. Stvorili ste svoj prvi CNN i spremni ste sve umotati u funkciju kako biste ga koristili za obuku i procjenu 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)

Koraci u nastavku isti su kao i prethodni vodiči.

Prije svega, definirate procjenitelj s CNN modelom.

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

CNN-u treba mnogo puta da trenira, stoga stvarate kuku za bilježenje za pohranu vrijednosti softmax slojeva svakih 50 ponavljanja.

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

Spremni ste za procjenu modela. Postavite veličinu serije od 100 i promiješajte podatke. Imajte na umu da smo postavili korake treninga od 16.000, trenirati može puno vremena. Budi strpljiv.

# 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])

Sad kad je model osposobljen, možete ga procijeniti i ispisati 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 trenutnom arhitekturom dobivate točnost od 97%. Možete poboljšati arhitekturu, veličinu serije i broj ponavljanja kako biste poboljšali točnost. Neuronska mreža CNN-a pokazala se daleko boljom od ANN-a ili logističke regresije. U lekciji o umjetnoj neuronskoj mreži imali ste točnost od 96%, što je niže od CNN-a. Performanse CNN-a impresivne su s većim skupom slika , kako u smislu izračunavanja brzine, tako i preciznosti.

Sažetak

Konvolucijska neuronska mreža vrlo dobro djeluje na procjenu slike. Ova vrsta arhitekture je dominantna za prepoznavanje predmeta sa slike ili video zapisa.

Da biste izgradili CNN, morate slijediti šest koraka:

Korak 1: Ulazni sloj:

Ovaj korak preoblikuje podatke. Oblik je jednak kvadratnom korijenu broja piksela. Na primjer, ako slika ima 156 piksela, tada je oblik 26x26. Morate navesti ima li slika boju ili ne. Ako je odgovor da, tada ste imali 3 na oblik-3 za RGB-, inače 1.

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

Korak 2: Konvolucijski sloj

Dalje, trebate stvoriti konvolucijske slojeve. Primjenjujete različite filtre kako biste mreži omogućili da nauči važnu značajku. Određujete veličinu jezgre i količinu filtara.

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

Korak 3: Sloj za udruživanje

U trećem koraku dodajte sloj za udruživanje. Ovaj sloj smanjuje veličinu ulaza. To čini uzimajući maksimalnu vrijednost pod-matrice. Na primjer, ako je pod-matrica [3,1,3,2], udruživanje će vratiti maksimum, što je 3.

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

Korak 4: Dodajte sloj sloja i sloj za udruživanje

U ovom koraku možete dodati onoliko koliko želite slojeva konverzije i slojeva za spajanje. Google koristi arhitekturu s više od 20 slojeva konv.

Korak 5: Gusti sloj

Korak 5 izravnava prethodni da bi se stvorili potpuno povezani slojevi. U ovom koraku možete koristiti različite funkcije aktivacije i dodati efekt ispadanja.

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)

Korak 6: Logit sloj

Posljednji korak je predviđanje.

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