Klasifikácia obrazu TensorFlow: CNN (konvolučná neurónová sieť)

Obsah:

Anonim

Čo je to konvolučná neurónová sieť?

Konvolučná neurónová sieť, tiež známa ako convnets alebo CNN, je dobre známou metódou v aplikáciách počítačového videnia. Tento typ architektúry je dominantný pri rozpoznávaní objektov z obrázku alebo videa.

V tomto tutoriáli sa dozviete, ako vytvoriť konvektor a ako používať TensorFlow na riešenie ručne napísanej množiny údajov.

V tomto návode sa naučíte

  • Konvolučná neurónová sieť
  • Architektúra konvolučnej neurónovej siete
  • Súčasti konvety
  • Trénujte CNN pomocou TensorFlow
  • Krok 1: Odovzdajte množinu údajov
  • Krok 2: Vstupná vrstva
  • Krok 3: Konvolučná vrstva
  • Krok 4: Spojovacia vrstva
  • Krok 5: Druhá vrstva konvolúcie a vrstva združovania
  • Krok 6: Hustá vrstva
  • Krok 7: Logitová vrstva

Architektúra konvolučnej neurónovej siete

Spomeňte si na Facebook pred niekoľkými rokmi, keď ste do svojho profilu nahrali obrázok, požiadalo vás, aby ste manuálne pridali meno k tvári na obrázku. V dnešnej dobe Facebook používa konvektor na automatické označovanie vašich priateľov na obrázku.

Konvolučná neurónová sieť nie je veľmi ťažké pochopiť. Vstupný obrázok sa spracuje počas fázy konvolucie a neskôr mu bude pridelený štítok.

Typickú architektúru konvektora je možné zhrnúť na obrázku nižšie. Najskôr sa obrázok prenesie do siete; nazýva sa to vstupný obrázok. Potom vstupný obraz prejde nekonečným počtom krokov; toto je konvolučná súčasť siete. Nakoniec môže neurónová sieť predpovedať číslicu na obrázku.

Obrázok sa skladá z poľa pixelov s výškou a šírkou. Obrázok v odtieňoch sivej má iba jeden kanál, zatiaľ čo farebný obrázok má tri kanály (každý pre červený, zelený a modrý). Kanál je naskladaný na seba. V tomto výučbe budete používať obrázok v odtieňoch sivej iba s jedným kanálom. Každý pixel má hodnotu od 0 do 255, aby odrážal intenzitu farby. Napríklad pixel rovný 0 bude mať bielu farbu, zatiaľ čo pixel s hodnotou blízkou 255 bude tmavší.

Poďme sa pozrieť na obrázok uložený v množine údajov MNIST. Obrázok nižšie ukazuje, ako reprezentovať obrázok ľavej strany v maticovom formáte. Pamätajte, že pôvodná matica bola štandardizovaná na hodnotu od 0 do 1. Pre tmavšiu farbu je hodnota v matici asi 0,9, zatiaľ čo biele pixely majú hodnotu 0.

Konvolučná operácia

Najdôležitejšou súčasťou modelu je konvolučná vrstva. Táto časť sa zameriava na zmenšenie veľkosti obrazu pre rýchlejší výpočet váh a zlepšenie jeho zovšeobecnenia.

Počas konvolučnej časti si sieť zachováva základné vlastnosti obrazu a vylučuje irelevantný šum. Model sa napríklad učí, ako spoznať slona na obrázku s horou v pozadí. Ak používate tradičnú neurónovú sieť, model priradí váhu všetkým pixelom vrátane pixelov z hora, čo nie je nevyhnutné a môže sieť uviesť do omylu.

Namiesto toho bude konvolučná neurónová sieť používať matematickú techniku ​​na extrahovanie iba tých najrelevantnejších pixelov. Táto matematická operácia sa nazýva konvolúcia. Táto technika umožňuje sieti naučiť sa čoraz zložitejšie funkcie v každej vrstve. Konvolúcia rozdeľuje maticu na malé kúsky, aby sa naučila najdôležitejšie prvky v každej časti.

Súčasti konvety

Konvety majú štyri komponenty

  1. Konvolúcia
  2. Nelinearita (ReLU)
  3. Združovanie alebo čiastkové vzorkovanie
  4. Klasifikácia (plne pripojená vrstva)
  • Konvolúcia

Účelom konvolúcie je lokálne extrahovanie vlastností objektu z obrázka. To znamená, že sieť sa naučí špecifické vzory v rámci obrázka a bude ho schopná rozpoznať všade na obrázku.

Konvolúcia je elementárne násobenie. Koncept je ľahko pochopiteľný. Počítač naskenuje časť obrázka, zvyčajne s rozmerom 3x3, a vynásobí ju filtrom. Výstup elementového násobenia sa nazýva mapa funkcií. Tento krok sa opakuje, kým sa nenaskenuje celý obrázok. Upozorňujeme, že po konvolácii sa veľkosť obrázka zmenší.

Nižšie je uvedená adresa URL, ktorá vám v akcii ukáže, ako funguje konvolúcia.

K dispozícii je veľa kanálov. Ďalej uvádzame zoznam niektorých kanálov. Vidíte, že každý filter má konkrétny účel. Upozorňujeme, že na obrázku nižšie; jadro je synonymom filtra.

Zdroj

Aritmetika za konvolúciou

Konvolučná fáza použije filter na malé pole pixelov v obraze. Filter sa bude pohybovať pozdĺž vstupného obrázka a má všeobecný tvar 3x3 alebo 5x5. To znamená, že sieť posunie tieto okná po celom vstupnom obraze a vypočíta konvolúciu. Obrázok nižšie ukazuje, ako funguje konvolúcia. Veľkosť opravy je 3x3 a výstupná matica je výsledkom prvkovej operácie medzi obrazovou maticou a filtrom.

Zdroj

Všimli ste si, že šírka a výška výstupu sa môže líšiť od šírky a výšky vstupu. Stáva sa to kvôli efektu hranice.

Efekt hranice

Obrázok má mapu funkcií 5x5 a filter 3x3. V strede je iba jedno okno, kde filter dokáže zobraziť mriežku 3x3. Mapa výstupných funkcií sa zmenší o dve dlaždice spolu s rozmerom 3x3.

Ak chcete získať rovnaký výstupný rozmer ako vstupný rozmer, musíte pridať výplň. Výplň spočíva v pridaní správneho počtu riadkov a stĺpcov na každú stranu matice. Umožní to, aby sa konvolúcia vycentrovala na každú vstupnú dlaždicu. Na obrázku nižšie má vstupno-výstupná matica rovnaký rozmer 5x5

Keď definujete sieť, súvisiace funkcie sa riadia tromi parametrami:

  1. Hĺbka: Definuje počet filtrov, ktoré sa majú použiť počas konvolúcie. V predchádzajúcom príklade ste videli hĺbku 1, čo znamená, že sa použil iba jeden filter. Vo väčšine prípadov existuje viac ako jeden filter. Obrázok nižšie ukazuje operácie vykonané v situácii s tromi filtrami

  1. Krok: Definuje počet „pixelových skokov“ medzi dvoma plátkami. Ak je krok rovný 1, okná sa budú pohybovať s rozpätím pixelov o jednu. Ak je krok rovný dvom, okná preskočia o 2 pixely. Ak zvýšite krok, budete mať k dispozícii menšie mapy funkcií.

Príklad kroku 1

Krok obrázku 2

  1. Nulová výplň: Výplň je operácia pridania zodpovedajúceho počtu riadkov a stĺpcov na každú stranu máp vstupných funkcií. V takom prípade má výstup rovnaký rozmer ako vstup.
  2. Nelinearita (ReLU)

Na konci operácie konvolúcie je výstup podrobený aktivačnej funkcii umožňujúcej nelinearitu. Obvyklou aktivačnou funkciou pre convnet je Relu. Všetky pixely so zápornou hodnotou budú nahradené nulou.

  • Prevádzka združovania max

Tento krok je ľahko pochopiteľný. Účelom združovania je znížiť rozmernosť vstupného obrazu. Kroky sa robia na zníženie výpočtovej zložitosti operácie. Znížením rozmernosti má sieť menšie výpočtové hmotnosti, takže zabráni preplneniu.

V tejto fáze musíte definovať veľkosť a krok. Štandardným spôsobom, ako zhromaždiť vstupný obrázok, je použitie maximálnej hodnoty mapy prvkov. Pozri sa na obrázok dole. "Združenie" zobrazí štyri submatice mapy funkcií 4x4 a vráti maximálnu hodnotu. Združenie má maximálnu hodnotu poľa 2x2 a potom posúva toto okno o dva pixely. Napríklad prvá podmatrica je [3,1,3,2], združenie vráti maximum, čo je 3.

Existuje ďalšia operácia združovania, napríklad priemerná.

Táto operácia agresívne zmenší veľkosť mapy funkcií

  • Plne spojené vrstvy

Posledný krok spočíva v zostavení tradičnej umelej neurónovej siete, ako ste to urobili v predchádzajúcom tutoriáli. Spojíte všetky neuróny z predchádzajúcej vrstvy do nasledujúcej vrstvy. Na klasifikáciu čísla na vstupnom obrázku používate aktivačnú funkciu softmax.

Rekapitulácia:

Konvolučná neurónová sieť pred vykonaním predikcie zostavuje rôzne vrstvy. Neurónová sieť má:

  • Konvolučná vrstva
  • Relu aktivačná funkcia
  • Spoločná vrstva
  • Husto spojená vrstva

Konvolučné vrstvy používajú rôzne podoblasti na podoblasť obrázka. Aktivačná funkcia Relu dodáva nelinearitu a združené vrstvy znižujú rozmernosť máp funkcií.

Všetky tieto vrstvy extrahujú zo snímok základné informácie. Nakoniec sa mapa funkcií napája na primárnu plne spojenú vrstvu s funkciou softmax, aby sa dala predpovedať.

Trénujte CNN pomocou TensorFlow

Teraz, keď ste sa oboznámili so stavebným prvkom konvektorov, ste pripravení vytvoriť jeden pomocou TensorFlow. Na klasifikáciu obrázkov použijeme dataset MNIST.

Príprava údajov je rovnaká ako v predchádzajúcom návode. Môžete spustiť kódy a preskočiť priamo na architektúru CNN.

Postupujete podľa nasledujúcich pokynov:

Krok 1: Odovzdajte množinu údajov

Krok 2: Vstupná vrstva

Krok 3: Konvolučná vrstva

Krok 4: Spojovacia vrstva

Krok 5: Druhá vrstva konvolúcie a vrstva združovania

Krok 6: Hustá vrstva

Krok 7: Logitová vrstva

Krok 1: Odovzdajte množinu údajov

Dátový súbor MNIST je k dispozícii so scikitom, ktorý sa dá naučiť na tejto adrese URL. Stiahnite si ho a uložte do priečinka Na stiahnutie. Môžete ich nahrať s fetch_mldata („originál MNIST“).

Vytvorte vlak / testovaciu súpravu

Musíte rozdeliť množinu údajov pomocou train_test_split

Škálovanie funkcií

Nakoniec môžete funkciu zmeniť pomocou 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:]

Definujte CNN

Televízia CNN používa filtre na surovom pixeli obrázka na získanie podrobného vzoru v porovnaní s globálnym vzorom pomocou tradičnej neurónovej siete. Ak chcete vytvoriť CNN, musíte definovať:

  1. Konvolučná vrstva: Použite n počet filtrov na mapu prvkov. Po konvolucii musíte na pridanie nelinearity do siete použiť aktivačnú funkciu Relu.
  2. Spoločná vrstva: Ďalším krokom po konvolúcii je převzorkovanie funkcie max. Účelom je znížiť rozmernosť mapy prvkov, aby sa zabránilo nadmernému preťaženiu, a zlepšiť rýchlosť výpočtu. Max pooling je konvenčná technika, ktorá rozdeľuje mapy funkcií na podoblasti (zvyčajne s veľkosťou 2x2) a zachováva iba maximálne hodnoty.
  3. Plne spojené vrstvy: Všetky neuróny z predchádzajúcich vrstiev sú spojené s nasledujúcimi vrstvami. CNN klasifikuje štítok podľa prvkov z konvolučných vrstiev a redukuje sa pomocou združenej vrstvy.

Architektúra CNN

  • Konvolučná vrstva: Aplikuje 14 filtrov 5x5 (extrahujúcich podoblasti 5x5 pixelov) s aktivačnou funkciou ReLU
  • Pooling Layer: Vykoná maximálne združenie s filtrom 2x2 a krokom 2 (čo určuje, že sa združené oblasti neprekrývajú)
  • Konvolučná vrstva: Aplikuje 36 filtrov 5x5 s aktivačnou funkciou ReLU
  • Layer Layer # 2: Opäť platí, že vykonáva maximálny pooling s filtrom 2x2 a krokom 2
  • 1 764 neurónov s mierou regularizácie vypadnutia 0,4 (pravdepodobnosť 0,4, že niektorý z prvkov bude počas tréningu vynechaný)
  • Hustá vrstva (vrstva Logits): 10 neurónov, jeden pre každú číslicu cieľovej triedy (0-9).

Pri vytváraní CNN sa používajú tri dôležité moduly:

  • conv2d (). Vytvorí dvojrozmernú konvolučnú vrstvu s počtom filtrov, veľkosťou jadra filtra, odsadením a aktivačnou funkciou ako argumenty.
  • max_pooling2d (). Konštruuje dvojrozmernú združovaciu vrstvu pomocou algoritmu max-združovania.
  • hustý (). Vytvorí hustú vrstvu so skrytými vrstvami a jednotkami

Definujete funkciu na zostavenie CNN. Pozrime sa podrobne, ako skonštruovať každý stavebný blok predtým, ako vo funkcii zabalíte všetko dohromady.

Krok 2: Vstupná vrstva

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

Musíte definovať tenzor s tvarom údajov. K tomu môžete použiť modul tf.reshape. V tomto module musíte deklarovať tenzor na zmenu tvaru a tvar tenzora. Prvým argumentom sú vlastnosti údajov, ktoré sú definované v argumente funkcie.

Obrázok má výšku, šírku a kanál. Datová sada MNIST je monochronický obrázok s veľkosťou 28x28. V argumente tvar sme nastavili veľkosť dávky na -1, aby získala tvar prvkov [„x“]. Výhodou je, že sa nastavia hyperparametre veľkosti dávky. Ak je veľkosť dávky nastavená na 7, potom bude tenzor napájať 5 488 hodnôt (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)

Prvá konvolučná vrstva má 14 filtrov s veľkosťou jadra 5x5 s rovnakou výplňou. Rovnaké polstrovanie znamená, že výstupný tenzor aj vstupný tenzor by mali mať rovnakú výšku a šírku. Tensorflow pridá nuly do riadkov a stĺpcov, aby sa zabezpečila rovnaká veľkosť.

Používate funkciu aktivácie Relu. Výstupná veľkosť bude [28, 28, 14].

Krok 4: Spojovacia vrstva

Ďalším krokom po konvolucii je výpočet združovania. Výpočet spoločného využívania zníži rozmernosť údajov. Môžete použiť modul max_pooling2d s veľkosťou 2x2 a krokom 2. Ako vstup použijete predchádzajúcu vrstvu. Výstupná veľkosť bude [batch_size, 14, 14, 14]

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

Krok 5: Druhá vrstva konvolúcie a vrstva združovania

Druhá konvolučná vrstva má 32 filtrov s výstupnou veľkosťou [batch_size, 14, 14, 32]. Spoločná vrstva má rovnakú veľkosť ako predtým a výstupný tvar 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)

Krok 6: Hustá vrstva

Potom musíte definovať úplne pripojenú vrstvu. Mapa prvkov musí byť pred spojením s hustou vrstvou vyrovnaná. Môžete použiť tvar modulu s veľkosťou 7 * 7 * 36.

Hustá vrstva spojí 1764 neurónov. Pridáte funkciu aktivácie Relu. Okrem toho pridáte regulačný termín pre predčasné ukončenie školenia s rýchlosťou 0,3, čo znamená, že 30 percent váh bude nastavených na 0. Upozorňujeme, že k predčasnému ukončeniu školenia dôjde iba počas tréningovej fázy. Funkcia cnn_model_fn má režim argumentov na vyhlásenie, či je potrebné model vyškoliť alebo vyhodnotiť.

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)

Krok 7: Logitová vrstva

Na záver môžete definovať poslednú vrstvu s predikciou modelu. Výstupný tvar sa rovná veľkosti dávky a 10, celkovému počtu obrázkov.

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

Môžete si vytvoriť slovník obsahujúci triedy a pravdepodobnosť každej triedy. Modul tf.argmax () s vracia najvyššiu hodnotu, ak sú vrstvy logitu. Funkcia softmax vracia pravdepodobnosť každej triedy.

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

Predikciu slovníka chcete vrátiť, iba ak je režim nastavený na predikciu. Tento kód pridáte, aby ste predišli prognózam

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

Ďalším krokom je výpočet straty modelu. V minulom návode ste sa naučili, že stratovou funkciou pre model s viac triedami je krížová entropia. Strata sa dá ľahko vypočítať pomocou nasledujúceho kódu:

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

Posledným krokom je optimalizácia modelu, to znamená nájdenie najlepších hodnôt váh. K tomu použijete gradientový optimalizátor klesania s rýchlosťou učenia 0,001. Cieľom je minimalizovať straty

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

Skončili ste s CNN. Chcete však zobraziť metriky výkonu počas hodnotiaceho režimu. Metriky výkonu pre model s viac triedami sú metriky presnosti. Tensorflow je vybavený presnosťou modulu s dvoma argumentmi, štítkami a predpokladanými hodnotami.

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 všetko. Vytvorili ste svoju prvú CNN a ste pripravení zabaliť všetko do funkcie, aby ste ju mohli použiť na trénovanie a vyhodnotenie modelu.

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)

Kroky nižšie sú rovnaké ako predchádzajúce návody.

Najskôr definujete odhad pomocou modelu CNN.

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

Tréning CNN trvá mnohokrát, preto si vytvoríte logovací hák na ukladanie hodnôt vrstiev softmax každých 50 iterácií.

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

Ste pripravení odhadnúť model. Nastavíte veľkosť dávky 100 a zamiešate údaje. Upozorňujeme, že sme nastavili tréningové kroky na 16 000, takže tréning môže trvať veľa času. Buď trpezlivý.

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

Teraz, keď je model trénovaný, môžete ho vyhodnotiť a vytlačiť výsledky

# 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}

Pri súčasnej architektúre získate presnosť 97%. Na zlepšenie presnosti môžete zmeniť architektúru, veľkosť dávky a počet iterácií. Neurónová sieť CNN si viedla oveľa lepšie ako ANN alebo logistická regresia. V tutoriáli o umelej neurónovej sieti ste mali presnosť 96%, čo je nižšia hodnota CNN. Výkony CNN sú pôsobivé pri väčšej množine obrázkov , a to z hľadiska výpočtu rýchlosti aj presnosti.

Zhrnutie

Konvolučná neurónová sieť funguje veľmi dobre na vyhodnotenie obrazu. Tento typ architektúry je dominantný pri rozpoznávaní objektov z obrázku alebo videa.

Ak chcete vytvoriť sieť CNN, musíte postupovať podľa šiestich krokov:

Krok 1: Vstupná vrstva:

Tento krok zmení tvar údajov. Tvar sa rovná druhej odmocnine počtu pixelov. Napríklad ak má obrázok 156 pixelov, má tvar 26 x 26 pixelov. Musíte určiť, či má obrázok farbu alebo nie. Ak áno, potom ste mali 3 na tvar - 3 pre RGB-, inak 1.

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

Krok 2: Konvolučná vrstva

Ďalej musíte vytvoriť konvolučné vrstvy. Pomocou rôznych filtrov umožníte sieti naučiť sa dôležitú funkciu. Zadáte veľkosť jadra a množstvo filtrov.

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

Krok 3: Spoločná vrstva

V treťom kroku pridáte vrstvu združovania. Táto vrstva zmenšuje veľkosť vstupu. Robí to tak, že berie maximálnu hodnotu submatice. Napríklad ak je podmatrica [3,1,3,2], združenie vráti maximum, čo je 3.

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

Krok 4: Pridajte vrstvu s konverziou a vrstvu združovania

V tomto kroku môžete pridať toľko, koľko chcete, konverzných vrstiev a združovacích vrstiev. Google používa architektúru s viac ako 20 konverznými vrstvami.

Krok 5: Hustá vrstva

Krok 5 vyrovná predchádzajúci, aby vytvoril úplne spojené vrstvy. V tomto kroku môžete použiť inú aktivačnú funkciu a pridať efekt vypadnutia.

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)

Krok 6: Logitová vrstva

Posledným krokom je predpoveď.

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