CNN является прорывной архитектурой в этом десятилетии для классификации изображений с тех пор, как AlexNet побила предыдущие рекорды с огромным отрывом. Однако большинство сетей сосредоточено на точности классификации, а более новые сети стремятся уменьшить общие параметры, связанные с окончательными архитектурами. В этой статье основное внимание уделяется показу способа использования разделяемой свертки по глубине, чтобы значительно сократить количество параметров, требуемых в общей архитектуре, и в то же время достичь современной точности классификации. в базе данных MNIST.
- Первый шаг — загрузить и изменить базу данных MNIST в Google Colab с помощью Keras.
- Определение модели с помощью обычных 2D-слоев свертки
- Запустите модель на 10 эпох
- Переопределите ту же модель, используя двухмерные слои свертки, разделяемые по глубине, и сравните общие параметры.
- Запустите модель на 10 эпох
- Сравните параметры и точность
Шаг 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, нажмите здесь. Блокнот
Пожалуйста, дайте мне знать ваши мысли и взгляды. Спасибо !