Телефонуйте » (+38) 096 227 41 41

Згорткові нейронні мережі (CNN) призначені для роботи з інтенсивностями пікселів і вивчення розрізняючих фільтрів, що дозволяє класифікувати зображення з високою точністю.

В цьому занятті використаємо зменшений варіант мережі VGGNet (назвемо її “SmallVGGNet”).

VGGNet-подібні моделі мають дві спільні особливості:

1.    Використовуються лише згорткові фільтри 3х3.
2.    Згорткові шари (“convolution layers”) чередуються з шарами підвиборки (“pooling layers”).

Приступимо до реалізації SmallVGGNet.

Відкриємо файл smallvggnet.py і вставимо туди наступний код:

Код 1

Як можемо помітити, все, що необхідно для SmallVGGNet, імпортується з Keras. З кожним із модулів можно ознайомитися в документації Keras.

Тепер визначимо наш клас SmallVGGNet (рядок 12) і метод збірки (build) (рядок 14):

Код 2

Для збірки необхідні чотири параметри: ширина вхідних зображень (width), висота (height), глибина кольору (depth) і число класів (classes).
Глибина також може інтерпретуватися як число каналів. Оскільки ми використовуємо RGB-зображення, то при виклику метода build будемо передавати глибину рівну 3.

Спочатку ініціалізуємо послідовну (Sequential) модель (рядок 17).
Потім визначимо порядок каналів. Keras підтримує "channels_last" (TensorFlow) і "channels_first" (Theano). Рядки 18-25 дозволяють використати будь-який з них.
Тепер додамо кілька шарів до мережі:

Код 3

В цьому блоці додаються шари CONV => RELU => POOL.
Перший шар CONV має 32 фільтри розміром 3х3.
Важливо, щоб ми вказали inputShape для першого шару, так як всі наступні розміри шарів будуть розраховуватися з використанням метода “просочування” (trickle-down).
В цій архітектурі мережі будемо використовувати функцію активації ReLU (Rectified Linear Unit). Також будуть використані: пакетна нормалізація (Batch Normalization), функція максимума (MaxPooling) і метод виключення (Dropout).

Пакетна нормалізація дозволяє маштабувати вхідні дані для передачі їх на наступний шар мережі. Доведено, що метод ефективно стабілізує і зменшує кількість кроків навчання CNN.

До шарів POOL застосовується функція поступового зменшення розміру (тобто ширини і висоти) вхідного шару. Зазвичай в архітектурі CNN шари POOL вставляються між шарами CONV, що йдуть послідовно.
Метод виключення деактивує випадкові нейрони між шарами. В результаті процес стає більш стійким: зменшується перенавчання, збільшується точність і нейромережа краще може розпізнавати незнайомі зображення. В нашому випадку (рядок 33) 25% нейронних з’єднань випадковим чином деактивуються між шарами для кожної ітерації навчання.

Переходимо до наступних шарів:

Код 4

Зверніть увагу, що розміри фільтра залишаються попередніми (3х3), а загальне число фільтрів збільшується з 32 до 64.
Потім іде набір шарів (CONV => RELU) * 3 => POOL:

Код 5

Знову ж, число фільтрів подвоїлось з 64 до 128, а розмір залишився попереднім. Збільшення загальної кількості фільтрів при зменшенні розміру вхідних даних в CNN - звичайна практика.
І, нарешті, останній набір шарів:

Код 6

Повністю зв’язані шари в Keras позначаються як Dense. Останній шар з’єднаний з трьома виходами (так як в нашому наборі даних три класи). Шар softmax повертає ймовірність належності до визначеного класу для кожної мітки.

Тепер, когда реалізована нейромережа SmallVGGNet, давайте напишемо сценарій для її навчання на наборі даних Animals.
Більша частина коду така ж, як і в попередньому занятті. Відкриваємо сценарій train_vgg.py:

Код 7

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

1.    Замість from keras.models import Sequential ми завантажуємо модель SmallVGGNet: from pyimagesearch.smallvggnet import SmallVGGNet
2.    Дані будуть доповнюватися за допомогою ImageDataGenerator.

Тепер аргументи командного рядка:

Код 8

Бачимо, що аргументи такі ж, як і в попередньому занятті.
Завантажуємо і попередньо обробляємо дані:

Код 9

Знову, майже ніяких відмінностей.
Розділяємо дані на навчальну і тестову вибірки та бінаризуємо мітки:

Код 10

Тепер доповнюємо дані:

Код 11

В рядках 75-77 ініціалізуємо генератор для додавання зображень.

Це дозволить нам створити додаткові навчальні дані з вже існуючих шляхом повороту, зсуву, обрізання і збільшення зображень.
Доповнення даних дозволить уникнути перенавчання і збільшить ефективність моделі. Рекомендується завжди виконувати цю операцію, якщо немає явних причин цього не робити.
Щоб зібрати нашу SmallVGGNet, просто викликаємо метод SmallVGGNet.build в процесі передачі необхідних параметрів (рядки 80 і 81).
Компілюємо і вчимо модель:

Код 12

Процес майже не відрізняється від попереднього прикладу, за винятком того, що, оскільки ми доповнюємо вхідні дані, замість model.fit викликається метод model.fit_generator. Генератор створює партії додаткових даних для навчання у відповідності з заданими раніше налаштуваннями.

Нарешті, оцінимо модель, побудувавши криві втрат/точності та збережемо її:

Код 13

Ми робимо прогнози на тестовій виборці, а потім оцінюємо точність класиффкації (рядки 103-105).
Побудова і збереження на диск графіків, моделі та міток аналогічні попередньому прикладу.
Продовжимо навчати нашу модель. Відкриваємо термінал і виконуємо наступну команду:

Переконаємось, що ми ввели всі аргументи командного рядка.

Навчання на CPU займе досить тривалий час - кожний з 75 кроків вимагає більше хвилини, а весь процес буде тривати близько півтори години.
GPU завершить процес значно швидше – кожен крок виконується всього за 2 секунди, як і продемонстровано.

Поглянемо на підсумковий графік навчання в каталозі output/:

Графік точності/втра
Рис.1. Графік точності/втрат демонструє, що ми отримали 78% точності на моделі SmallVGGNet.

Як можно побачити, ми досягли точності 78% на наборі зображень Animals з використанням згорткової нейронної мережі - значно вищої, ніж попереднє значення 60%.

Тепер можемо застосувати нашу навчену CNN для нових зображень:

Код 15

Нейромережа змогла впевнено розпізнати панду
Рис.2. Нейромережа змогла впевнено розпізнати панду

CNN повністю впевнена, що це панда.

Алгоритми CNN використовуються для пошуку зображень, наприклад, в Google Photo, але розпізнавання і класифікація фотографій - не єдиний приклад використання згорткових нейромереж: вони також добре себе показали, наприклад, в задачах обробки природньої мови (Natural Language Processing, NLP).

Література

1. https://www.reg.ru/blog/keras/
2. https://www.pyimagesearch.com/2018/09/10/keras-tutorial-how-to-get-started-with-keras-deep-learning-and-python/

Попереднє заняття - Наступне заняття

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс