Как создать нейросеть за 1 час?
Как устроена
нейросеть
Принцип работы нейросети похож на мозг человека. Нейросеть состоит из нейронов, которые принимают входные данные, обрабатывают их и передают обработанный результат на выход.
Входной
слой - первый
слой нейросети, который принимает входные данные. Каждый нейрон в этом слое
соответствует одному признаку (фиче) входных данных. Например, в задаче
классификации изображений каждый пиксель изображения может быть представлен
отдельным нейроном.
Скрытые слои являются посредниками между
входным и выходным слоями. Они обрабатывают данные, извлекая из них важные
признаки. Чем больше скрытых слоев, тем сложнее может быть нейросеть.
Выходной
слой - последний слой нейросети, который выдает результат обработки. Результат,
который выдаст выходной слой зависит от цели задачи..png)
Зеленым
цветом обозначены входные слои, голубым – скрытые слои, желтым – выходной слой
Выбор
задачи для нейросети
Нейросеть может генерировать текст, анализировать тональность текста, отвечать на вопросы, распознавать объекты на изображение и много чего еще. От вашего выбора зависит какую архитектуру нейросети и количество нейронов вы будете использовать.
В этой
статье мы рассмотрим нейросеть для распознавания рукописных цифр.
Архитектура
нейросети
Архитектур
нейросетей очень много. Разберем самые распространенные.
1. Сверточные нейросети (CNN). Они обрабатывают данные с сетчатой структурой. Широко используются в классификации изображений и распознавании объектов. Именно ее будем использовать для создания нашей нейросети.
2. Рекуррентные нейросети (RNN). Они обрабатывают последовательные данные. Их используют для генерации текста и машинного перевода текста (н-р, с английского на немецкий).
3. Долгосрочная краткосрочная память (LSTM). Это разновидность RNN, ее особенность в способности решать какую информацию сохранить, а какую забыть. Используют в задачах, требующих учета контекста.
4. Генеративные состязательные сети
(GAN). GAN состоят из двух нейросетей — генератора и дискриминатора, которые
обучаются одновременно. Генератор создает новые данные, а дискриминатор
оценивает их подлинность. Эту архитектуру используют для генерации изображений,
видео, музыки и т.д.
С теорией разобрались, теперь приступим к самой нейросети.
1. Выбор среды разработки
Для python лучше всего подходит PyCharm, но вы также можете использовать VisualStudio, SublimeText и другие. В статье будет
использоваться PyCharm.
Ссылкидляскачивания:
Pycharm - Download PyCharm: The Python IDE for data science and web development by JetBrains
Visual Studio - Download Visual Studio Code - Mac, Linux, Windows
Sublime Text - Sublime Text - Text Editing, Done
Right
2. Установка библиотек
Будем использовать библиотеки Keras и Tensorflow. Если вы работаете в PyCharm, то следуйте инструкциям.
1. Нажмите
на “Terminal”
2. Открывается
командная строка. В нее вводим pipinstalltensorflow, нажимаем Enter. Дальшенужноввести pip install keras
и pip install matplotlib..png)
3. Написание кода
1. Импортирование
установленных библиотек
Также нужно установить mnist. Mnist– это набор данных, на которых будем обучать нейросеть. Он
состоит из 60000 изображений для тестирования нейросети и 10000 для тренировки
нейросети. Размер изображений 28 на 28 пикселей.
Импортируем слои

2.
Загрузка данных.

3. Нормализование данных

В первых
скобках 1 число – количество изображений, 2 и 3 – размеры изображений, 4 цифра
– количество цветовых каналов.
Поскольку все изображения серые, то цветовой
канал 1.
4. Преобразование данных в
категориальный формат.
То есть представим
числа как набор. Это значит, что каждая метка будет представлена в виде вектора,
где только 1 элемент будет равен 1 (указывает на класс), а остальные элементы
равны 0. Например 7 будет представлено как [0,0,0,0,0,0,0,1,0,0].
Не
забывайте, что счет идет с 0, а не с 1.

5. Создание архитектуры CNN для нейросети
Модель Sequential позволяет добавлять строки
последовательно. Это значит, что каждый слой принимает на вход выход предыдущего
слоя.
Conv2D извлекает
признаки из изображений.
MaxPooling2Dуменьшает
размер изображения и фокусируется на ключевых признаках.
Flattenпреобразует
изображения в одномерный вектор. Мы используем Flatten, чтобы полносвязный слой Denseсмог обработать входные данные. Dense– слой в нейронной сети, в котором
все нейроны связаны с нейронами предыдущего слоя.
Дальше
используется функция активации relu, чтобы модель эффективнее обучалась и могла представлять
сложные зависимости в данных. Слой имеет 128 нейронов, чтобы модель эффективнее
обучалась.
В следующей
строке мы добавляем слой с 10 нейронами, каждый из которых соответствует классам
(от 0 до 9). Функция активации softmaxпреобразует выходные значения в вероятности принадлежности к
каждому классу.
6. Компилирование модели (настраивание
модели для обучения)
optimizer='adam'
корректирует скорость обучения для каждого параметра, что помогает быстрее и
эффективнее находить минимумы функции потерь.
loss='categorical_crossentropy'
определяет, как будет оцениваться разница между предсказанными вероятностями и
фактическими метками классов.
metrics=['accuracy']
оценивает точность модели.
7. Обучение модели
Мы дошли до
финишного шага. Осталось только обучить нашу нейросеть.
В этой
строке модели тренируется на данных x_trainи y_train. Обучение проходит в 5-ти эпохах.
Чем больше эпох, тем выше точность модели (помните, что оптимальное количество
эпох для каждой задачи свое и не допускайте переобучения). Batch_size- объем данных подаваемый модели
между вычислениями функции потерь
Написав эти
строки, вы можете запустить свой код. Если ошибок нет, то вы увидите:.png)
Accuracy-
точность модели, loss – потери.
8. Визуализирование и предсказание
результатов.png)
Используем
обученную модель для предсказывания классов на тестовом наборе данных.
Для визуализации используем matplotlib
.png)
В первой
строке берем из x_testпервое
изображение (не забываем, что счет идет с 0) и изменяем (reshape) его размер на 28 на 28 пикселей, параметр
cmap указывает, что изображение в градациях серого.
Во второй
строке задаем заголовок для графика. Для этого, используя форматирование, predictions[0].argmax()
возвращает предсказанный класс. А y_test[0].argmax() возвращает реальный класс
для первого изображения.
Визуализируем
с помощью plt_show.
Вы можете
запустить код, если ошибок нет, то увидите это:.png)
На данном изображении нейросеть справилась. Вы можете проверить и на других изображениях. Для этого вам нужно в x_test[0]; predictions[0]; y_test[0] в квадратных скобках изменить 0 на любую цифру (важно чтобы везде были одинаковые цифры).
На этом все!
Наша нейросеть полностью готова. Вы можете усложнить архитектуру нейросети,
использовать другие тестовые данные и еще многое другое.
Я желаю вам успеха в разработке нейросетей.
Автор статьи: Мина Манафова, ученица "САИКТ" на курсе "Разработка искусственного интеллекта на Python"