Авторы Нилеш Сингх и Правин Кумар.

Предварительные требования: Фильтры и ядра, Каналы и функции

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

Так что давайте избавимся от кода болтовни и разговора.

Первое, что нужно иметь в виду, это то, что мы будем использовать Python 3.x на платформе Google Colab. Мы будем использовать Keras в качестве нашей основной библиотеки для написания сети. Это простой, элегантный, но чрезвычайно мощный API, работающий поверх TensorFlow или Theano.

Первое, что нужно сделать, это запустить колаб, если это еще не сделано.

Вы должны получить страницу «Добро пожаловать в лабораторию». В верхнем левом углу найдите параметр «файл» и перейдите в файл- ›New Python 3 Notebook.

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

Чтобы запустить каждую ячейку по отдельности: SHIFT + ENTER

Чтобы запустить все ячейки: CTRL + F9

Чтобы удалить ячейку: CTRL + M + D

Чтобы вставить ячейку ниже: CTRL + M + B

Чтобы вставить ячейку выше: CTRL + M + A

Хорошая новость заключается в том, что если вам сложно их запомнить, вы можете настроить каждый ярлык с помощью параметра settings или использовать CTRL + M + H, чтобы открыть параметры настройки для всех ярлыки.

Построим нейронную сеть с 7 скрытыми слоями

Нажмите здесь, чтобы найти записную книжку со всем кодом, использованным в этой статье.

В первом блоке напишите этот оператор импорта и нажмите shift + enter.

import keras

Теперь мы импортируем еще несколько модулей. Не беспокойтесь о том, чтобы понять все сразу, мы поможем вам понять это по мере использования.

import numpy as np
​
from keras.models import Sequential
from keras.layers import Flatten
from keras.layers import Convolution2D
from keras.utils import np_utils
​
from keras.datasets import mnist

Здесь стоит отметить последнюю строку импорта. В последнем утверждении мы импортируем весь набор данных MNIST. Он содержит все изображения и их метки, которые мы будем использовать для обучения нашей модели распознавания рукописных цифр. MNIST состоит из 60 тыс. Обучающих и 10 тыс. Тестовых изображений. Все изображения черно-белые и имеют размер 28X28.

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

Несмотря на то, что мы уверены, что наша модель точно выучила все цифры, нам необходимо оценить ее обучение, показывая ей некоторые невидимые изображения. Если модель точно классифицирует эти новые невидимые изображения, мы можем с уверенностью сказать, что мы добились успеха !!!

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

##splitting MNIST dataset into training and testing sets, images are loaded into memory as well
(X_train, y_train), (X_test, y_test) = mnist.load_data()

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

На следующем шаге мы добавляем глубину 1, что означает, что наши данные имеют только один канал. Это делается с помощью функции reshape numpy массивов.

##Basically adding a depth dimension to the data, so our MNIST data are single channeled
X_train = X_train.reshape(X_train.shape[0], 28, 28,1)
X_test = X_test.reshape(X_test.shape[0], 28, 28,1)

Затем мы масштабируем наши данные от диапазона (0–255) (думаю, RGB) до диапазона (0–1). Почему? Потому что масштабирование позволяет нам уменьшить все изображения до единого соотношения одной и той же пропорции. Это помогает ускорить обучение и повысить точность прогнозирования (иногда противоречащего интуиции). Таким образом, мы делим наши изображения на 255, потому что пиксели в изображениях цветовой модели RGB могут иметь максимальное значение 255 (2⁸-1).

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

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

# Convert 1-dimensional class arrays to 10-dimensional class matrices(making the data categorical)
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)

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

from keras.layers import Activation, MaxPooling2D
​
model = Sequential() 
model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=(28,28,1))) #receptive field=3,input channel=1
model.add(Convolution2D(64, 3, 3, activation='relu')) #receptive field=5,input channel=32
model.add(Convolution2D(128, 3, 3, activation='relu')) #receptive field=7,input channel=64
​
model.add(MaxPooling2D(pool_size=(2, 2))) #receptive field=14
​
model.add(Convolution2D(256, 3, 3, activation='relu')) #receptive field=16,input channel=128
model.add(Convolution2D(512, 3, 3, activation='relu')) #receptive field=18,input channel=256
model.add(Convolution2D(1024, 3, 3, activation='relu')) #receptive field=20,input channel=512
model.add(Convolution2D(2048, 3, 3, activation='relu')) #receptive field=22,input channel=1024
model.add(Convolution2D(10, 3, 3)) #receptive field=24,input channel=2048
​
model.add(Flatten())
model.add(Activation('softmax'))
​
model.summary()

Во второй строке мы объявляем нейронную сеть и делаем ее последовательной. Последовательный просто означает, что слои соединены друг с другом в соотношении 1: 1, что означает, что каждый слой принимает входные данные от предыдущего слоя, а его выходные данные идут на следующий непосредственный уровень. Нет соединений, которые могут привести к пропуску слоев. Он следует каскадному дизайну слоев.

Затем в следующей строке мы создаем сверточный слой с помощью функции Convolution2D () и добавляем его в модель с помощью model.add ().

В Convolution2D (32, 3, 3, Activation = ’relu’, input_shape = (28,28,1)):

  • 32 означает, что нам нужно 32 ядра
  • 3,3 означает, что 32 ядра должны быть размером 3x3, поэтому здесь мы выполняем свертку 3x3.
  • Активации - это в основном нелинейные функции, которые сообщают сети, как данные передаются между уровнями. Без его наличия все нейронные сети будут простой моделью линейной регрессии. Используемая здесь функция активации ReLu довольно проста: она отправляет все положительные значения по слою и отбрасывает все отрицательные значения.

Повторяем эти слои, соединяя один с другим.

В конце мы добавляем слой Flatten (), который в основном преобразует вывод последнего слоя в одномерный массив из 10 чисел (потому что в наших данных 10 категорий [числа от 0 до 9] ).

Когда выполняется последний оператор, мы получаем красивую и структурированную сводку модели с деталями каждого слоя, что-то очень похожее на это.

Мы просто создали архитектуру модели. Теперь давайте завершим процесс компиляцией.

##we are compiling our model using adam as optimizer
model.compile(loss='categorical_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])

У нас есть некоторые метрики потерь, которые будут использоваться нашей моделью в обратном распространении (посмотрите это замечательное видео), так что каждый раз, когда наша модель узнает (предсказывает) неправильный ярлык (наземная истина), мы наказываем это наказанием. У нас есть точность как метрика, которая, по сути, является просто параметром производительности, на основе которого мы оцениваем модель. Так получилось, что после каждой эпохи мы отслеживаем и оцениваем производительность модели, используя точность ее прогноза. Давайте пока проигнорируем оптимизаторы, поскольку мы подробно рассмотрим их в следующих сессиях. Если вам интересно, то прочтите о них здесь.

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

##Training the model in this cell
model.fit(X_train, Y_train, batch_size=32, nb_epoch=10, verbose=1)

Наконец-то тренируемся ??

Мы обучаем модель 10 эпохам, т.е. мы проходим все 60 тысяч обучающих изображений по 10 раз в надежде, что наша модель выучит все числа от 0 до 9.

Тренировочный процесс должен занять около 15–20 минут и выглядеть примерно так.

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

Пойдем дальше… возьмем на пробу нашу модель. Давай проверим.

##Evaluating the trained model on test data
score = model.evaluate(X_test, Y_test)
​
##predicting the labels of test dataset
y_pred = model.predict(X_test)
​

Это должно напечатать счет модели. Это должно быть около 99,2%, что неплохо для первой сети.

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

Поздравляем !!!

Ты сделал это!!!!!

Вы крепкое печенье, и вам это удалось. Вы заслуживаете похлопывания по спине.

Отдохнуть!!!

Надеюсь, вам понравилось.

Интересный комментарий: просмотрите сводку своей модели, попробуйте разные значения ядра и дайте нам знать, сколько параметров вы обучаете сегодня.

ПРИМЕЧАНИЕ. Мы запускаем новую группу телеграмм, чтобы решать все вопросы и любые запросы. Вы можете открыто обсудить концепции с другими участниками и получить больше информации, и это будет более полезно по мере продвижения по публикации. [Перейдите по этой LINK , чтобы присоединиться]