Глубокое обучение с Keras - подготовка данных

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

Изменение формы входного вектора

Изображения в нашем наборе данных состоят из 28 x 28 пикселей. Его нужно преобразовать в одномерный вектор размером 28 * 28 = 784 для подачи его в нашу сеть. Мы делаем это, вызываяreshape метод на векторе.

X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)

Теперь наш обучающий вектор будет состоять из 60000 точек данных, каждая из которых состоит из одномерного вектора размером 784. Точно так же наш тестовый вектор будет состоять из 10000 точек данных одномерного вектора размера 784.

Нормализация данных

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

Чтобы нормализовать данные, мы представляем их как тип с плавающей запятой и делим на 255, как показано в следующем фрагменте кода:

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

Давайте теперь посмотрим, как выглядят нормализованные данные.

Изучение нормализованных данных

Чтобы просмотреть нормализованные данные, мы вызовем функцию гистограммы, как показано здесь -

plot.hist(X_train[0])
plot.title("Digit: {}".format(y_train[0]))

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

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

plot.hist(X_train[2])
plot.title("Digit: {}".format(y_train[2])

Результат выполнения вышеуказанного кода показан ниже -

Сравнивая два приведенных выше рисунка, вы заметите, что распределение белых пикселей на двух изображениях отличается, что указывает на представление другой цифры - «5» и «4» на двух приведенных выше изображениях.

Затем мы рассмотрим распределение данных в нашем полном наборе обучающих данных.

Изучение распределения данных

Прежде чем обучать нашу модель машинного обучения на нашем наборе данных, мы должны знать распределение уникальных цифр в нашем наборе данных. Наши изображения представляют собой 10 различных цифр в диапазоне от 0 до 9. Мы хотели бы знать количество цифр 0, 1 и т. Д. В нашем наборе данных. Мы можем получить эту информацию, используяunique метод Numpy.

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

print(np.unique(y_train, return_counts=True))

Когда вы запустите указанную выше команду, вы увидите следующий вывод -

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([5923, 6742, 5958, 6131, 5842, 5421, 5918, 6265, 5851, 5949]))

Он показывает, что существует 10 различных значений - от 0 до 9. Имеется 5923 появления цифры 0, 6742 появления цифры 1 и т. Д. Снимок экрана вывода показан здесь -

На последнем этапе подготовки данных нам нужно закодировать наши данные.

Кодирование данных

В нашем наборе данных есть десять категорий. Таким образом, мы будем кодировать наш вывод в этих десяти категориях, используя однократное кодирование. Мы используем метод to_categorial утилит Numpy для выполнения кодирования. После кодирования выходных данных каждая точка данных будет преобразована в одномерный вектор размера 10. Например, цифра 5 теперь будет представлена ​​как [0,0,0,0,0,1,0,0,0 , 0].

Закодируйте данные, используя следующий фрагмент кода -

n_classes = 10
Y_train = np_utils.to_categorical(y_train, n_classes)

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

Используйте следующий код для печати первых 5 векторов -

for i in range(5):
   print (Y_train[i])

Вы увидите следующий вывод -

[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

Первый элемент представляет собой цифру 5, второй - цифру 0 и так далее.

Наконец, вам также придется классифицировать тестовые данные, что делается с помощью следующего оператора:

Y_test = np_utils.to_categorical(y_test, n_classes)

На этом этапе ваши данные полностью подготовлены для передачи в сеть.

Далее идет самая важная часть - обучение нашей сетевой модели.