Многослойный персептрон с использованием Keras в наборе данных MNIST для классификации цифр

Активация ReLu + Dropout + BatchNormalization + AdamOptimizer

Загрузка набора данных MNIST

Каждая точка данных MNIST состоит из двух частей: изображения рукописной цифры и соответствующей метки. Назовем изображения «x», а метки «y». И обучающий набор, и тестовый набор содержат изображения и соответствующие им метки; например, тренировочные изображения — это mnist.train.images, а обучающие метки — mnist.train.labels.

# the data, shuffled and split between a train and test sets 
(X_train, y_train), (X_test, y_test) = mnist.load_data()

если вы Keras не используете TensorFlow в качестве бэкэнда, установите «KERAS_BACKEND=tensorflow», используйте эту команду

Импорт библиотек

Функция графика

# https://gist.github.com/greydanus/f6eee59eaf1d90fcb3b534a25362cea4
# https://stackoverflow.com/a/14434334
# эта функция используется для обновления графиков для каждой эпохи и ошибка

Изменение размера ввода:

Если вы наблюдаете входную форму, это двумерный вектор. Для каждого изображения у нас есть вектор (28*28). Мы преобразуем вектор (28*28) в одномерный вектор 1 * 784.

После преобразования входных изображений из 3d в 2d векторы.

Пример значения пикселя точки данных, близкого к 255, соответствует черному цвету, а близкому к 0 — белому. В середине серый. печать (X_train [0])

Нормализация:

Если мы посмотрим на приведенную выше матрицу, каждая ячейка имеет значение от 0 до 255. прежде чем мы перейдем к применению алгоритмов машинного обучения, давайте попробуем нормализовать данные. X =› (X — Xmin)/(Xmax-Xmin) = X/255

Маркировка:

Преобразуем это в 10-мерный вектор. пример: рассмотрим изображение 5, преобразуем его в 5 => [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]. это преобразование необходимо для MLP.

Пошаговое построение классификатора Softmax

# https://keras.io/getting-started/sequential-model-guide/

Последовательная модель представляет собой линейный набор слоев. вы можете создать модель Sequential, передав конструктору список экземпляров слоя:

  model = Sequential([Dense(32, input_shape=(784,)),
  Activation(‘relu’),Dense(10),Activation(‘softmax’)])
# You can also simply add layers via the .add() method:
  model = Sequential()
  model.add(Dense(32, input_dim=784))
  model.add(Activation(‘relu’))

# https://keras.io/layers/core/ #параметр, отображаемый в слое Keras

keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer=’glorot_uniform’, bias_initializer=’zeros’, kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

Dense реализует операцию: вывод = активация(точка(ввод, ядро)+смещение), где активация — это поэлементная функция активации, переданная в качестве аргумента активации, ядро ​​— это матрица весов, созданная слоем, а #bias — это вектор смещения, созданный слоем (применимо, только если use_bias имеет значение True)

выход = активация (точка (ввод, ядро) + смещение) => y = активация (WT. X + b)

Активация:

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



# from keras.layers import Activation, Dense
# model.add(Dense(64))
# model.add(Activation(‘tanh’))
# This is equivalent to:
# model.add(Dense(64, activation=’tanh’))

Доступно множество функций активации, например: tanh, relu, softmax.

Модель здания:

Шаг 1:

Модель должна знать, какую входную форму она должна ожидать. По этой причине это первый слой в модели Sequential (и только первый, потому что следующие слои могут делать автоматический вывод формы). он должен получить информацию о своей входной форме. вы можете использовать input_shape и input_dim для передачи формы ввода. output_dim представляет количество узлов, необходимых на этом уровне, здесь у нас есть 10 узлов.

Шаг 2:

Перед обучением модели необходимо настроить процесс обучения, который выполняется с помощью метода компиляции. Он получает три аргумента:
1 — Оптимизатор. Это может быть строковый идентификатор существующего оптимизатора, https://keras.io/optimizers/
2 — Функция потерь. Это цель, которую модель попытается минимизировать., https://keras.io/losses/
3 — Список метрик. Для любой проблемы с классификацией вам нужно установить значение metrics=[‘accuracy’]. https://keras.io/metrics/

Примечание. при использовании потери categorical_crossentropy ваши цели должны быть в категориальном формате (например, если у вас есть 10 классов, целью для каждой выборки должен быть 10-мерный вектор то есть все нули, кроме 1 в индексе, соответствующем классу образца). поэтому мы преобразовали метки в векторы.

Шаг 3. Модели Keras обучаются на массивах входных данных и меток Numpy.
Для обучения модели обычно используется функция подгонки.

fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

Функция fit() Обучает модель для фиксированного количества эпох (итераций в наборе данных).

Он возвращает объект истории. Это История. Атрибут истории — это запись значений потерь при обучении и значений показателей в последовательных эпохах, а также значений потерь при проверке и значений показателей проверки (если применимо). https://github.com/openai/baselines/issues/20

Оценивать:

print(history.history.keys())
dict_keys([‘val_loss’, ‘val_acc’, ‘loss’, ‘acc’])
history = model_drop.fit(X_train, Y_train, batch_size=batch_size, epochs=nb_epoch, verbose=1, validation_data=(X_test, Y_test))

Мы получим val_loss и val_acc только при передаче параметра validation_data.

  1. val_loss : потеря проверки
  2. val_acc : точность проверки
  3. потеря : потеря тренировки
  4. acc : точность поезда

Сборка MLP + активация ReLu + Dropout + BatchNormalization + AdamOptimizer





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

Нанесение весов

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

================код=================

https://github.com/ranasingh-gkp/Applied_AI_O/blob/master/Module%208_NN%2C%20Computer%20vision%2C%20Deep%20learning/Keras_Hyperparameter_Mnist.ipynb

======================================

Ссылки:

  1. вики
  2. применил ИИ
  3. keras.io