Проект глубокого обучения Python

Чтобы сделать машины более интеллектуальными, разработчики углубляются в методы машинного обучения и глубокого обучения. Человек учится выполнять задачу, практикуясь и повторяя ее снова и снова, чтобы запомнить, как выполнять задачи. Затем нейроны в его мозгу автоматически срабатывают, и они могут быстро выполнять усвоенную задачу. Глубокое обучение тоже очень похоже на это. Он использует разные типы архитектур нейронных сетей для разных типов задач. Например - распознавание объектов, классификация изображений и звука, обнаружение объектов, сегментация изображений и т. Д.

Что такое распознавание рукописных цифр?

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

О проекте Python Deep Learning

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

Предпосылки

Интересный проект Python требует от вас базовых знаний программирования на Python, глубокого обучения с библиотекой Keras и библиотеки Tkinter для создания графического интерфейса.

Установите необходимые библиотеки для этого проекта с помощью этой команды:

pip install NumPy, TensorFlow, Keras, подушку,

Набор данных MNIST

Это, вероятно, один из самых популярных наборов данных среди энтузиастов машинного обучения и глубокого обучения. Набор данных MNIST содержит 60 000 обучающих изображений рукописных цифр от нуля до девяти и 10 000 изображений для тестирования. Итак, набор данных MNIST состоит из 10 различных классов. Рукописные изображения цифр представлены в виде матрицы 28 × 28, где каждая ячейка содержит значение пикселя в градациях серого.

Создание проекта глубокого обучения Python на основе распознавания рукописных цифр

Ниже приведены шаги по реализации проекта распознавания рукописных цифр:

1. Импортируйте библиотеки и загрузите набор данных.

Во-первых, мы собираемся импортировать все модули, которые нам понадобятся для обучения нашей модели. Библиотека Keras уже содержит некоторые наборы данных, и MNIST - один из них. Таким образом, мы можем легко импортировать набор данных и начать с ним работать. Метод mnist.load_data () возвращает нам данные обучения, их метки, а также данные тестирования и их метки.

импортный керас

from keras.datasets import mnist

из keras.models импорт Последовательный

from keras.layers import Dense, Dropout, Flatten

из keras.layers импортировать Conv2D, MaxPooling2D

из keras импортировать бэкэнд как K

# данные, разделенные между обучающими и тестовыми наборами

(x_train, y_train), (x_test, y_test) = mnist.load_data ()

печать (x_train.shape, y_train.shape)

2. Предварительная обработка данных

Данные изображения не могут быть загружены непосредственно в модель, поэтому нам нужно выполнить некоторые операции и обработать данные, чтобы подготовить их для нашей нейронной сети. Размер обучающих данных (60000,28,28). Модель CNN потребует еще одного измерения, поэтому мы изменяем матрицу в форму (60000,28,28,1).

x_train = x_train.reshape (x_train.shape [0], 28, 28, 1)

x_test = x_test.reshape (x_test.shape [0], 28, 28, 1)

input_shape = (28, 28, 1)

# преобразовываем векторы классов в матрицы двоичных классов

y_train = keras.utils.to_categorical (y_train, num_classes)

y_test = keras.utils.to_categorical (y_test, num_classes)

x_train = x_train.astype («float32»)

x_test = x_test.astype («float32»)

x_train / = 255

x_test / = 255

print (‘x_train shape:’, x_train.shape)

print (x_train.shape [0], «обучающие образцы»)

print (x_test.shape [0], «тестовые образцы»)

3. Создайте модель.

Теперь мы создадим нашу модель CNN в проекте Python Data Science. Модель CNN обычно состоит из сверточных слоев и слоев объединения. Он лучше работает для данных, представленных в виде структур сетки, поэтому CNN хорошо работает для задач классификации изображений. Слой выпадения используется для деактивации некоторых нейронов и во время обучения снижает возможность подгонки модели. Затем мы скомпилируем модель с оптимизатором Adadelta.

batch_size = 128

num_classes = 10

эпох = 10

model = Последовательный ()

model.add (Conv2D (32, размер ядра = (3, 3), активация = ’relu’, input_shape = input_shape))

model.add (Conv2D (64, (3, 3), Activation = ’relu’))

model.add (MaxPooling2D (размер_пул = (2, 2)))

model.add (Выпадение (0,25))

model.add (Сглаживание ())

model.add (Dense (256, Activation = ’relu’))

model.add (Выпадение (0,5))

model.add (Dense (num_classes, activate = ’softmax’))

model.compile (loss = keras.losses.categorical_crossentropy, optimizer = keras.optimizers.Adadelta (), metrics = [‘precision’])

4. Обучите модель.

Функция Кераса model.fit () запустит обучение модели. Он принимает данные обучения, данные проверки, эпохи и размер пакета.

На обучение модели нужно время. После обучения мы сохраняем веса и определение модели в файле mnist.h5.

hist = model.fit (x_train, y_train, batch_size = batch_size, epochs = epochs, verbose = 1, validation_data = (x_test, y_test))

print («Модель успешно обучена»)

model.save (‘mnist.h5’)

print («Сохранение модели как mnist.h5»)

5. Оцените модель.

У нас есть 10 000 изображений в нашем наборе данных, которые будут использоваться для оценки того, насколько хорошо работает наша модель. Данные тестирования не участвовали в обучении данных, поэтому это новые данные для нашей модели. Набор данных MNIST хорошо сбалансирован, поэтому мы можем получить точность около 99%.

score = model.evaluate (x_test, y_test, verbose = 0)

print (‘Test loss:’, score [0])

print ("Проверка точности:", оценка [1])

6. Создайте графический интерфейс для предсказания цифр.

Теперь для графического интерфейса пользователя мы создали новый файл, в котором мы создаем интерактивное окно для рисования цифр на холсте, и с помощью кнопки мы можем распознать цифру. Библиотека Tkinter входит в стандартную библиотеку Python. Мы создали функцию pred_digit (), которая принимает изображение в качестве входных данных, а затем использует обученную модель для предсказания цифры.

Затем мы создаем класс App, который отвечает за создание графического интерфейса для нашего приложения. Мы создаем холст, на котором мы можем рисовать, фиксируя событие мыши, а с помощью кнопки запускаем функцию pred_digit () и отображаем результаты.

Вот полный код нашего файла gui_digit_recognizer.py:

из keras.models импортировать load_model

из tkinter import *

импортировать tkinter как tk

импорт win32gui

из PIL импортировать ImageGrab, Image

импортировать numpy как np

model = load_model (‘mnist.h5’)

def predic_digit (img):

# изменить размер изображения до 28x28 пикселей

img = img.resize ((28,28))

# преобразовать RGB в оттенки серого

img = img.convert («L»)

img = np.array (img)

#reshaping для поддержки ввода нашей модели и нормализации

img = img.reshape (1,28,28,1)

img = img / 255,0

# предсказание класса

res = model.predict ([img]) [0]

return np.argmax (res), max (res)

класс приложение (tk.Tk):

def __init __ (сам):

tk.Tk .__ init __ (сам)

self.x = self.y = 0

# Создание элементов

self.canvas = tk.Canvas (self, width = 300, height = 300, bg = «white», cursor = «cross»)

self.label = tk.Label (self, text = ”Thinking ..”, font = (“Helvetica”, 48))

self.classify_btn = tk.Button (self, text = «Распознать», command = self.classify_handwriting)

self.button_clear = tk.Button (self, text = «Очистить», command = self.clear_all)

# Сетка

self.canvas.grid (row = 0, column = 0, pady = 2, sticky = W,)

self.label.grid (строка = 0, столбец = 1, pady = 2, padx = 2)

self.classify_btn.grid (строка = 1, столбец = 1, pady = 2, padx = 2)

self.button_clear.grid (строка = 1, столбец = 0, pady = 2)

# self.canvas.bind («‹Motion›», self.start_pos)

self.canvas.bind («‹B1-Motion›», self.draw_lines)

def clear_all (self):

self.canvas.delete («все»)

def classify_handwriting (сам):

HWND = self.canvas.winfo_id () # получаем дескриптор холста

rect = win32gui.GetWindowRect (HWND) # получаем координату холста

im = ImageGrab.grab (прямоугольник)

цифра, acc = прогноз_цифра (im)

self.label.configure (текст = str (цифра) + ’,‘ ​​+ str (int (acc * 100)) + ’%’)

def draw_lines (self, event):

self.x = event.x

self.y = event.y

r=8

self.canvas.create_oval (self.x-r, self.y-r, self.x + r, self.y + r, fill = ’black’)

app = Приложение ()

mainloop ()

Скриншоты:

Резюме

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