Этот пост я решил написать, для тех, кто также искал понятный код и рабочий пример, который можно было взять, вставить в гугл колаб(google colab) и сразу начать "играться" с кодом. Но не нашел. Для вас, друзья! P.S весь код будет в конце. Импортируем бэкэнд кераса, по началу, мы его использовать не будем, но некоторые функции нам понадобятся Импортируем сам пакет машинного обучения , его и будем использовать. Математические функции которые нам тоже понадобятся. Библиотека для вывода изображений. Для чего эта строчка? - нагуглите сами. Имортируем слои, вернее классы слоёв для нашей нейронной сети. Импорт нашей последовательной модели. Импортируем набор данных MNIST для нашего обучения. Загружаем данные функцией load_data из названия нашего датасета mnist и разделяем наш датасет на тренировочную выборку и тестовую. Давайте посмотрим, что за изображения у нас и в какой они форме. Вот, мы видим, что X_train представляет из себя массив данных с 60000 экземпляров картинок, которые имеют разрешение 28 на 28. Теперь давайте посмотрим , что такое y_train. Мы видим , что это просто массив из 60000 значений не и более того. А теперь давайте посмотрим, что же именно храниться в массивах, если X_train - массив изображений, давайте откроем одно! Выводим 12 изображение из массива, и это цифра 3 Вот мы и видим цифра 3 и картинку с цифрой 3! Как вы все знаете, значение пикселя может быть от 0 до 255, и если мы будем подавать в нейронную сеть такие данные. Пиксель со значением 0 и пиксель со значением 255 имеют очень разные масштабы значений. Нам очень тяжело будет учить модель. И чтобы их "нормировать", чтобы они были от 0 до 1 в идеале, мы разделим все наше "добро" на 255. 0 / 255 = 0 , 255 / 255 = 1, а любое число в диапазоне от 0 не до 255 будет просто дробью. Вот что мы получили: К сожалению, нельзя дать нейронке фото и сказать что это цифра 4, нужно это значение "векторизировать", это делается вот так: Получилось: Теперь давайте напишем саму модель нейронной сети. Инициализируем нашу модель. Дальше создаем наш первый слой, в нём будет 32 нейрона, также нужно указать форму входимых данных. Ещё дальше создаем 4 нейрона с такой же функцией активации. Мы вытягиваем данные в вектор. И тут мы сравниваем вектор с вектором, по сути это так. Тут компилируем нашу модель, оптимайзер - адам, потому-что он очень "классный", "categorical_crossentropy" - т.к мы определяем категории объектов. Теперь тренируем модель: Мы обучили нашу нейронную сеть и теперь, давайте посмотрим на результат. Будем использовать команду "model.evaluate", если перевести дословно - модель.оценивать Принимает проверочный датасет и смотрим какая потеря и какая точность: Как мы видим, точность - 96%. Создадим переменную k и запишем туда номер изображения в датасете и будем его вызывать. Указали цифру 6, значит цифра 4 находится под индексом 6. Давайте укажем индекс 10, получили цифру 0. Теперь посмотрим, как именно работает наша нейронная сеть. [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.] - единичка под индексом 4 , соответственно - цифра 4.  Визуально на картинке мы тоже видим цифру 4. Теперь давайте рассмотрим ответ нейронной сети: [[0.0000000e+00, 9.9408084e-18, 2.8947007e-22, 2.9116518e-10, 1.0000000e+00,   4.6417094e-17, 3.7773155e-38, 5.8520163e-07,, 3.7786970e-24, 4.3130936e-07]] * - буква e это значение степени, рассмотрим число - 4.6417094e-17  число 4.6417094e-17 - это условно 4.6427 в минус 17 степени,  это  примерно 0.00000000000000004642 то есть очень маленькое число. Посмотрим на весь массив и увидим, что есть число 0 в 0-ой степени ,  числа в отрицательной  степени , и то, что нам нужно 1 в степени 0, любое число в нулевой степени равно единице. Максимальный элемент массива под индексом 4, соответственно, цифра- 4. Изменим индекс и посмотрим, что будет. Тут видим, что исходя из степенней и чисел, мы видим, что большее число под индексом 0, соответственно и цифра 0.  Надеюсь, вам понравился мой пост и он будет вам полезен, вот весь код для вставки в гугл колаб: 2 блок кода: