В стипендията Bertelsmann AI Udacity стипендиантите не само трябва да завършат курса AI Udacity, но също така се предизвикват един друг да прилагат уменията и знанията, които събират и практикуват по време на курса. Едно от тези предизвикателства е китайското предизвикателство за класификация на зодиакалните знаци. По случай, знаете, китайската лунна нова година.

Китайският зодиак е разделен на дванадесет годишни цикъла, като всяка година се идентифицира с определено животно.

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

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

Настройте средата

Първо най-важното. Използването на GPU би улеснило задачата, затова се опитах да използвам Google Colab и Kaggle Notebook, за да изградя този модел. Но тъй като ми харесва да мога да редактирам (добавям, променям, премествам или изтривам) данните си, предпочитам да използвам Google Colab, тъй като данните се съхраняват в моя Google Диск.

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

Имаме 12 класа изображения, които бихме искали нашият Pytorch модел да класифицира. Добра идея е да разделите данните на три групи — данни за обучение, в които обучаваме нашия модел, данни за валидиране и тестове, които ще използваме, за да гарантираме, че нашият модел не прекалява.

Нека първо проверим разпространението на тези данни.

Добре, така че за всяко обучение имаме 600 изображения за обучение (едно съкратено за goat), 54 изображения за валидиране (едно допълнително за goat, което е вероятно, защото това едно изображение е изгубено) и 54-55 тестови изображения.

На мен ми изглежда добре.

Нека да видим извадка от тези изображения.

И на мен ми изглежда добре. Можем също да видим, че включваме и изображения за рисуване (тъй като драконите не съществуват и всичко останало).

Създаване на модела с помощта на Pytorch

Едно от добрите неща на Pytorch (както и други рамки за машинно обучение/задълбочено обучение) е, че ни дава опростени шаблонни кодове. Едно от които е зареждането на данни за train-val-test.

Сега да изградим модела.

Ще използвам предварително обучения модел Resnet34, за да прехвърля наученото от него, за да изградя този класификационен модел. Опитах и ​​други предварително обучени модели като Resnet101 и VGG 19 с BatchNorm, но Resnet34 ми дава доста добра производителност, така че ще го направя. Resnet34 изисква входните изображения да имат ширина и височина 224.

Пълната архитектура на модела е по-долу.

Тук няма да използвам нищо много сложно. Само два допълнителни FC слоя с по 512 неврона всеки и един изходен слой с 12 неврона (разбира се, по един за всеки клас на зодиакален знак).

Обучение на модел

Сега идва първата вълнуваща част, обучението на модела.

Просто трябва да итерираме върху зареждащото устройство за данни на влака, докато извършваме (а) преминаване напред и назад на модела и (б) измерване на текущата/работна производителност на модела. Избирам да правя точка (b) на всеки 100 минипартиди.

Избрах да обуча модела през 7-15 епохи. Ще видите защо в тази диаграма по-долу.

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

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

Вторият модел е с Resnet50, почти същият с първия, освен че промених скоростта на обучение от 0,001 на 0,003. Третият използва VGG 19 с пакетна норма и скорост на обучение от 0,001.

Три различни модела+параметъра разказват една и съща история — ефективността на точността при валидиране не се подобрява значително след няколко епохи, колкото обучението (особено за последните два модела).

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

Тествайте модела

Нека видим дали моделите наистина са добри или се разпадат, отговаряйки на тестовия набор от данни.

  • ResNet (lr 0.001) — загуба: 0.355 acc: 90.5%
  • ResNet (lr 0.003) — загуба: 0.385 acc: 90.6%
  • VGG 19 с партидна норма — загуба: 0,586 acc: 90,8%

Като гледам точността, те са почти еднакви. За загуба, ResNet с 0,001 lr царува върховно. Тези числа са почти същите като нашето обучение и валидиране, така че можем да кажем, че нашият модел не прекалява (или поне го спряхме точно преди да го направи с нашата малка епоха) и работи доста добре за класифициране на китайските зодиакални знаци.

Интересно ми е с кои изображения има най-голям проблем.

Обичам числата в тази матрица на объркването.

Можем да видим, че моделът рядко бърка goat, но ако го прави, винаги е с ox (клаксони).

Виждаме също, че моделът имаше малко затруднения да различи dragon с други зодии. Най-вече с oxes (рога) и snake (тяло).

Последни думи

Работата върху предизвикателството за класифициране на китайския зодиакален знак по време на стипендията Bertelsmann AI Udacity беше страхотна и освежаваща. Това ме тласна и мотивира да правя това, което обичам — да експериментирам и да изграждам, в областта на AI/машинно обучение/задълбочено обучение.

Ще дойдат още предизвикателства и нямам търпение за това.

Можете да проверите моите тетрадки на моята страница в Github. Моля, прегледайте и следвайте :))