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

Если вы предпочитаете не читать эту статью и хотите ее видеопрезентацию, вы можете посмотреть видео ниже. В нем подробно рассматривается все, что описано в этой статье, и он поможет вам легко начать программировать свою собственную модель сверточной нейронной сети (CNN), даже если на вашем компьютере не установлен язык программирования Python. Или вы можете использовать и видео, и эту статью в качестве дополнительных материалов для изучения CNN!

Начать программирование:

Сначала я напишу описание того, что будет делать эта программа. Таким образом, когда я оглянусь на нее позже в будущем, я или кто-то еще точно будет знать, что она делает.

# Description: This program uses Convolutional Neural Networks (CNN) 
#              to classify handwritten digits as numbers 0 - 9

Затем мне нужно установить зависимости / пакеты. Если у вас еще не установлены эти пакеты, выполните следующую команду в своем терминале, командной строке или на веб-сайте Google Colab (в зависимости от того, где у вас установлен язык программирования Python).

pip install tensorflow keras numpy matplotlib

Теперь, когда я установил все необходимые пакеты, я хочу импортировать пакеты в свою программу.

#import the libraries
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten
from keras.datasets import mnist
from keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np

Затем загрузите набор данных в переменные X_train (переменная, содержащая изображения для обучения), y_train (переменная, содержащая метки изображений в обучающем наборе), X_test (переменная который содержит изображения для тестирования) и y_test (переменная, содержащая метки изображений в тестовом наборе).

#Load the data and split it into train and test sets
(X_train,y_train), (X_test, y_test) = mnist.load_data()

Получите форму изображения из наборов данных функций. Обратите внимание, что X_trainshape содержит 60 000 строк изображений 28 x 28 пикселей. X_testshape содержит 10 000 строк изображений 28 x 28 пикселей.

#Get the image shape
print(X_train.shape)
print(X_test.shape)

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

X_train[0]

Распечатайте метку изображения первого изображения из набора обучающих данных. На напечатанной этикетке был номер 5.

#Print the image label
y_train[0]

Показывать изображение не как набор значений пикселей, а как реальное изображение.

Измените форму элементов (X_train и X_test) в соответствии с моделью. Итак, теперь набор обучающих функций будет иметь 60 000 строк изображений 28 x 28 пикселей с глубиной = 1 (шкала серого), а набор функций тестирования будет иметь 10 000 строк изображений 28 x 28 пикселей с глубиной = 1 (шкала серого).

#Reshape the data to fit the model
X_train = X_train.reshape(60000, 28,28,1)
X_test = X_test.reshape(10000, 28, 28, 1)

Быстрое кодирование целей (y_train и y_test) в соответствии с моделью. По сути, мы будем преобразовывать эти наборы данных в набор из 10 чисел для ввода в нейронную сеть. После этого мы напечатаем новую этикетку набора поезда для первого изображения.

#One-Hot Encoding
y_train_one_hot = to_categorical(y_train)
y_test_one_hot = to_categorical(y_test)

#Print the new label
print(y_train_one_hot[0])

Пришло время построить модель! Два слоя будут слоями свертки: первый с 64 каналами, ядром 3 x 3 и функцией линейного модуля выпрямителя (ReLu), которая будет передавать 64 изображения во второй слой, в то время как второй слой будет иметь 32 канала, ядро ​​3 x 3 и Выпрямитель Linear Unit (ReLu) работает и подает 32 изображения в третий слой. Третий слой - это плоский слой для преобразования размерности изображения в одномерный массив для соединения с последним слоем, который содержит 10 нейронов и функцию активации softmax.

model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(28,28,1)))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))

Далее нам нужно скомпилировать модель. Мы будем использовать оптимизатор Адама, который контролирует скорость обучения, функцию потерь, называемую категориальным_кросцентропием, которая используется для количества классов больше 2 (например, 10 различных меток в целевом наборе данных), и метрики, чтобы увидеть оценку точности на проверка устанавливается при обучении модели.

#Compile the model model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

Обучите модель на наборе обучающих данных (X_trainи y_train). Я буду повторять 3 раза по всему набору данных для обучения, используя 32 образца на каждое обновление градиента для обучения. Затем сохраните эту обученную модель в переменной hist.

Примечание. Я не указывал количество образцов (партия), по умолчанию, если партия не указана, то 32.

Пакет: общее количество обучающих выборок, присутствующих на обновление градиента

Эпоха: количество итераций, когда ВЕСЬ набор данных передается вперед и назад через нейронную сеть только ОДИН РАЗ.

Fit: другое слово для обозначения тренировки

hist = model.fit(X_train, y_train_one_hot, validation_data=(X_test, y_test_one_hot), epochs=3)

Похоже, модель была 98,59% точна по обучающим данным и 97,68% по тестовым данным. Давайте визуализируем точность моделей.

#Visualize the models accuracy
plt.plot(hist.history['acc'])
plt.plot(hist.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()

Модель возвращает только вероятности. Итак, давайте покажем вероятности первых 4 изображений в тестовой выборке.

predictions = model.predict(X_test[:4])
predictions

Вероятности довольно трудно прочитать. Чтобы понять их, вы должны посчитать, найти наибольшее число в наборе, а затем подсчитать индекс, которым это число, чтобы выяснить, что это за метка, которая является номером индекса. Например, на изображении выше для 3-го изображения наибольшая вероятность составляет 9.98755455e-01, что означает 99,8755%, и это число находится в индексе 1, поэтому метка равна 1. Итак, давайте напечатаем прогнозы как метки для первых 4 изображений вместо вероятностей, как указано выше, и давайте напечатаем фактические значения / метки каждого изображения, чтобы увидеть, как они совпадают.

#Print our predicitons as number labels for the first 4 images
print( np.argmax(predictions, axis=1))
#Print the actual labels
print(y_test[:4])

Давайте покажем первые четыре изображения как картинки!

#Show the first 4 images as pictures 
for i in range(0,4):   
   image = X_test[i]   
   image = np.array(image, dtype='float')   
   pixels = image.reshape((28,28))  
   plt.imshow(pixels, cmap='gray')   
   plt.show()

Мы закончили создание программы! Вы можете посмотреть видео выше о том, как я кодировал эту программу и код вместе со мной, с несколькими более подробными объяснениями, или вы можете просто щелкнуть Ссылка YouTube здесь. Если вы просто хотите полностью увидеть код и пропустить видео, вы можете найти его на моем Github.

Если вам также интересно узнать больше о машинном обучении, чтобы сразу приступить к решению проблем и примерам, я настоятельно рекомендую вам ознакомиться с Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем. . Это отличная книга, которая поможет новичкам научиться писать программы машинного обучения и понять концепции машинного обучения.

Спасибо, что прочитали эту статью. Надеюсь, она будет вам полезна! Если вам понравилась эта статья и вы нашли ее полезной, пожалуйста, оставьте несколько аплодисментов, чтобы выразить свою признательность. Продолжайте обучение, и если вам нравится машинное обучение, математика, информатика, программирование или анализ алгоритмов, посетите и подпишитесь на мои каналы YouTube (randerson112358 и compsci112358).

Ресурсы:

[1] https://towardsdatascience.com/building-a-convolutional-neural-network-cnn-in-keras-329fbbadc5f5

[2] https://github.com/eijaz1/Building-a-CNN-in-Keras-Tutorial/blob/master/cnn_tutorial.ipynb

[3] https://www.tensorflow.org/beta/tutorials/images/intro_to_cnns