Смена точки зрения решает все

Набор данных MNIST состоит из обучающего набора из 60 000 примеров и тестового набора из 10 000 примеров, где каждый пример представляет собой изображение рукописных цифр 28x28 в градациях серого, связанное с меткой от 0 до 9.

MNIST часто представляет собой набор данных, который каждый строит свою первую модель глубокого обучения при входе в эту область. Сообщество Data Science обычно использует его в качестве эталона для проверки своих алгоритмов. Они говорят,

If it doesn't work on MNIST, it won't work at all

Здесь мы создадим два типа моделей глубокого обучения, используя Keras API tensorflow, и постараемся достичь 99% точности обучения за менее 10 эпох. Наш первый подход должен заключаться в построении модели с использованием только плотных слоев, тогда как второй подход должен создавать модель с использованием только слоев свертки.

Кроме того, вместо того, чтобы ждать окончания 10 эпох, мы добавим в наши модели функцию, чтобы, когда она достигает 99% или выше в конце этой эпохи, она выводила строку «Достигнута точность 99%, поэтому отмена обучения!» .

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

После импорта библиотеки tensorflow и загрузки набора данных MNIST (доступного в API наборов данных tf.keras) в качестве наборов данных для обучения и тестирования, содержащих изображения как x и их метки как y, мы визуализируем изображение и распечатываем его значения пикселей для четкого понимания наших наборов данных. .

Теперь мы готовы построить наши модели.

Использование только плотных слоев

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

Мы определяем нашу модель как:

model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])

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

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

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

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

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

Использование только слоев свертки

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

Для этой модели мы сразу кодируем наши метки, что изменяет нашу функцию потерь. Мы определяем нашу модель как:

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape =(28, 28, 1)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D((2,2)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D((2,2)),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.Conv2D(10, (3,3)),
tf.keras.layers.Flatten(),
tf.keras.layers.Activation('softmax')])

После компиляции модели (содержащей 98 тыс. параметров) с оптимизатором Адама и категориальной функцией перекрестной энтропийной потери, а затем подгонки наших обучающих данных к нашим обучающим меткам мы получаем точность более 99% всего за три эпохи. В дополнение к этому наша модель достигает точности 99,11% (выше, чем предыдущая модель) на невидимом наборе данных тестового изображения.

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

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

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

принять вызов

Если вы хотите глубже погрузиться в это, то вот вам небольшой вызов.

Получите точность теста более 99,25 %, используя подход сверточных слоев с моделями NN, имеющими менее 25 000 параметров.

Для полного блокнота Jupyter этой статьи с ценными комментариями и ссылками нажмите здесь.