Предварително обучени невронни мрежи в Keras

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

В Keras предварително обучените мрежи се намират в модула за приложения. Повечето от мрежите са проектирани да разпознават обекти в изображения от набора от данни на ImageNet, но има и мрежа за обработка на музика. Модулът съдържа следните мрежи:

  1. VGG16 - мрежа на Visual Geometry Group от Оксфордския университет за разпознаване на обекти в изображения, се състои от 16 слоя.
  2. VGG19 е друга мрежа на Visual Geometry Group за разпознаване на обекти, но съдържа 19 слоя.
  3. Inception v3 – невронната мрежа на Google за разпознаване на обекти в изображения.
  4. ResNet50 е невронна мрежа на Microsoft, която използва остатъчно обучение (остатъчно обучение). Използва се за разпознаване на обекти в изображения.
  5. Xception е модификация на мрежата Inception от създателя на Keras François Chollet.
  6. CRNN за музикално маркиране е конволюционна рекурентна невронна мрежа за музикална класификация.

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

Набор от данни на ImageNet

Нека започнем с набора от данни ImageNet, който се използва за обучение на повечето невронни мрежи в Keras. Това е отворен набор от данни от 14 милиона изображения. За всяко изображение,какъв обект има върху него. По този начин ImageNet може да се използва за контролирано обучение.

ImageNet съдържа двадесет и една хиляди класа обекти, но невронните мрежи са обучени да разпознават само 1000 от тях (което е много в сравнение с CIFAR-10 и други подобни набори от изображения). В ImageNet класовете образуват йерархия. Например, посочва се, че изображението не е просто котка, а определен вид котка (сиамска, египетска и др.).

Мрежова архитектура VGG16

VGG16 е конволюционна невронна мрежа, която съдържа 16 слоя. Мрежата се състои от две части:

  1. Първата част на мрежата подчертавафункции в изображението. Състои се от редуващи се каскади на навиване и подизвадка. Първо има два етапа конволюция-конволюция-подпроба, а след това три етапа конволюция-конволюция-конволюция-подпроба. Размерът на конволюционния възел във всички слоеве е 3x3. При вземане на подизвадка максималната стойност (Max Pooling) се избира от квадрат 2x2.
  2. Втората част отговаря закласифицирането на обекта в изображението според характеристиките, избрани на предишния етап. Тази част съдържа 3 напълно свързани слоя. В първите два слоя има 4096 неврона, а в последния - 1000 неврона (според броя на класовете обекти).

На входа мрежата VGG16 получава изображение от 224x224 пиксела, 3 цветни канала (червен, зелен и син). На изхода мрежата дава вероятностите (в един горещ формат на кодиране), че този или онзи клас обекти е в изображението.

Невронна мрежа VGG16 в Keras

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

След това създаваме VGG16 мрежа и зареждаме теглата, обучени в набора от данни на ImageNet:

Първият път, когато стартирате програмата, тази команда можебягайте достатъчно дълго, защото трябва да заредите голям HDF5 файл със запазени тегла. След това файлът се записва в кеша на Keras на диска и теглата ще се зареждат по-бързо.

Заредете изображението, преобразувайте го в масив numpy и направете предварителна обработка:

Извършваме разпознаване на обект в изображението:

Резултатът от разпознаването е масив от 1000 елемента. Нека изберем 3 елемента с най-голяма вероятност и да ги отпечатаме:

Тестване на мрежата VGG16

Нека се опитаме да тестваме как предварително обучената VGG16 мрежа се справя с разпознаването на обекти в изображения.

Първо, разбира се, нека се опитаме да разпознаем котката:

предварително

Програмата дава следните резултати:

Първият резултат е Egyptian_cat, неговата вероятност е около 72%. Числото 02124075 е етикетът на класа Egyptian_cat в набора от данни на ImageNet. На второ място е таби (това също е порода котки) с вероятност от приблизително 8%. След това идва tiger_cat с вероятност под 5%. Не разбирам много добре породите котки, но мрежата ясно определи, че котката е на снимката.

Сега нека тестваме мрежата върху снимките на самолета и кораба. Да започнем със самолета:

предварително

Програмата извежда следното:

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

Сега нека се опитаме да разпознаем кораба:

обучени

Мрежата издава няколко вида кораби:

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

Трансферизучаване на

Сега един от най-популярните подходи за практическо обучение на дълбоки невронни мрежи е трансферното обучение. В този случай се взема предварително обучена мрежа, например VGG16, Inception или ResNet, и се обучава отново на нашите данни. С този подход са необходими много по-малко данни за обучение, т.к мрежата вече е обучена да извлича характеристиките, от които се нуждаем, например в набора от данни на ImageNet. Като правило също така отнема по-малко време за допълнително обучение в сравнение с обучението от нулата. В същото време може да се наложи да променим мрежовата архитектура, така че да решава задачите, от които се нуждаем. Как да направите това, ще разкажа в една от следващите статии.