Класификација слика ТенсорФлов: ЦНН (конволуциона неуронска мрежа)

Преглед садржаја:

Anonim

Шта је конволуциона неуронска мрежа?

Конволуциона неуронска мрежа, такође позната као цонвнетс или ЦНН, добро је позната метода у апликацијама рачунарског вида. Ова врста архитектуре је доминантна за препознавање објеката са слике или видео записа.

У овом упутству ћете научити како конструисати цонвнет и како користити ТенсорФлов за решавање руком написаног скупа података.

У овом упутству ћете научити

  • Конволуциона неуронска мрежа
  • Архитектура конволуционе неуронске мреже
  • Компоненте Цонвнетс-а
  • Обучите ЦНН помоћу ТенсорФлов-а
  • Корак 1: Отпремање скупа података
  • Корак 2: Улазни слој
  • Корак 3: Конволуциони слој
  • Корак 4: Спајање слоја
  • Корак 5: Други слој слоја и слој удруживања
  • Корак 6: Густи слој
  • Корак 7: Логит Лаиер

Архитектура конволуционе неуронске мреже

Размислите о Фацебоок-у пре неколико година, након што сте слику поставили на свој профил, затражено је да ручно додате име лицу на слици. Данас Фацебоок користи цонвнет да аутоматски означи вашег пријатеља на слици.

Конволуциону неуронску мрежу није веома тешко разумети. Улазна слика се обрађује током фазе конволуције и касније јој се приписује ознака.

Типична цонвнет архитектура може се резимирати на доњој слици. Пре свега, слика се гура у мрежу; ово се назива улазном сликом. Затим, улазна слика пролази кроз бесконачан број корака; ово је конволутивни део мреже. Коначно, неуронска мрежа може предвидети цифру на слици.

Слика се састоји од низа пиксела висине и ширине. Слика у сивим тоновима има само један канал, док слика у боји има три канала (сваки за црвену, зелену и плаву). Канал је сложен један преко другог. У овом упутству ћете користити сиву слику са само једним каналом. Сваки пиксел има вредност од 0 до 255 да одражава интензитет боје. На пример, пиксел једнак 0 приказаће белу боју, док ће пиксел вредности близу 255 бити тамнији.

Погледајмо слику сачувану у скупу података МНИСТ. Слика испод приказује како представити слику левице у матричном формату. Имајте на уму да је оригинална матрица стандардизована на између 0 и 1. За тамније боје вредност у матрици је око 0,9, док бели пиксели имају вредност 0.

Конволуциона операција

Најкритичнија компонента у моделу је конволуциони слој. Овај део има за циљ смањење величине слике ради бржих израчунавања пондера и побољшање њене генерализације.

Током конволуционог дела, мрежа задржава битне карактеристике слике и искључује небитне шуме. На пример, модел учи како препознати слона на слици са планином у позадини. Ако користите традиционалну неуронску мрежу, модел ће доделити тежину свим пикселима, укључујући оне са планине, што није неопходно и може довести у заблуду мрежу.

Уместо тога, револуционарна неуронска мрежа користиће математичку технику за издвајање само најрелевантнијих пиксела. Ова математичка операција назива се конволуција. Ова техника омогућава мрежи да научи све сложеније карактеристике на сваком слоју. Конволуција дели матрицу на мале делове да би научила најважније елементе у сваком комаду.

Компоненте Цонвнетс-а

Постоје четири компоненте Цонвнетс-а

  1. Конволуција
  2. Нелинеарност (РеЛУ)
  3. Удруживање или подузорковање
  4. Класификација (потпуно повезан слој)
  • Конволуција

Сврха конволуције је локално издвајање карактеристика предмета на слици. То значи да ће мрежа научити одређене обрасце на слици и моћи ће да их препозна свуда на слици.

Конволуција је умножавање елемената. Концепт је лако разумљив. Рачунар ће скенирати део слике, обично димензија 3к3, и множи га у филтер. Излаз множења по елементима назива се карта карактеристика. Овај корак се понавља док се не скенира сва слика. Имајте на уму да се након конволуције величина слике смањује.

Испод се налази УРЛ који на делу види како функционише конволуција.

Доступни су бројни канали. У наставку смо навели неке од канала. Можете видети да сваки филтер има одређену намену. Напомена, на доњој слици; кернел је синоним филтера.

Извор

Аритметика иза конволуције

Конволуциона фаза ће применити филтер на мали низ пиксела на слици. Филтер ће се кретати дуж улазне слике општег облика 3к3 или 5к5. То значи да ће мрежа померити ове прозоре по целој улазној слици и израчунати конволуцију. Слика испод приказује како функционише конволуција. Величина закрпе је 3к3, а излазна матрица резултат је елементне операције између матрице слике и филтера.

Извор

Приметили сте да се ширина и висина излаза могу разликовати од ширине и висине уноса. То се дешава због ефекта границе.

Ефекат границе

Слика има мапу карактеристика 5к5 и филтер 3к3. У центру је само један прозор у којем филтер може приказати мрежу 3к3. Мапа излазних карактеристика смањиће се за две плочице заједно са димензијом 3к3.

Да бисте добили исту излазну димензију као и улазну димензију, морате додати додавање. Паддинг се састоји од додавања тачног броја редова и колона са сваке стране матрице. Омогућиће да се конволуција центрира на сваку улазну плочицу. На слици испод, улазно / излазна матрица имају исту димензију 5к5

Када дефинишете мрежу, савијеним карактеристикама управљају три параметра:

  1. Дубина: дефинише број филтера који ће се применити током конволуције. У претходном примеру сте видели дубину од 1, што значи да се користи само један филтер. У већини случајева постоји више од једног филтера. На доњој слици приказане су операције извршене у ситуацији са три филтера

  1. Стриде: Дефинише број „скока пиксела“ између две кришке. Ако је корак једнак 1, прозори ће се померити са ширином пиксела од једног. Ако је корак једнак двама, прозори ће скочити за 2 пиксела. Ако повећате корак, имаћете мање карактеристичне мапе.

Пример корака 1

Корак слике 2

  1. Нулти паддинг: Паддинг је операција додавања одговарајућег броја редова и ступаца са сваке стране мапа улазних карактеристика. У овом случају, излаз има исту димензију као и улаз.
  2. Нелинеарност (РеЛУ)

На крају операције савијања, излаз подлеже функцији активирања која омогућава нелинеарност. Уобичајена функција активирања за цонвнет је Релу. Сви пиксели са негативном вредношћу биће замењени нулом.

  • Максимално удруживање

Овај корак је лако разумљив. Сврха удруживања је смањити димензионалност улазне слике. Кораци се предузимају како би се смањила рачунска сложеност операције. Умањујући димензионалност, мрежа има ниже тежине за израчунавање, тако да спречава прекомерно опремање.

У овој фази треба да дефинишете величину и корак. Стандардни начин обједињавања улазне слике је коришћење максималне вредности мапе обележја. Погледајте слику испод. „Удруживање“ ће приказати четири подматрице мапе карактеристика 4к4 и вратити максималну вредност. Удруживање узима максималну вредност 2к2 низа, а затим помери овај прозор за два пиксела. На пример, прва под-матрица је [3,1,3,2], удруживање ће вратити максимум, што је 3.

Постоји још једна операција удруживања као што је средња вредност.

Ова операција агресивно смањује величину мапе обележја

  • Потпуно повезани слојеви

Последњи корак састоји се од изградње традиционалне вештачке неуронске мреже као што сте то урадили у претходном водичу. Све неуроне из претходног слоја повезујете са следећим. За класификацију броја на улазној слици користите функцију софтмак активације.

Укратко:

Конволуциона неуронска мрежа компајлира различите слојеве пре него што предвиди. Неуронска мрежа има:

  • Конволуциони слој
  • Релу функција активирања
  • Слој за удруживање
  • Густо повезан слој

Конволуциони слојеви примењују различите филтере на подрегији слике. Релу функција активирања додаје нелинеарност, а слојеви удруживања смањују димензионалност мапа карактеристика.

Сви ови слојеви извлаче битне информације са слика. Коначно, мапа карактеристика се доводи до примарног потпуно повезаног слоја са софтмак функцијом за предвиђање.

Обучите ЦНН помоћу ТенсорФлов-а

Сад кад сте упознати са грађевинским блоком конвнета, спремни сте да га направите помоћу ТенсорФлов-а. За класификацију слика користићемо скуп података МНИСТ.

Припрема података је иста као и у претходном водичу. Можете покренути кодове и прећи директно на архитектуру ЦНН-а.

Пратићете кораке у наставку:

Корак 1: Отпремање скупа података

Корак 2: Улазни слој

Корак 3: Конволуциони слој

Корак 4: Спајање слоја

Корак 5: Други слој слоја и слој удруживања

Корак 6: Густи слој

Корак 7: Логит Лаиер

Корак 1: Отпремање скупа података

Скуп података МНИСТ доступан је са сцикитом за учење на овој УРЛ адреси. Молимо вас преузмите га и сачувајте у Преузимањима. Можете га отпремити са фетцх_млдата ('МНИСТ оригинал').

Направите воз / тест сет

Скуп података морате поделити са траин_тест_сплит

Повећајте карактеристике

На крају, можете да прилагодите опцију помоћу МинМакСцалер-а

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

Дефинишите ЦНН

ЦНН користи филтере на необрађеном пикселу слике да би научио детаље узорака у поређењу са глобалним обрасцем са традиционалном неуронском мрежом. Да бисте конструисали ЦНН, морате дефинисати:

  1. Конволуциони слој: На мапу обележја примените н броја филтера. Након конволуције, морате да користите Релу функцију активације да бисте мрежи додали нелинеарност.
  2. Слој за удруживање: Следећи корак након конволуције је смањење узорка са макс. Сврха је смањити димензионалност мапе карактеристика како би се спречило прекомерно опремање и побољшала брзина рачунања. Максимално удруживање је конвенционална техника која дели карактеристичне мапе на подрегије (обично величине 2к2) и задржава само максималне вредности.
  3. Потпуно повезани слојеви: Сви неурони из претходних слојева повезани су са следећим слојевима. ЦНН ће класификовати етикету према карактеристикама конволуционих слојева и смањеним слојем за удруживање.

ЦНН архитектура

  • Конволуциони слој: примењује 14 филтера 5к5 (издвајање подрегија од 5к5 пиксела), са функцијом активирања РеЛУ
  • Слој за удруживање: Врши максимално удруживање са 2к2 филтером и кораком од 2 (што одређује да се обједињени региони не преклапају)
  • Конволуциони слој: примењује 36 филтера 5к5, са функцијом активирања РеЛУ
  • Слој за удруживање # 2: Поново изводи максимално удруживање са 2к2 филтером и кораком од 2
  • 1.764 неурона, са стопом регуларизације осипања од 0,4 (вероватноћа 0,4 да ће било који елемент бити испуштен током тренинга)
  • Густи слој (Логитс Лаиер): 10 неурона, по један за сваку цифру циљане класе (0-9).

Три су важна модула која треба користити за стварање ЦНН-а:

  • цонв2д (). Конструише дводимензионални слојни слој са бројем филтера, величином зрна филтера, облогом и функцијом активације као аргументима.
  • мак_поолинг2д (). Конструише дводимензионални слој удруживања користећи алгоритам максималног удруживања.
  • густ (). Конструише густи слој са скривеним слојевима и јединицама

Дефинисаћете функцију за изградњу ЦНН-а. Погледајмо детаљно како конструисати сваки грађевински блок пре него што све заједно умотамо у функцију.

Корак 2: Улазни слој

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

Треба да дефинишете тензор са обликом података. За то можете користити модул тф.ресхапе. У овом модулу морате да пријавите тензор да се преобликује и облик тензора. Први аргумент су карактеристике података, што је дефинисано у аргументу функције.

Слика има висину, ширину и канал. Скуп података МНИСТ је монохрона слика величине 28к28. Величину серије подешавамо на -1 у аргументу облика тако да поприма облик обележја [„к“]. Предност је прилагодити хиперпараметре величине серије. Ако је величина серије постављена на 7, тада ће тензор уносити 5.488 вредности (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)

Први слојни слој има 14 филтера величине зрна 5к5 са истим улошком. Иста подлога значи да и излазни тензор и улазни тензор треба да имају исту висину и ширину. Тенсорфлов ће додати нуле у редове и колоне да би обезбедио исту величину.

Користите функцију активације Релу. Излазна величина ће бити [28, 28, 14].

Корак 4: Спајање слоја

Следећи корак након конволуције је прорачун удруживања. Прорачун удруживања смањит ће димензионалност података. Можете користити модул мак_поолинг2д величине 2к2 и корака од 2. Као улаз користите претходни слој. Излазна величина ће бити [батцх_сизе, 14, 14, 14]

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

Корак 5: Други слој слоја и слој удруживања

Други слојни слој има 32 филтера, са излазном величином [батцх_сизе, 14, 14, 32]. Слој за удруживање има исту величину као и раније, а излазни облик је [батцх_сизе, 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: Густи слој

Затим треба да дефинишете потпуно повезани слој. Мапа карактеристика мора се поравнати пре него што се повеже са густим слојем. Можете користити преобликовање модула величине 7 * 7 * 36.

Густи слој ће повезати 1764 неурона. Додајете Релу функцију активације. Поред тога, додајете термин регулисања осипања са стопом од 0,3, што значи да ће 30 процената пондера бити постављено на 0. Имајте на уму да се осипање одвија само током фазе тренинга. Функција цнн_модел_фн има режим аргумента да изјави да ли модел треба обучити или процијенити.

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: Логит Лаиер

Коначно, последњи слој можете дефинисати предвиђањем модела. Излазни облик једнак је величини серије и 10, укупном броју слика.

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

Можете да направите речник који садржи класе и вероватноћу сваке класе. Модул тф.аргмак () са враћа највећу вредност ако је логит слој. Софтмак функција враћа вероватноћу сваке класе.

predictions = {# Generate predictions"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 (for both TRAIN and EVAL modes)loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

Последњи корак је оптимизација модела, односно проналажење најбољих вредности пондера. За то користите Градиент оптимизатор спуштања са стопом учења од 0,001. Циљ је минимизирати губитак

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

Готови сте са ЦНН-ом. Међутим, желите да прикажете показатеље перформанси током режима евалуације. Метрика перформанси за вишеразредни модел је метрика тачности. Тенсорфлов је опремљен прецизношћу модула са два аргумента, ознакама и предвиђеним вредностима.

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)

То је то. Креирали сте свој први ЦНН и спремни сте да све умотате у функцију како бисте је користили за обуку и процену модела.

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)

Кораци у наставку су исти као и претходни водичи.

Пре свега, ви дефинишете процењивач помоћу ЦНН модела.

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

ЦНН-у треба много пута да би се истренирао, стога креирате куку за бележење за чување вредности софтмак слојева сваких 50 итерација.

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

Спремни сте за процену модела. Поставили сте величину пакета од 100 и премешали податке. Имајте на уму да смо поставили кораке обуке од 16.000, тренирање може потрајати пуно времена. Будите стрпљиви.

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

Сада када је модел обучен, можете га проценити и одштампати резултате

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

Са тренутном архитектуром добијате тачност од 97%. Можете побољшати архитектуру, величину серије и број итерација да бисте побољшали тачност. ЦНН-ова неуронска мрежа се показала далеко бољом од АНН-а или логистичке регресије. У лекцији о вештачкој неуронској мрежи имали сте тачност од 96%, што је ниже од ЦНН-а. Перформансе ЦНН-а су импресивне са већим сетом слика , како у погледу израчунавања брзине, тако и тачности.

Резиме

Конволуциона неуронска мрежа веома добро функционише за процену слике. Ова врста архитектуре је доминантна за препознавање објеката са слике или видео записа.

Да бисте направили ЦНН, потребно је да следите шест корака:

Корак 1: Улазни слој:

Овај корак преобликује податке. Облик је једнак квадратном корену броја пиксела. На пример, ако слика има 156 пиксела, тада је облик 26к26. Морате да наведете да ли слика има боју или не. Ако је одговор да, тада сте имали 3 облика 3 за РГБ-, иначе 1.

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

Корак 2: Конволуциони слој

Даље, треба да направите конволуционе слојеве. Примените различите филтере да бисте мрежи омогућили да научи важну функцију. Ви одредите величину језгра и количину филтера.

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

Корак 3: Слој за удруживање

У трећем кораку додајете слој за удруживање. Овај слој смањује величину улаза. То чини тако што узима максималну вредност под-матрице. На пример, ако је под-матрица [3,1,3,2], удруживање ће вратити максимум, што је 3.

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

Корак 4: Додајте слој слојева и слој удруживања

У овом кораку можете додати онолико колико желите слојева конверзије и слојева за обједињавање. Гоогле користи архитектуру са више од 20 слојева конв.

Корак 5: Густи слој

Корак 5 изравнава претходни да би створио потпуно повезане слојеве. У овом кораку можете користити различите функције активације и додати ефекат испадања.

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: Логит Лаиер

Последњи корак је предвиђање.

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