Нейронные сети - отличный инструмент для автоматизации задач классификации. Однако, когда речь идет о компьютерном зрении, объем входных данных слишком велик, чтобы его можно было эффективно обрабатывать с помощью простых нейронных сетей.
Чтобы уменьшить нагрузку на сеть, ваши данные должны быть предварительно обработаны и определенные функции должны быть идентифицированы. Чтобы найти элементы в изображениях, мы можем использовать определенные фильтры (например, распознавание границ), которые выделят основные функции, необходимые для классификации. Опять же, количество фильтров, необходимых для классификации одного изображения, слишком велико, и, следовательно, выбор этих фильтров должен быть автоматизирован.
Вот где приходит сверточный слой .
Мы используем сверточный слой для генерации нескольких случайных (сначала) фильтров, которые будут выделять определенные элементы изображения. Пока сеть обучается, эти фильтры оптимизированы для лучшей работы по выделению функций.
В Tensorflow мы используем Conv2D()
, чтобы добавить один из этих слоев. Пример параметров: Conv2D(64, 3, activation='relu')
. 64 обозначает количество используемых фильтров, 3 обозначает размер фильтров (в данном случае 3x3), а активация = 'relu' обозначает функцию активации
после сверточного слоя мы используем слой пула , чтобы дополнительно выделить элементы, созданные предыдущим сверточным слоем. В Tensorflow это обычно делается с MaxPooling2D()
, который берет отфильтрованное изображение и применяет слой 2x2 (по умолчанию) каждые 2 пикселя. Фильтр, применяемый MaxPooling, в основном ищет максимальное значение в этой области 2x2 и добавляет его в новое изображение.
Мы можем использовать этот набор сверточного слоя и объединяющих слоев несколько раз, чтобы сделать изображение более удобным для работы в сети.
После того, как мы закончили с этими слоями, нам нужно пропустить вывод в обычную ( Dense ) нейронную сеть.
Для этого нам сначала нужно сгладить данные изображения из 2D-тензора (матрицы) в 1D Тензор (Vector). Это можно сделать, вызвав метод Flatten()
.
Наконец, нам нужно добавить наши слои Dense , которые используются для обучения сглаженных данных. Мы делаем это по телефону Dense()
. Примером параметров является Dense(64, activation='relu')
, где 64 - число используемых нами узлов.
Вот пример структуры CNN, которую я недавно использовал:
# Build model
model = tf.keras.models.Sequential()
# Convolution and pooling layers
model.add(tf.keras.layers.Conv2D(64, 3, activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 1))) # Input layer
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(64, 3, activation='relu'))
model.add(tf.keras.layers.MaxPooling2D())
# Flattened layers
model.add(tf.keras.layers.Flatten())
# Dense layers
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(2, activation='softmax')) # Output layer
Конечно, это сработало для Определенная проблема классификации, а также количество слоев и параметры метода различаются в зависимости от проблемы.
На канале Youtube The Coding Train есть очень полезное видео, объясняющее Сверточный и Объединение слой.