Домашнее задание к занятию №3 (18.02)
Рекомендации
1
Используйте шаблон ноутбука

https://colab.research.google.com/drive/18Nfo1JP99AMuCYHdg2SLJG1iWS4GlyAp, чтобы отправить решение в соревнование по распознаванию рукописных цифр на Kaggle
2
Попробуйте изменить нейронную сеть, чтобы улучшить качество решения:

- Изменяйте количество нейронов в слоях
- Добавляйте новые скрытые слои
- Изменяйте количество эпох обучения
- Изменяйте размер мини-выборки (batch_size)
3
Во время обучения следите, чтобы не возникло переобучения
4
После подбора лучших гиперпараметров, обучите сеть еще раз на полном объеме данных без разделения на обучающий и проверочный наборы
5
Составьте отчет, который включает:

- Место в соревновании, которое вам удалось достичь
- Описание архитектуры нейронной сети и гиперпараметров обучения
- Ссылку на ноутбук с кодом, который вы использовали для обучения
- График качества обучения на обучающем и проверочном наборах данных
Задание Pro
1
Деление на группы

Есть гипотеза, что сеть ошибается неравномерно, что чаще сеть путает группы цифр между собой, например, цифры 1 и 7 или цифры 5 и 6

Возможно, сеть будет лучше работать, если распознавать не в рамках всех 10 цифр, а в рамках групп цифр, которые могут путаться

Суть в том, что мы делим все 10 цифр на группы похожих, например

1, 4, 7
0, 3, 8, 9
2, 5, 6
2
Построение нейронных сетей

Дальше мы строим несколько нейронных сетей

- сеть, которая отличает цифры внутри группы 1, 4 и 7
- сеть, которая отличает цифры внутри группы 0, 3, 8 и 9
- сеть, которая отличает цифры внутри группы 2, 5 и 6
- сеть, которая отличает эти три группы между собой

Для начала стоит сделать матрицу взаимных распознаваний цифр на тестовой выборке

Матрица будет 10 на 10, в ячейке i;j будет процент раз, сколько цифры i была сетью воспринята, как цифра j (процент из количества всех примеров цифры i)

Например, если у нас было 1000 цифр 7 в тестовой выборке и из них 12 были распознаны, как цифра 3, то в ячейке 7;3 будет записано 1.2% (то есть 12/1000)

Эта матрица поможет увидеть, как лучше распределить группы между собой - не просто из общего понимания похожести цифр, а из реальных данных, какие цифры сеть путает между собой

(сразу скажу, матрица будет ассиметричная, потому, что сеть может сильно чаще воспринимать 1 за 7, чем 7 за 1)
3
Обучение нейронных сетей

Далее ваша задача обучить несколько нейронных сетей

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

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

1, 4, 7 - [1, 0, 0]
0, 3, 8, 9 - [0, 1, 0]
2, 5, 6 - [0, 0, 1]

Также нужно поправить тестовую выборку для проверки точности распознавания

Обучите эту сеть и посмотрите точность на тестовой. Гипотеза, причём очень вероятная, что точность такой сети будет заметно выше, чем у сети, которая разделяет 10 цифр
4
Нейронные сети, для разделения групп

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

1 - [1, 0, 0]
4 - [0, 1, 0]
7 - [0, 0, 1]

Гипотеза, причём тоже очень вероятная, что точность такой сети будет заметно выше, чем у сети, которая разделяет 10 цифр
5
Каскад из сетей

Дальше соберите каскад из сетей

- первая сеть определяет, из какой группы эта цифра
- вторая сеть выбирается исходя из того, какую группу распознала первая сеть
- вторая сеть определяет итоговую цифру

Посчитайте итоговую ошибку на тестовой выборке такого каскада сетей и сравните с базовой сетью

Постройте матрицу взаимных ошибок распознавания каскадной сети и сравните с матрицей базовой сети

Для сравнения выберите базовую сеть на 800 нейронов, а каскадные сети протестируйте в 5-10 разных конфигурациях (количество слоёв и нейронов) и соберите результаты в таблицу