Мой 4-летний племянник Яли сейчас очень любит покемонов. У него есть несколько игрушек с покемонами и несколько карточек TCG (обучающая карточная игра).

На днях Яли обнаружил мой тайник с больными картами TCG, и теперь у него больше карт, чем он может обработать.

Проблема в том, что Яли слишком молод, чтобы научиться играть в настоящую игру, поэтому пока он изобрел свою собственную игру. Цель игры - классифицировать карты по их типу (покемон, энергия и карта тренера).

Он не спросил меня, откуда я знаю, какой тип карты, он взял несколько карт и спросил меня, какие у них типы. После нескольких моих ответов он смог разделить несколько карточек по типу (с множеством ошибок).

В тот момент я понял, что мой племянник - это, по сути, алгоритм машинного обучения, и моя задача как дяди - пометить данные для него.

Как дядя компьютерный компьютерщик и энтузиаст машинного обучения, я начал писать программу, которая будет конкурировать с Yali.

Вот как выглядят типичные карты покемонов:

Для взрослого человека, который умеет читать, довольно легко определить, какого типа карта, это буквально написано в верхней части карты. Но Яли 4 года, и он не умеет читать. Simple OCR решит мою проблему очень быстро, но я не хотел делать никаких предположений. Так что я взял карту как есть и закинул ее в нейронную сеть по алгоритму MLP.

Получить данные было довольно просто. Благодаря pkmncards я мог загружать изображения нескольких карточек, уже разделенных на категории Яли.

Алгоритму машинного обучения нужны функции, и моими функциями были пиксели изображения. Используя цветные изображения RGB, я преобразовал 3 цвета в одно целое число.

Поскольку изображения имеют разные размеры, мне пришлось их нормализовать. Найдя максимальную ширину и высоту своих данных, я добавил к маленьким изображениям заполнение нулями.

Быстрый цикл QA перед реальной сделкой. Я случайным образом взял по две карты каждого типа и сделал прогноз. Используя всего 100 карточек каждой категории, подгонка была на удивление быстрой, а прогнозы были ужасными. Затем я взял 500 образцов для каждой категории (исключая энергетический тип, который имел только 130 образцов) и запустил примерку.

Исключение нехватки памяти. Запуск подходящего кода в облаке должен работать, но я хотел найти способ использовать меньше места. Самый большой размер изображения был 800x635, что было слишком много. изменение размера изображений решило мою проблему.

Для настоящего теста, в дополнение к обычным карточкам, я добавил карточки, на которых рисовал, разрезал пополам, рисовал фигуры, делал снимок со своего телефона (у которого плохая камера) и другие спецэффекты. Важно отметить, что я не обучал сеть с помощью этих карточек.

Я перепробовал более тысячи моделей (а точнее 1533). Различные размеры изображения, количество скрытых слоев (до 3) и длина слоя (до 100), цвета изображения, типы чтения (все изображение, верхняя половина, каждый второй пиксель и т. Д.).

После многих часов подгонки всех моделей лучший результат составил 2 ошибки из 25 карт (несколько моделей имели такой результат, и каждая из них не справилась с разными картами. Все они были версией изображения в оттенках серого).

9 из 1533 моделей сделали 2 ошибки.

Комбинация моделей дала бы мне 1 ошибку, если бы я установил свой порог выше, чем согласие 44%. Для теста я буду использовать порог 50%.

Дав Яли поиграть на месяц, я вернулся на тест.

Победить! 23 для машины и 21 для человека.

Как видите, ошибки возникают только на энергетических картах. На pkmncards было всего 130 энергетических карт вместо тысяч других типов. Меньше образцов для изучения.

Спрашивая Яли, как он мог узнать некоторые карты, он сказал мне, что видел некоторых покемонов в телешоу или книгах. Вот как он переосмыслил ухо Райчу или узнал, что Вапереон - это водяной Иви. В моей программе не было таких данных, единственными данными, которые у меня были, были карты.

Когда наш герой победил Яли в испытании Покемон и получил значок ML, он переходит к своему следующему приключению.