Урок за изкуствена невронна мрежа с примери за TensorFlow ANN
Какво е изкуствена невронна мрежа?
An Изкуствена невронна мрежа (ANN) е компютърна система, вдъхновена от биологични невронни мрежи за създаване на изкуствени мозъци, базирани на колекция от свързани единици, наречени изкуствени неврони. Той е предназначен да анализира и обработва информация като хора. Изкуствената невронна мрежа има способности за самообучение, за да произвежда по-добри резултати, когато има повече данни.
Изкуствената невронна мрежа (ANN) се състои от четири основни обекта:
- Слоеве: цялото обучение се случва в слоевете. Има 3 слоя 1) вход 2) скрит и 3) изход
- Функция и етикет: Входни данни към мрежата (функции) и изход от мрежата (етикети)
- Функция на загуба: Метрика, използвана за оценка на ефективността на фазата на обучение
- Optimizer: Подобрете обучението чрез актуализиране на знанията в мрежата
Невронна мрежа ще вземе входните данни и ще ги вкара в ансамбъл от слоеве. Мрежата трябва да оцени своето представяне с функция на загуба. Функцията за загуба дава на мрежата представа за пътя, който трябва да измине, преди да овладее знанието. Мрежата трябва да подобри знанията си с помощта на оптимизатор.
Ако погледнете фигурата по-горе, ще разберете основния механизъм.
Програмата взема някои входни стойности и ги поставя в два напълно свързани слоя. Представете си, че имате математически проблем, първото нещо, което трябва да направите, е да прочетете съответната глава, за да решите проблема. Вие прилагате новите си знания, за да разрешите проблема. Има голяма вероятност да не постигнете много добри резултати. Същото е и за мрежа. Първият път, когато види данните и направи прогноза, те няма да съвпаднат напълно с действителните данни.
За да подобри знанията си, мрежата използва оптимизатор. В нашата аналогия оптимизаторът може да се разглежда като препрочитане на главата. Получавате нови прозрения/урок, като четете отново. По същия начин мрежата използва оптимизатора, актуализира знанията си и тества новите си знания, за да провери колко още трябва да научи. Програмата ще повтаря тази стъпка, докато направи възможно най-ниската грешка.
В нашата аналогия с математически задачи това означава, че четете главата от учебника много пъти, докато разберете напълно съдържанието на курса. Дори след многократно четене, ако продължавате да правите грешка, това означава, че сте достигнали капацитета на знания с текущия материал. Трябва да използвате различен учебник или да тествате различен метод, за да подобрите резултата си. За невронна мрежа това е същият процес. Ако грешката е далеч от 100%, но кривата е плоска, това означава с текущата архитектура; не може да научи нищо друго. Мрежата трябва да бъде по-добре оптимизирана, за да се подобрят знанията.
невронни мрежи Archiтекстура
Изкуствената невронна мрежа Archiструктурата се състои от следните компоненти:
- Слоеве
- Функция за активиране
- Функция на загуба
- Optimizer
Слоеве
Слоят е мястото, където се извършва цялото обучение. Вътре в един слой има безкрайно количество тежести (неврони). Типичната невронна мрежа често се обработва от плътно свързани слоеве (наричани още напълно свързани слоеве). Това означава, че всички входове са свързани към изхода.
Типичната невронна мрежа приема вектор на входа и скалар, който съдържа етикетите. Най-удобната настройка е двоична класификация само с два класа: 0 и 1.
Мрежата приема вход, изпраща го до всички свързани възли и изчислява сигнала с an активиране функция.
Фигурата по-горе описва тази идея. Първият слой е входните стойности за втория слой, наречен скрит слой, получава претегления вход от предишния слой
- Първият възел са входните стойности
- Невронът се разлага на входната част и функцията за активиране. Лявата част получава целия вход от предишния слой. Дясната част е сумата от входа, преминаващ във функция за активиране.
- Изходна стойност, изчислена от скритите слоеве и използвана за извършване на прогноза. За класификация е равен на номера на класа. За регресия се предвижда само една стойност.
Функция за активиране
Функцията за активиране на възел дефинира изхода, даден набор от входове. Нуждаете се от функция за активиране, за да позволите на мрежата да научи нелинеен модел. Обща функция за активиране е a Relu, ректифицирана линейна единица. Функцията дава нула за всички отрицателни стойности.
Другите функции за активиране са:
- Частично линейно
- сигмоидно
- танх
- Спукан Релу
Критичното решение, което трябва да вземете при изграждането на невронна мрежа, е:
- Колко слоя в невронната мрежа
- Колко скрити единици за всеки слой
Невронната мрежа с много слоеве и скрити единици може да научи сложно представяне на данните, но прави изчисленията на мрежата много скъпи.
Функция на загуба
След като сте дефинирали скритите слоеве и функцията за активиране, трябва да посочите функцията за загуба и оптимизатора.
За двоична класификация е обичайна практика да се използва двоична функция за загуба на кръстосана ентропия. В линейната регресия използвате средната квадратична грешка.
Функцията на загубите е важен показател за оценка на ефективността на оптимизатора. По време на обучението този показател ще бъде сведен до минимум. Трябва внимателно да изберете това количество в зависимост от вида на проблема, с който се справяте.
Optimizer
Функцията на загубите е мярка за производителността на модела. Оптимизаторът ще помогне за подобряване на теглата на мрежата, за да се намалят загубите. Има различни оптимизатори, но най-разпространеният е Stochastic Gradient Descent.
Конвенционалните оптимизатори са:
- Momentum оптимизация,
- Ускорен градиент на Нестеров,
- АдаГрад,
- Адам оптимизация
Ограничения на невронната мрежа
Следват ограниченията на невронната мрежа:
Пренастройване
Често срещан проблем със сложната невронна мрежа са трудностите при обобщаване на невидими данни. Невронна мрежа с много тегла може да идентифицира специфични детайли във влаковата композиция много добре, но често води до прекомерно оборудване. Ако данните са небалансирани в рамките на групите (т.е. няма достатъчно налични данни в някои групи), мрежата ще се научи много добре по време на обучението, но няма да има способността да обобщи такъв модел към никога невиждани преди данни.
В машинното обучение има компромис между оптимизация и генерализация.
Оптимизирането на модел изисква да се намерят най-добрите параметри, които минимизират загубата на набора за обучение.
Обобщението обаче показва как моделът се държи за невидяни данни.
За да попречите на модела да улови конкретни детайли или нежелани модели на данните за обучение, можете да използвате различни техники. Най-добрият метод е да имате балансиран набор от данни с достатъчно количество данни. Изкуството за намаляване на прекомерното оборудване се нарича узаконяване. Нека прегледаме някои конвенционални техники.
Размер на мрежата
Известно е, че невронна мрежа с твърде много слоеве и скрити единици е много сложна. Един прост начин за намаляване на сложността на модела е да се намали неговият размер. Няма най-добра практика за определяне на броя на слоевете. Трябва да започнете с малко количество слой и да увеличавате размера му, докато откриете, че моделът е прекалено подходящ.
Регулиране на теглото
Стандартна техника за предотвратяване на пренастройването е добавянето на ограничения към теглата на мрежата. Ограничението принуждава размера на мрежата да приема само малки стойности. Ограничението се добавя към функцията на загубата на грешката. Има два вида регулация:
L1: Ласо: Цената е пропорционална на абсолютната стойност на тегловните коефициенти
L2: Ридж: Цената е пропорционална на квадрата на стойността на тегловните коефициенти
Отпадат
Отпадането е странна, но полезна техника. Мрежа с отпадане означава, че някои тегла ще бъдат произволно зададени на нула. Представете си, че имате масив от тегла [0.1, 1.7, 0.7, -0.9]. Ако невронната мрежа има отпадане, тя ще стане [0.1, 0, 0, -0.9] с произволно разпределени 0. Параметърът, който контролира отпадането, е процентът на отпадане. Скоростта определя колко тегла да бъдат зададени на нули. Коефициентът между 0.2 и 0.5 е обичаен.
Пример за невронна мрежа в TensorFlow
Нека да видим пример за изкуствена невронна мрежа в действие за това как работи невронна мрежа за типичен проблем с класификацията. Има два входа, x1 и x2 с произволна стойност. Резултатът е двоичен клас. Целта е етикетът да се класифицира въз основа на двата признака. За да изпълни тази задача, архитектурата на невронната мрежа се дефинира, както следва:
- Два скрити слоя
- Първият слой има четири напълно свързани неврона
- Вторият слой има два напълно свързани неврона
- Функцията за активиране е Relu
- Добавете регулиране L2 със скорост на обучение от 0.003
Мрежата ще оптимизира теглото по време на 180 епохи с размер на партидата 10. В примерния видеоклип на ANN по-долу можете да видите как теглата се развиват и как мрежата подобрява класификационното картографиране.
Първо, мрежата присвоява произволни стойности на всички тегла.
- С произволните тегла, т.е. без оптимизация, загубата на изход е 0.453. Картината по-долу представя мрежата с различни цветове.
- Като цяло оранжевият цвят представлява отрицателни стойности, докато сините цветове показват положителните стойности.
- Точките от данни имат еднакво представяне; сините са положителните етикети, а оранжевите - отрицателните етикети.
Вътре във втория скрит слой линиите са оцветени след знака на теглата. Оранжевите линии определят отрицателни тегла, а синята - положителни тегла
Както можете да видите, в картографирането на изхода мрежата прави доста грешки. Нека да видим как се държи мрежата след оптимизация.
Картината на примера на ANN по-долу изобразява резултатите от оптимизираната мрежа. Първо, забелязвате, че мрежата успешно се е научила как да класифицира точката от данни. Можете да видите от снимката преди; първоначалното тегло беше -0.43, докато след оптимизация води до тегло -0.95.
Идеята може да се обобщи за мрежи с повече скрити слоеве и неврони. Можете да играете в връзка.
Как да тренирате невронна мрежа с TensorFlow
Ето процеса стъпка по стъпка за това как да обучите невронна мрежа с TensorFlow ANN с помощта на оценителя на API DNNClassifier.
Ще използваме набора от данни MNIST, за да обучим първата ви невронна мрежа. Обучение на невронна мрежа с TensorFlow не е много сложно. Стъпката на предварителната обработка изглежда точно както в предишните уроци. Ще продължите както следва:
- Стъпка 1: Импортирайте данните
- Стъпка 2: Трансформирайте данните
- Стъпка 3: Конструирайте тензора
- Стъпка 4: Изградете модела
- Стъпка 5: Обучете и оценете модела
- Стъпка 6: Подобрете модела
Стъпка 1) Импортирайте данните
На първо място, трябва да импортирате необходимата библиотека. Можете да импортирате набора от данни MNIST, като използвате scikit learn, както е показано в примера за невронна мрежа TensorFlow по-долу.
Наборът от данни MNIST е често използваният набор от данни за тестване на нови техники или алгоритми. Този набор от данни е колекция от изображения с размери 28 × 28 пиксела с ръкописна цифра от 0 до 9. В момента най-ниската грешка при теста е 0.27 процента с комитет от 7 конволюционни невронни мрежи.
import numpy as np import tensorflow as tf np.random.seed(1337)
Можете временно да изтеглите scikit learn на този адрес. Копирайте и поставете набора от данни в удобна папка. За да импортирате данните в python, можете да използвате fetch_mldata от scikit learn. Поставете пътя на файла във fetch_mldata, за да извлечете данните.
from sklearn.datasets import fetch_mldata mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/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 )
Стъпка 2) Трансформирайте данните
В предишния урок научихте, че трябва да трансформирате данните, за да ограничите ефекта на извънредните стойности. В този урок за невронни мрежи ще преобразувате данните с помощта на скалера min-max. Формулата е:
(X-min_x)/(max_x - min_x)
Scikit learns вече има функция за това: MinMaxScaler()
## 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))
Стъпка 3) Конструирайте тензора
Вече сте запознати с начина за създаване на тензор в Tensorflow. Можете да преобразувате комплекта влакове в цифрова колона.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Стъпка 4) Изградете модела
Архитектурата на невронната мрежа съдържа 2 скрити слоя с 300 единици за първия слой и 100 единици за втория. Използваме тези стойности въз основа на нашия собствен опит. Можете да настроите тези стойности и да видите как това се отразява на точността на мрежата.
За да изградите модела, използвате оценителя DNNClassifier. Можете да добавите броя на слоевете към аргументите feature_columns. Трябва да зададете броя на класовете на 10, тъй като има десет класа в набора за обучение. Вече сте запознати със синтаксиса на обекта за оценка. Колоните с характеристики на аргументите, броя на класовете и model_dir са точно същите като в предишния урок. Новият аргумент hidden_unit контролира броя на слоевете и колко възли да се свържат към невронната мрежа. В кода по-долу има два скрити слоя, като първият свързва 300 възела, а вторият е със 100 възела.
За да изградите оценителя, използвайте tf.estimator.DNNClassifier със следните параметри:
- feature_columns: Дефинирайте колоните, които да използвате в мрежата
- hidden_units: Определете броя на скритите неврони
- n_classes: Определете броя на класовете за прогнозиране
- model_dir: Дефинирайте пътя на TensorBoard
estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], n_classes=10, model_dir = '/train/DNN')
Стъпка 5) Обучете и оценете модела
Можете да използвате метода numpy, за да обучите модела и да го оцените
# Train the estimator train_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=50, shuffle=False, num_epochs=None) estimator.train(input_fn = train_input,steps=1000) eval_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, shuffle=False, batch_size=X_test_scaled.shape[0], num_epochs=1) estimator.evaluate(eval_input,steps=None)
Изход:
{'accuracy': 0.9637143, 'average_loss': 0.12014342, 'loss': 1682.0079, 'global_step': 1000}
Настоящата архитектура води до точност на набора за оценка от 96 процента.
Стъпка 6) Подобрете модела
Можете да опитате да подобрите модела, като добавите параметри за регулиране.
Ще използваме оптимизатор на Adam с процент на отпадане от 0.3, L1 от X и L2 от y. В невронната мрежа TensorFlow можете да контролирате оптимизатора, като използвате набора от обекти, следващ името на оптимизатора. TensorFlow е вграден API за оптимизатора Proximal AdaGrad.
За да добавите регулиране към дълбоката невронна мрежа, можете да използвате tf.train.ProximalAdagradOptimizer със следния параметър
- Скорост на учене: rate_Learning
- L1 регулация: l1_regularization_strength
- L2 регулация: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], dropout=0.3, n_classes = 10, optimizer=tf.train.ProximalAdagradOptimizer( learning_rate=0.01, l1_regularization_strength=0.01, l2_regularization_strength=0.01 ), model_dir = '/train/DNN1') estimator_imp.train(input_fn = train_input,steps=1000) estimator_imp.evaluate(eval_input,steps=None)
Изход:
{'accuracy': 0.95057142, 'average_loss': 0.17318928, 'loss': 2424.6499, 'global_step': 2000}
Стойностите, избрани за намаляване на пренапасването, не подобриха точността на модела. Вашият първи модел имаше точност от 96%, докато моделът с L2 регулатор има точност от 95%. Можете да опитате с различни стойности и да видите как това се отразява на точността.
Oбобщение
В този урок ще научите как да изградите невронна мрежа. Невронната мрежа изисква:
- Брой скрити слоеве
- Брой напълно свързани възли
- Функция за активиране
- Optimizer
- Брой класове
В TensorFlow ANN можете да обучите невронна мрежа за проблем с класификацията с:
- tf.estimator.DNNClassifier
Оценителят изисква да посочи:
- feature_columns=feature_columns,
- скрити_единици=[300, 100]
- n_класове=10
- model_dir
Можете да подобрите модела, като използвате различни оптимизатори. В този урок научихте как да използвате оптимизатора на Adam Grad със скорост на обучение и да добавите контрола, за да предотвратите пренастройването.