Uploaded by Vitaliy Kazakov

Нейронні мережі для аналізу зображень

advertisement
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ імені ІГОРЯ
СІКОРСЬКОГО»
Факультет інформатики та обчислювальної техніки
Кафедра технічної кібернетики
ЗВІТ
до Лабораторної робіти
З дисципліни
«Нейронні сітки та нейронні компьютерні
системи»
Перевірив:
Олійник В.В.
Виконав:
студент групи ЗПІ-ЗП 7209
Казаков В.Б
1. Завдання
Об'єктом дослідження є нейронні мережі, їх створення і застосування в різних завданнях.
Мета роботи - вивчення роботи нейронної мережі, вибір найкращої середовища розробки
нейронних мереж.
Результатом проведеної роботи є знайомство з бібліотекою Keras, докладне вивчення
роботи згортальних нейронних мереж для розпізнавання образів на зображенні, створення
невеликих програм з використанням нейронних мереж для особистих цілей.
2. Постановка завдання
1. Розглянути найбільш застосовані нейромережі для розпізнавання образів обєктів.
2. Вибрати найбільш ефективний віріант неромережі та реалізувати за допомогою
бібліотек Keras. Крім того, розглянути застосування біліотек Tensorflow, Theano,
Chainer.
3. Розробити конфігурацію нейромережі відповідно до особливостей застосування
нейромережі.
4. Вибрати данні для навчання та тестування нейромережі. (MNIST, CIFAR10, інші).
5. Розглянути основні параметри моделі та застосувати до моделі.
6. Провести навчання моделі та оцінити показники точності та помилки (accuracy and
loss).
3. Мотивація
На сьогоднішній момент, коло завдань, які можуть бути вирішені з використанням
нейронних мереж досить великий. До найпоширеніших можна віднести:
Розпізнавання образів і класифікація через розпізнаванні вхідного образу, символів
тексту, зображення і надання його належності до певного класу.
Під час навчання нейронної мережі, на вхід їй подають вектор значень ознак образу, з
зазначенням його класу. Після навчання, їй можна пред'являти невідомі раніше образи і
отримувати відповідь про належність до певного класу. У такого роду завданнях,
встановлюється відповідність між вихідним шаром штучної нейронної сітки і класом,
який він представляє.
Завдання кластеризації. Завдання кластеризації, відомі так само як класифікація
образів "без вчителя", не мають навчальної вибірки з мітками класів. Їх принцип роботи
заснований на виявленні закономірностей і подоби між образами і розміщенні цих образів
в один кластер або категорію.
Прогнозування. Здатність нейронних мереж до передбачення результатів обумовлена
узагальненням і виділенням загальних залежностей між вхідними та вихідними даними.
Після навчання, мережа здатна передбачити майбутнє значення деякої послідовності,
ґрунтуючись на її попередні зміни. Для того що б Штучна нейро мережа (сітка) могла дати
максимально точну відповідь, необхідно навчати її на даних, в яких дійсно простежуються
якась залежність. В іншому випадку, прогнозування швидше за все не дасть ніяких
результатів.
Апроксимація функцій. Завдання апроксимації полягає в знаходженні оцінки невідомої
функції, по її значенням.
Оптимізація. Способи оптимізації з використанням нейронних мереж, мають на увазі
знаходження такого рішення, яке задовольняє системі умов і мінімізує цільову функцію.
4. Датасет
Набір данньїх CIFAR -10 містить 60 000 кольорових зображень розміру 32 * 32 пікселя з 3
каналами, розбитих на 10 класів.
У навчальному наборі 40 000 зображень, в тестовому - 10 000.
5. Нейромережева модель
В данії роботі розглянуто завдання розпізнавання образу Computer Vision (об’єкту) для
подальшого використання у системі розпізнавання образів – предметів, обличь, для
системи безпеки або для автономних роботизованих систем або штучного інтелекту.
Мета - навчити машини візуалізувати та діяти відповідно, мінімізуючи людські помилки
та втручання.
Комп'ютерне бачення - це міждисциплінарна галузь науки, яка має на меті змусити
комп'ютери обробляти, аналізувати зображення та відео та витягувати деталі так само, як
це робить людський розум.
Глибокі нейронні мережі (DNN) мають більші можливості для розпізнавання
образів зображень і широко використовуються в алгоритмах Computer Vision.
Конволюційна нейронна мережа (CNN або ConvNet) - це клас DNN, який найчастіше
застосовується для аналізу візуальних зображень. Він використовується не тільки в
"Комп'ютерному баченні", але і для класифікації тексту в природній обробці мови (NLP).
Більшість завдань Computer Vision оточені навколо архітектур CNN, оскільки в основі
більшості проблем лежить класифікація зображення на відомі мітки.
Глибока сверточая нейронна мережа (ГСНМ) складається з великого числа шарів.
Зазвичай в ній чергуються шари двох типів - сверточньїе і пулінгова. Глибина фільтра
зростає зліва направо. На останніх зтапах зазвичай використовується один або кілька
повнозв'язних шарів.
6. Структура мережі
Згорткові нейронні мережі - адаптація звичайної нейронної мережі для роботи з
зображеннями. Повнозв'язні нейронні мережі матимуть занадто багато параметрів (вага
кожного нейрона дорівнюватиме ширині зображення на довжину на кількість каналів).
Це в кращому випадку призведе до перенавчання, в гіршому випадку навчання мережі
буде неможливо провести за доступний для огляду час.
Конволюціонний шар (Шар згортки)
У згортковій мережі для підготовки зображення і зменшення параметрів обробки
використовується операція згортки. Береться фільтр з довільною довжиною і шириною і
такою ж кількістю каналів, як і у вихідного зображення.
Рисунок 6.1. Шар згортки з застосуванням фільтру
Фільтр - це матриця, на яку множаться пікселі вихідного зображення. Потім
результати умножений складаються. Потім фільтр переміщається на 1 піксель вправо і
процес по-повторюється. В результаті виходить матриця, яка називається картою ознак.
Фільтри на першому шарі активуються (або виробляють значення більше деякого
порога), коли специфічні кордону або криві, які вони шукають, є у вступному зображенні.
У нейронної мережі є два основних елементи: фільтри і карти ознак.
Фільтр - це невелика матриця, що представляє ознаку, яку ми хочемо знайти на
оригінальному документі.
Приклад виділення фільтрів для конкретного зображення показаний на малюнку 6.2.
Рисунок 6.2. Фільтри
Активаціїний шар (нелініїний шар)
Цей шар додається після кожного з шарів згортки. Він використовує функцію
активації для доведення нелінійності до даних. Нелінійність означає, що зміна виводу не
пропорційна зміні вводу.
Ми вимагаємо цієї нелінійності, оскільки якби мережа була лінійною, не було б
сенсу додавати декілька шарів (кілька лінійних шарів еквівалентні одному шару).
Збільшуючи нелінійність, створюється складна мережа для пошуку нових шаблонів у
зображеннях.
Функцією активації тут може бути випрямлений лінійний блок (ReLU), Tanh або
будь-яка інша нелінійна функція активації.
Види функцій активації:
Relu: обчислюється дуже просто, мережа навчається швидко, відсікає непотрібні ознаки,
пре-перешкоджає розростанню і загасання градієнта, але значною мірою залежна від
початкових значень ваг і ненадійна. Графік функції Relu на рисунке 6.3.
Рисунок 6.3. Функція активації RELU
Сигмоид: легко обчислюється похідна, має безперервне вихідне значення в діапазоні
(0, 1). Є найпоширенішою функцією. Графік сигмоїда показаний на рисунку 6.4.
Рисунок 6.4. Сигмоїда
Гіперболічний тангенс: швидко обчислюється похідна, обмежена область значень
(від -1 до 1). Графік гіперболічного тангенса показаний на рисунке 6.5.
Рисунок 6.5. Гиперболічний тангенс
Але ця функція досить ресурсномістка і вразлива до розростання і загасання градієнта.
Шар пулінгу (Pooling layer)
Рисунок 6.5. Шар об’єднання (пулінгу)
Шар об'єднання використовується для подальшого зменшення розміру матриці.
Найпоширеніша форма шару об'єднання - з фільтрами розміром 2 × 2; застосовується з
кроком з двох зразків знизу на кожен зріз глибини вхідного сигналу по ширині та висоті,
відкидаючи 75 відсотків активацій.
Шар об'єднання зазвичай використовується для вибору найважливіших пікселів за
допомогою функції Max pooling, яка вибирає лише піксель найвищого значення,
присутній у фільтрі. Це зменшує кількість обчислень, необхідних для тренувань, отже,
значно скорочує час, необхідний для тренування нейронної мережі.
Об'єднання можна проводити різними способами:
Макс. Пул: Вибрано найбільший елемент в матриці.
Мінімальне об'єднання: вибрано найменший елемент у матриці.
Середнє об'єднання: Вибирається середнє значення елементів матриці.
Середнє об'єднання: Вибирається середнє значення елементів матриці.
Повністю пов'язаний шар (Fully connected layer)
У повністю пов'язаних шарах кожен нейрон з одного шару з'єднаний з кожним нейроном в
іншому шарі. Як правило, FC діє подібно до традиційної нейронної мережі,
,агатошарового перцептора (MLP). Однак єдиною відмінністю є те, що вхідні дані мають
форму та форму, створені попередніми етапами CNN.
Рисунок 6.6. Повністью пов’язаний шар
Мережа складається з шарів, які активуються послідовно. Три обов'язкових шару: згортки,
ПУЛІНГ і повнозв'язну шар. Перший шар має наступні параметри:
• Глибина - скільки ядер і коефіцієнтів зміщення буде задіяно в одному шарі;
• Висота і ширина кожного ядра;
• Крок - на скільки зміщується ядро на кожному кроці при обчисленні наступного пікселю результуючого зображення. Чим більше його значення, тим менше розмір вихіднихго зображення (1 за замовчуванням);
• Відступ: згортка будь-яким ядром розмірності більше, ніж 1х1 зменшено розмір
вихідної-го зображення. Так як в загальному випадку бажано зберігати розмір вихідного
зображення-ня, малюнок доповнюється нулями по краях.
Шар ПУЛІНГ зменшує обсяг мережі, викидаючи з зображення ті ознаки, які вже були
виявлені на попередньому етапі. Зазвичай вибираються максимальні за значенням признаки.
Повнозв'язну шар виводить вектор, за яким визначається потрібний клас. Розмір вектора
дорівнює числу класів. У кожному з елементів міститься інформація про ймовірність того,
що об'єкт належить цьому класу.
Примеры параметром слоев:
INPUT (вхідні дані) містять вихідну інформацію про зображення (нехай 32 - ширина, 32 висота, 3 - колірні канали R, G, B).
• Шар CONV (шар згортки) примножує значення фільтра на вихідні значення Пікслей
зображення (поелементне множення), після чого всі ці множення підсумовуються. Якщо
використовується 12 фільтрів, обсяг буде дорівнює 32 * 32 * 12 [32 × 32 × 12].
• Шар RELU (блок лінійної ректифікації) застосовує поелементну функцію акти-вації,
встановлюючи нульовий поріг. Іншими словами, RELU виконує наступні дії: якщо x> 0,
то обсяг залишається колишнім ([32 × 32 × 12]), а якщо x <0, то відсікаються непотрібні
деталі в каналі шляхом заміни на 0. Цим ми прибираємо непотрібні елементи.
• Шар POOL (шар ПУЛІНГ) виконує операцію понижувальної дискретизації розмі-рів.
Прибираємо незначні ознаки, які ми відсікли за допомогою RELU на попередньому етапі.
• Шар FC (повнозв'язну шар) виводить N-мірний вектор (N - число класів) для визначення
потрібного класу.
7. Приклади відомих сгорточних нейромереж та їх архітектура
ALEXNET
Рисунок 7.1. Схема АлексНет
AlexNet використовує функцію активації ReLu замість tanh, щоб додати
нелінійність, що прискорило швидкість тренувань (у 6 разів) та підвищило точність. Він
також використовує регуляризацію відсіву (методика запобігає складному пристосуванню
даних тренувань, щоб зменшити перевитрату). Ще одна особливість AlexNet полягає в
тому, що він перекриває об'єднання, щоб зменшити розмір мережі.
AlexNet має п’ять шарів згортки і три повністю пов'язаних шару. Функція ReLu
застосовується після кожного зведеного шару та повністю пов'язаного шару. Випадання
наноситься лише перед першим і другим повністю з'єднаним шаром.
Архітектура AlexNet має 62,3 мільйона параметрів і потребує 1,1 мільярда
обчислювальних одиниць у прямому проході.
GOOGLENET
Рисунок 7.2. Схема ГуглЛеНет
У мережі використовується CNN, за моделлю LeNet. Її архітектура містить 1 × 1
згортку в середині мережі, а середнє глобальне об'єднання використовується в кінці
мережі замість використання повністю пов'язаних шарів. Він також використовує модуль
Inception, щоб мати різні розміри / типи згортків для одного і того ж входу і складати всі
виходи. Він також використовує пакетну нормалізацію, спотворення зображення та
RMSprop.
У GoogLenet згортка 1 × 1 використовується як модуль зменшення розмірів для
зменшення обчислень. За рахунок зменшення вузького місця вузьких обчислень глибина
та ширина можуть бути збільшені.
Архітектура GoogLenet складається з 22-х рівневого CNN, але зменшує кількість
параметрів з 60 мільйонів (AlexNet) до 4 мільйонів.
VGGNet
Рисунок 7.3. Схема VGGNet
VGGNet складається з 16 згорточних шарів і дуже привабливий через свою дуже
єдину архітектуру. Схожий на AlexNet (3х3 згортки), але багато фільтрів.
В основному використовується для вилучення якісних характеристик із зображень.
VGG-16 використовується в якості основи для алгоритму виявлення об'єктів SSD
(визначення багатьох об’єктів за одним знімком), без повністю пов'язаних шарів.
RESNET
Рисунок 7.4. Схема ResNet
Він представляє архітектуру, яка складається з 152 шарів із пропущеними з'єднаннями
(закриті одиниці або повторювані одиниці з закритим типом) та має велику нормальну
партію.
Вся ідея ResNet полягає у протистоянні проблемі зниклих градієнтів. Зберігаючи
градієнти, зникаючі градієнти - це проблема, яка виникає в мережах з великою кількістю
шарів, оскільки ваги перших шарів не можуть бути оновлені правильно завдяки
зворотному розповсюдженню градієнта помилки (правило ланцюга помножує значення
градієнта помилок нижче, ніж один, а потім , коли похибка градієнта доходить до перших
шарів, його значення переходить до нуля).
8. Параметри нашої моделі
Датасет данні:
CIFAR_10 is a set of 60K images 32x32 pixels on 3 channels
IMG_CHANNELS = 3
IMG_ROWS = 32
IMG_COLS = 32
Вхідні дані для даної моделі:
BATCH_SIZE = 128
NB_EPOCH = 40
NB_CLASSES = 10
VERBOSE = 1
VALIDATION_SPLIT = 0.2
OPTIM = RMSprop()
Структура модели
В нашій мережі буде 32 згортальних фільтра розміру 3 * 3. Розмір виходу такої ж, як
розмір входу, т. Е. 32 * 32, а в якості опції активації використовується ReLU, що вносить
нелінійність.
Далі слід операція max-pooling з розміром блоку 2 х 2 і проріджування з коефіцієнтом
25%.
Наступний елемент конвеєра - щільний шар з 512 нейронами і функцією активації ReLU, а
за ним проріджування з коефіцієнтом 50% і вихідний шар softmax-класифікації з 10
класами, по одному на категорію.
model = Sequential()
model.add(Conv2D(32, kernel_size=3, padding='same', input_shape=(IMG_ROWS,
IMG_COLS, IMG_CHANNELS)))
model.add(Activation('relu'))
model.add(Conv2D(32, kernel_size=3, padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, kernel_size=3, padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))
9. Навчання мережі
Навчання полягає в тому, що на вхід нейромережі подаються зображення з навчального
набору даних. Початкові ваги нейронів призначаються випадковим чином.
Неактивована стан нейрона j для образу p:
𝑠𝑝𝑗 = Σ𝑤𝑖𝑗 𝑦𝑝𝑖𝑖, (9.1)
де spj - зважена сума виходів нейронів попереднього шару, пов'язаних з даними нейроном;
wij - вага зв'язку між нейронами i, j;
ypi - активоване вихід нейрона j з попереднього шару для образу p.
Виходом нейрона є значення функції активації:
𝑦𝑝𝑗 = 𝑓𝑗 (𝑠𝑝𝑗), (9.2)
де ypj - активований стан нейрона j для образу p;
fj - функція активації;
spj - Неактивована стан нейрона j для образу p.
Після того як алгоритм дійде до повнозв'язну шару, результат порівнюється з бажаним.
Різниця між ними - дельта помилки, яка використовується для налаштування ваг нейронів.
Функція помилки визначається за такою формулою:
𝐸𝑝 = 0.5 Σ (𝑡𝑝𝑗 - 𝑦𝑝𝑗) 2𝑗, (9.3)
де Ep - величина функції помилки для образу p;
tpj - бажаний вихід нейрона j для образу p;
ypj - активоване вихід нейрона j для образу p;
Дельта помилки мінімізується за рахунок зміни ваг нейронів. Для нейронів вихідного
шару така настройка дуже проста, для нейронів глибинних шарів використовується
алгоритм зворотного поширення помилки.
Помилка мінімізується методом градієнтного спуску. Ваги змінюються в сторону,
протилежну градієнту. До ваги додається величина:
Δ𝑤𝑖𝑗 = - η δ𝐸δ𝑤𝑖𝑗, (9.4)
де η задає швидкість навчання.
δ𝐸δ𝑤𝑖𝑗 = δ𝐸δ𝑦𝑗 * δ𝑦𝑗δ𝑠𝑗 * δ𝑠𝑗δ𝑤𝑖𝑗, (9.5)
де δ𝐸δ𝑦𝑗-помилка 𝑗-го нейрона; δ𝑦𝑗δ𝑠𝑗-похідна функції активації по її аргументу; δ𝑠𝑗δ𝑤𝑖𝑗вихід нейрона 𝑖 попереднього шару.
Помилка для прихованого шару розраховується за формулою:
δ𝐸δ𝑦𝑖 = δ𝑦𝑖δ𝑠𝑖Σδ𝐸δ𝑦𝑗 * 𝑤𝑖𝑗𝑗, (9.6)
Послідовно від останніх нейронів до перших обчислюється значення помилки і ваги
нейронів оновлюються.
Процес потрібно буде повторити кілька десятків-сотень разів. Ітерація алгоритму, при
якій мережа проходить навчальні приклади і потім коригує ваги, називається епохою.
Після кожної епохи дані перевіряються на тестовому наборі (необов'язково, але допомагає
оцінити якість навчання і зрозуміти, перенавчитися чи мережу, на ранніх етапах). За одну
епоху корекція ваг може відбуватися не на всіх прикладах, ті, поліпшення на яких
несуттєві, можна припустити, заощадивши час обчислень. Процес навчання проводиться
поки ваги і порогові рівні не стабілізуються, і середньоквадратична помилка не зійдеться
до мінімального значення.
Алгоритм зворотного поширення помилки може бути двох видів:
• Послідовний режим (Sequential):
Коригування ваг проводиться після кожного прикладу. Вимагає меншого обсягу
внутрішнього сховища для кожної синаптичного зв'язку. Корисно буде змінювати порядок
обробки прикладів для різних епох, щоб уникнути замкнутих циклів і зупинки алгоритму.
Простий в реалізації.
• Пакетний режим:
Коригування ваг після проходу усіх навчальних прикладів. Гарантує збіжність алгоритму
до локального мінімуму.
9.1. Проблеми перенавчання
Якщо точність алгоритму на тестових даних набагато нижче, ніж на навчальних, то це
мо-же означати, що мережа перенавчитися. У глибоких згортальних нейронних мереж
безліч параметрів, особливо це стосується повнозв'язних шарів. Перенавчання може
проявити себе в такій формі: якщо недостатньо навчальних прикладів, маленька група
нейронів може стати відповідальною за більшість обчислень, а решта нейрони стануть
надлишкові; або навпаки, деякі нейрони можуть нанести шкоду продуктивності, при
цьому інші нейрони з їх шару не будуть займатися нічим, окрім виправлення їх помилок.
Побачити це можна так: на певному етапі помилка на тестовому безлічі починає
зростати, при цьому помилка на навчальній множині продовжує зменшуватися. Одне з
рішень проблеми - поставити великий dropout (> 0.5). Dropout вимикає нейрон з мережі на
час ітерації з ймовірністю p. При тестуванні нейрони, не відкидаються, а вихід нейрона
множиться на 1-р. Таким образів на виході ми отримуємо математичне очікування реакції
нейрона по всіх варіантах мережі. Завдяки dropout мережа не буде залежати від невеликої
групи нейронів, а розглядатиме спільну думку.
Також перенавчання може означати, що даних для навчання недостатньо. Збільшення
розміру датасета може допомогти. Але це не завжди можна застосувати через збільшення
часу навчання або відсутності даних. Більш просунутий метод - регуляризація - це
алгоритм, який бореться з надто великими ваговими коефіцієнтами, які є наслідками
перенавчання. Цільова функція змінюється таким чином, щоб вона штрафувала великі
коефіцієнти. Це як правило не вирішує проблему повністю, але покращує точність мережі.
Ще один прийом - нормалізація пакетів. На вхід мережі кожну ітерацію подається
група зображень. На виході мережі можуть з'явитися як завгодно великі результати, які
приведуть до збільшення відповідних ваг. Тоді для кожного виходу мережі можна відняти
певну кількість і розділити результат на інше число, при цьому числа будуть однакові для
всього пакета. Таким чином, процентне співвідношення виходів збережеться, але тепер
вони не будуть критично збільшувати ваги.
Також потрібно оцінити графіки точності: чи не заходити за кордон, де починається
висока точність на навчальних прикладах, якщо точність на тестових прикладах нижче.
Навіть якщо точність на навчальній вибірці дорівнює 100%, це не гарантує гарну роботу
мережі.
Однією з проблем класичної сверточное нейронної мережі є підбір оптимального
значення розміру вікна нейрона в шарі ПУЛІНГ. Малі значення дозволяють підвищити
роздільну здатність мережі, тобто дають можливість знаходити більш непомітні ознаки,
але в той же час аналогічний ознака більшого масштабу буде пропущений і прийнятий за
сукупність інших. Таким чином, класична сверточное нейронна мережа погано працює з
зображеннями, на яких присутні однакові ознаки різного масштабу.
Під час градієнтного спуску мережу може потрапити в локальний мінімум, з якого не
може вибратися. Це відбувається, якщо вибрати невдалий крок. Зазвичай це вирішується
так: при попаданні в локальний мінімум шукається наступний локальний мінімум до тих
пір, поки знайти його не вдається.
Вибір розміру кроку: занадто малий крок веде до значного збільшення часу навчання.
Занадто великий крок може зупинити процес навчання, так як значення ваг можуть стати
дуже великими величинами. Тоді ці нейрони будуть функціонувати в області, де похідна
стискає функції дуже мала. Помилка пропорційна цієї похідної, через що алгоритм
зворотного поширення помилки завмирає.
Є думка, що насправді нейронні мережі не впорядковують дані і на кожному шарі
нейрони не піддаються навчанню розпізнавати все більш складні ознаки для наступного.
Щоб з'ясувати, чи правда це, можна знайти для конкретного нейрона таку силусиленну вхідних даних, яке максимізує вихідне значення. Яку б особливість це безліч ні
виділяла, передбачається, що нейрон реагує саме на неї. Було виявлено, що ознака,
виділений окремим нейроном, можна трактувати як змістовний не більше ніж у
випадкового безлічі нейронів. Тобто, якщо вибрати випадковим образом безліч нейронів і
знайти зображення, максимізує вихідне значення, ці зображення будуть настільки ж
схожі, як і в випадку c одним нейроном.
Цей факт веде до того, що в нейронної мережі є сліпі плями: об'єкти, які дуже близькі
до того, щоб їх класифікували правильно, але на яких мережа помиляється. У деяких
випадках невелика корекція зображення може вести до неправильного результату. При
цьому експерименти показали, що у кожного правильно певного об'єкта існує приклад,
візуально не відрізняється від нього, але який визначається неправильно, незалежно від
структури нейронної мережі або навчальної множини.
Також нейронні мережі можуть перестати працювати, якщо середовище постійно
змінюється. Оскільки заново збирати дані і тренувати мережу недоцільно, були придумані
динамічні нейронні мережі. Це мережі, які можуть змінювати свою архітектуру у
відповідь на зміни вхідних даних.
Мережі Хопфілда, наприклад, побудовані з нейронів, пов'язаних зворотними зв'язками
з кожним іншим нейроном. Всі нейрони є виходами. Вхідний образ вважається
початковим наближенням. Після якоїсь кількості ітерацій, мережа може зійтися до
стійкого стану одному з запам'ятали образів, похожеу на вхідний сигнал. Кожному з
запам'ятали образів відповідає мінімум функціоналу мережі. На будь яка зміна входу
мережу реагує тим, що окідает поточний мінімум і шукає новий.
10. Результати застосування нейромережі
10.1.
Програма нейроної сітки
from keras.datasets import cifar10
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.optimizers import SGD, Adam, RMSprop
import matplotlib.pyplot as plt
# Датасет CIFAR_10 дані 60K малюнків 32x32 пікселів 3 канали
IMG_CHANNELS = 3
IMG_ROWS = 32
IMG_COLS = 32
#параметри
BATCH_SIZE = 128
NB_EPOCH = 40
NB_CLASSES = 10
VERBOSE = 1
VALIDATION_SPLIT = 0.2
OPTIM = RMSprop()
#загрузка датасет
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
# конвертація до категорії
Y_train = np_utils.to_categorical(y_train, NB_CLASSES)
Y_test = np_utils.to_categorical(y_test, NB_CLASSES)
# нормалізація та приведення до літералів з плаваючою крапкою
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
# будова сітки
model = Sequential()
model.add(Conv2D(32, kernel_size=3, padding='same', input_shape=(IMG_ROWS,
IMG_COLS, IMG_CHANNELS)))
model.add(Activation('relu'))
model.add(Conv2D(32, kernel_size=3, padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, kernel_size=3, padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer=OPTIM,
metrics=['accuracy'])
# тренування
history = model.fit(X_train, Y_train, batch_size=BATCH_SIZE,
epochs=NB_EPOCH, validation_split=VALIDATION_SPLIT,
verbose=VERBOSE)
print('Testing...')
score = model.evaluate(X_test, Y_test,
batch_size=BATCH_SIZE, verbose=VERBOSE)
print("\nTest score:", score[0])
print('Test accuracy:', score[1])
#зберігання моделі для подальшого використання
model_json = model.to_json()
open('СNN_stuct.json', 'w').write(model_json)
model.save_weights('CNN_weights.h5', overwrite=True)
# друк даних розрахунків
print(history.history.keys())
# точність визначення
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# дані втрат\помилок
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
10.2.
Отриманні результати
Тест на 10 епох.
Тест на 40 епох
11.Висновки
Проводився експеримент з навчанням на одному сети даних застосовуючи різну
кількість епох – 10 та 40. Точнічть оцінки моделі виросла з 74 до 78%. Практика
подальшого збільшення кількості епох дає результати до певної межі після якої не
відбувається покращення точності сітки. Більше того, модель може перенавчатись та
зменшити точність. Крім того, для збільшення точності моделі можна провести додаткові
екперименти з додаванням шарів, змною активаціїниї функції та іншими параметрами
моделі.
На рисунку 11.1 наведена точність окремих нейромереж в залежності від їх побудови
шарів
Рисунок 10.1 Точність згорточних нейроних сіток
Download