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

  1. Первый шаг — загрузить и изменить базу данных MNIST в Google Colab с помощью Keras.
  2. Определение модели с помощью обычных 2D-слоев свертки
  3. Запустите модель на 10 эпох
  4. Переопределите ту же модель, используя двухмерные слои свертки, разделяемые по глубине, и сравните общие параметры.
  5. Запустите модель на 10 эпох
  6. Сравните параметры и точность

Шаг 1.

!pip install -q keras
импортировать keras

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

из keras.models import Sequential
из keras.layers import Dense, Dropout, Activation, Flatten, Add
из keras.layers import Convolution2D, MaxPooling2D
из keras.utils import np_utils
из keras.layers import SeparableConv2D
из оптимизаторов импорта keras

из keras.datasets импортировать mnist

(X_train, y_train), (X_test, y_test) = mnist.load_data()

Изменение формы и нормализация изображения (обучение и проверка)

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

X_train = X_train.astype(‘float32’)
X_test = X_test.astype(‘float32’)
X_train /= 255
X_test /= 255

Преобразование одномерных массивов классов в 10-мерные матрицы классов

Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)

Шаг 2.

Шаг 3:

model.fit(X_train, Y_train, batch_size=32, nb_epoch=10, verbose=1)

test_loss, test_acc = model.evaluate(X_test, Y_test, verbose=0)
score = model.evaluate(X_test, Y_test, verbose=0)

печать (test_acc, оценка)

В этой сети 76 тысяч параметров, и при обучении в течение 10 эпох точность теста составляет 99,06 %. Теперь давайте переопределим модель с разделяемыми по глубине слоями свертки.

Шаг 4:

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

Произошло резкое снижение общих параметров с 76k до 18k, что составляет снижение примерно на 75%, и теперь давайте посмотрим на точность.

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

Шаг 5:

model.fit(X_train, Y_train, batch_size=45, эпохи=13, подробный=1)

test_loss, test_acc = model.evaluate(X_test, Y_test, verbose=0)
score = model.evaluate(X_test, Y_test, verbose=0)

печать (test_acc, оценка)

0.9921 [0.027197462945811275, 0.9921]

Шаг 6:

Здорово! мы могли видеть, как легко мы можем уменьшить общие параметры в сети, используя слои свертки, разделяемые по глубине, без ущерба для точности.

Чтобы просмотреть весь блокнот Colab, нажмите здесь. Блокнот

Пожалуйста, дайте мне знать ваши мысли и взгляды. Спасибо !