Слой Conv2D: параметры, padding, strides

Слой Conv2D является основным строительным блоком сверточных нейронных сетей (CNN) и предназначен для извлечения признаков из двумерных входных данных, таких как изображения. Он выполняет операцию свертки, скользя по входной матрице фильтром (ядром) и формируя карту признаков (feature map).

Основные параметры слоя Conv2D

  1. filters Определяет количество фильтров (ядр) в слое. Каждый фильтр обучается распознавать определенный паттерн в данных. Результатом применения filters фильтров является тензор, у которого число каналов соответствует количеству фильтров.

    tf.layers.conv2d({
        filters: 32,
        kernelSize: 3,
        activation: 'relu',
    });
  2. kernelSize Размер ядра свертки. Может быть задан как одно число (квадратное ядро, например 3 означает 3x3) или массив [высота, ширина].

  3. strides Шаг перемещения фильтра по входной матрице. По умолчанию strides равен 1. Массив [strideHeight, strideWidth] позволяет задавать разные шаги по вертикали и горизонтали. Увеличение stride уменьшает размер выходной карты признаков.

    tf.layers.conv2d({
        filters: 64,
        kernelSize: 3,
        strides: [2, 2], // уменьшаем размер выходной карты в 2 раза
    });
  4. padding Определяет стратегию обработки границ изображения:

    • 'valid' — без дополнений. Размер выходной карты уменьшается на величину ядра минус один: [ H_{out} = H_{in} - k + 1] [ W_{out} = W_{in} - k + 1]

    • 'same' — добавление нулей по краям, чтобы сохранить размерность входа: [ H_{out} = ] [ W_{out} = ]

    Пример:

    tf.layers.conv2d({
        filters: 32,
        kernelSize: 3,
        padding: 'same',
    });
  5. activation Функция активации, применяемая к выходу слоя. Чаще всего используются relu, sigmoid, tanh. Встроенная функция позволяет сразу включать нелинейность в слой.

  6. useBias Логическое значение, определяющее, будет ли добавлен смещающий коэффициент (bias) к каждому фильтру. По умолчанию true.

  7. kernelInitializer и biasInitializer Инициализаторы весов и смещений. Например, 'glorotUniform' для весов или 'zeros' для смещений.

Влияние padding и strides на размер выходного тензора

Для входного тензора размером (H_in, W_in, C_in) и ядра (kH, kW) размер выходного тензора (H_out, W_out, C_out) вычисляется так:

  • valid padding:

[ H_{out} = + 1] [ W_{out} = + 1]

  • same padding:

[ H_{out} = ] [ W_{out} = ]

C_out всегда равно количеству фильтров filters.

Примеры использования

Базовый Conv2D слой с квадратным ядром 3x3:

const layer = tf.layers.conv2d({
    filters: 16,
    kernelSize: 3,
    strides: 1,
    padding: 'same',
    activation: 'relu'
});

Слой с разными шагами по осям и без смещения:

const layer = tf.layers.conv2d({
    filters: 32,
    kernelSize: [5, 3],
    strides: [2, 1],
    padding: 'valid',
    useBias: false,
    activation: 'tanh'
});

Сворачивание изображения с последующим Flatten:

const model = tf.sequential();
model.add(tf.layers.conv2d({
    inputShape: [128, 128, 3],
    filters: 32,
    kernelSize: 3,
    padding: 'same',
    activation: 'relu'
}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));

Рекомендации по выбору параметров

  • Малые ядра 3x3 или 5x5 обычно дают лучший баланс между точностью и количеством параметров.
  • Strides >1 уменьшают размер карты признаков и ускоряют вычисления, но могут теряться мелкие детали.
  • 'same' padding удобен для сохранения исходных размеров, особенно когда требуется глубокая сеть с множеством слоев.
  • Увеличение количества фильтров повышает способность модели извлекать признаки, но увеличивает вычислительные затраты и риск переобучения.

Слой Conv2D в TensorFlow.js предоставляет гибкие возможности для построения эффективных сверточных нейронных сетей с управлением размером выходного тензора через параметры padding и strides, что критически важно для проектирования архитектуры сети.