Демонстрация на прост проект за машинно обучение, чиято цел е начинаещият да научи и разбере основите му и да може да прилага по-нататък.

Машинното обучение е очарователен метод за обучение на машина, така че да може да се държи като нас, хората, да мисли като нас, хората. Имаме силно обработен мозък, можем да предвидим човек или всеки обект с малко зрение. Можем лесно да разпознаем нечие поведение, ходене, стил на говорене с един поглед.

Но какво разбира една машина? Не разбира никакви снимки. По-скоро разбира някои стойности на пикселите. Познава числа или комбинация от числа. Така че, ако искаме една машина да се държи като човек, тогава трябва да инструктираме някои модели, използвайки число на машината, за да може да се учи. Това е начинът, по който алгоритъмът за машинно обучение превежда математическото уравнение в машина.

Тук се опитах да демонстрирам и опиша проекта за разпознаване на цифри с няколко основни прозрения. Надявам се да ви хареса и очевидно ще се поучите от него. И така, започваме.

Предпоставки

Ето необходимия модул, който трябва да инсталирате.

  1. Numpy (числова библиотека, използвана за научни изчисления)
  2. Matplotlib (за визуализация)
  3. Keras (За дефиниране на слоеве в невронна мрежа)
  4. Tensorflow (Keras изисква бекенд рамка Tensorflowза работа)

Точно като модул, набор от данни, съответстващ на нашия проект, е много необходим. Наборът от данни трябва да бъде правилно етикетиран, чист набор от данни. Нито един модел не може да се научи правилно.

Преглед и зареждане на набор от данни

Наборът от данни MNIST се използва за система за разпознаване на цифри и обработка на изображения. Разработен е от Националния институт за стандарти и технологии. Наборът от данни на MNIST съдържа 60 000 изображения за обучение и 10 000 изображения с (28, 28) форма за целите на тестване с подходящ етикет. Тъй като това е задача за класификация на цифри, етикетите са от 0 до 9. Можем да заредим набора от данни, като използваме този код, показан по-долу:

За визуализация можете да начертаете примери от набор от данни, както е показано по-долу:

На тази фигура тезислучайни проби са начертани заедно със съответните им етикетирани стойности върху изображението за демонстрация.

Предварителна обработка

При всеки проблем с машинното обучение предварителната обработка е задължителна и намалява изчислителните загуби и точността, ако е предварително обработена по правилен начин.

В ред 2 до 3 сме нормализирали нашите данни с максималната стойност на пикселите на изображението, за да го използваме в общ мащаб. Това не е изискване на невронната мрежа (NN), но помага на NN да транспонира входната променлива към фиксиран диапазон от данни.

В ред 6 и 7 ние кодирахме нашите етикетирани данни според метода на еднократно кодиране. Този метод помага при категорични променливи, където тези категориални характеристики също са ограничени, така че да могат да се прилагат ефективно. Например, ако 3 уникални етикета [2,0,1] се подадат в тази to_categoricalфункция, тя връща

[[0., 0., 1.],
 [1., 0., 0.],
 [0., 1., 0.]]

Поради този кодиран формат получаваме по-малък процент грешки по време на оптимизиране на теглото, което помага за сближаване на модела с желаните глобални минимуми.

Подготовка на данни и проектиране на архитектура на модела

Ще се опитаме да покрием проста невронна мрежа (NN) като модел за класификация на изображения.

Подготовка на данните:

Преди да създадем модел, трябва да имаме предвид как NN моделът приема входни данни. Формата на входните данни в NN модел трябва да бъде в [проби, характеристики] модел и тъй като ще тестваме този модел върху невиждани тестови данни, тези тестови данни трябва да бъдат по същия начин.

Ако наблюдаваме текущата форма на входния влак и тестовите данни е както по-долу:

Формата на данните за влака е (60000, 28, 28), а формата на данните за теста е (10000, 28, 28). Така че не можем да подадем тези данни към NN модел. Трябва да го преоформим в желания формат.

По този начин нашата процедура по подготовка на данните е завършена. Ако разпечатате неговата форма, ще получите форма във формат (60000, 784) и (10000, 784) съответно за данни за обучение и тест.

Дефиниция на NN модел

Сега можем да изградим нашия NN модел, състоящ се от един скрит Dense слой и един изходен слой. Можете лесно да създадете свой собствен персонализиран модел, като следвате тази проста структура на кода, дадена по-долу:

В горната снимка на кода ще забележите няколко важни параметъра като активиране, загуба, оптимизатор.

Активирането играе най-важна роля в класификацията. Тук в изходния слой е използвана функцията за активиране на softmax. Когато има няколко класа и няма да има взаимни класове между тях, тогава използваме функцията за активиране на softmax. Той прогнозира вероятността за всеки клас според представянето му на обучение. И сумата на вероятността за едно извадково предсказание ще бъде равна на 1.

Има друга функция за активиране sigmoid, подобна на softmax, тя също връща вероятност. Но тази функция за активиране се използва главно, когато има повече етикети в един клас.

Например, ако имаме изображение на куче и котка в една и съща рамка, тогава трябва да предвидим и двете. Така че ще трябва да имаме по-висока прогноза и в двата класа. Тук трябва да използваме тази функция за активиране на сигмоида. Може да предвиди за всеки клас независимо за всяка проба. Обяснявам това тук, за да изясня, че функцията за активиране играе ключова роля. Така че трябва да сме загрижени за използването му.

Обучение:

Сега е време за обучение за машина.

  1. Първо трябва да извикате дефинирания модел според неговия аргумент, ако е необходимо.
  2. За обучение трябва да използвате model.fit(). Тук има няколко важни параметъра. Като: validation_split, епохи, batch_size и др.

С помощта на параметри validation_split разделяме нашия набор от данни за обучение на 2 части. Една част ще се използва за обучение, а друга част ще се използва за валидиране на ефективността на модела едновременно. Всеки трябва да използва този параметър, за да има по-добра производителност при невидяни данни.

След това можем да видим епохи друг параметър. Отнася се колко итерации ще използваме, за да определим най-добрия модел.

Когато обучаваме данни, няколко проби от целия набор от данни се използват за всяка епоха, за да разпределят пълния масив, този параметър се споменава от batch_size.

След това настройването на подробна променлива ви позволява как искате да видите прогресията на вашия модел. verbose= 0 означава, че прогресията ще бъде скрита, verbose= 1 показва анимираната лента за напредъка заедно със стойността на загуба, точност. verbose = 2 показва прогресия само на епоха.

И така, нека започнем нашето обучение по модел, използвайки кода по-долу:

Поради verbose = 1, прогресията върви по следния начин:

Вашият модел е готов и можете да начертаете прогресията на вашия модел, като използвате кода, даден по-долу:

Това е графика на кривата на загубите за 30 епохи. Можете да видите как нашият модел се сближава с минималната стойност на загубата в първия подграфик и как моделът придобива точност във втория подграфик. Във всяка епоха нашият модел се оптимизира и можем да видим резултата тук.

Сега можем да оценим производителността на нашия модел върху невидими данни, прилагайки model.evaluate().

Открихме грешка само в данните от теста 2,07%. Това е страхотно изпълнение на нашата цел. За ваша собствена демонстрация можете да тествате всяка проба по ваш избор, като използвате model.predict(), демонстриран по-долу. Използваме np.argmax()за да намерим индекса с максимална вероятност.

Ако тествате тази 456 номерирана проба, ще намерите прогнозирания резултат като 2. Можете да опитате различни проби в променливата sample_no.

Това е всичко от мен днес. Надявам се, че сте харесали това въведение и сте се поучили от него. Благодаря, че прочетохте тази статия.