Слои пространственного dropout: SpatialDropout1D, SpatialDropout2D

Пространственный Dropout является специализированной формой регуляризации нейронных сетей, которая применяется преимущественно в сверточных и последовательных моделях. Основная цель этих слоев — предотвращение переобучения за счет случайного «отключения» целых каналов входных данных вместо отдельных нейронов. Это особенно важно для сетей, работающих с пространственно-зависимыми признаками, такими как изображения или временные ряды.


SpatialDropout1D

Назначение: применяется к данным размерности (samples, timesteps, features) — обычно к последовательностям, например, к временным рядам или текстовым данным после слоя эмбеддинга.

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

Параметры:

  • rate — вероятность зануления канала (float от 0 до 1).
  • noise_shape — необязательный параметр, позволяет задавать маску нестандартной формы.
  • seed — для воспроизводимости случайных операций.

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

const spatialDropout1D = new KerasJS.layers.SpatialDropout1D({
  rate: 0.3,
  inputShape: [100, 64]  // 100 временных шагов, 64 признака
});

Особенности:

  • Подходит для слоев Embedding и LSTM, где важно сохранять временную структуру.
  • В отличие от обычного Dropout1D, не разрывает корреляцию между временными шагами.
  • На этапе инференса слой не отключает нейроны, а масштабирует выходы для компенсации Dropout.

SpatialDropout2D

Назначение: используется для данных размерности (samples, rows, cols, channels) — чаще всего для изображений после сверточных слоев.

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

Параметры:

  • rate — вероятность зануления канала.
  • dataFormat — формат входных данных, 'channelsLast' (по умолчанию) или 'channelsFirst'.
  • seed — для фиксирования генератора случайных чисел.

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

const spatialDropout2D = new KerasJS.layers.SpatialDropout2D({
  rate: 0.2,
  inputShape: [32, 32, 128] // 32x32 изображения, 128 каналов
});

Особенности:

  • Используется после сверточных слоев (Conv2D) или слоев нормализации.
  • Маскирует каналы целиком, что предотвращает корреляцию фильтров, позволяя модели более обобщенно извлекать признаки.
  • На этапе инференса выход масштабируется автоматически, чтобы компенсировать отключение каналов во время обучения.

Отличия от стандартного Dropout

Слой Отключение элементов Сохраняет пространственную структуру
Dropout отдельные нейроны нет
SpatialDropout1D каналы признаков да, по временной оси
SpatialDropout2D каналы изображений да, сохраняется внутренняя структура

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


Практические рекомендации

  • Вероятность зануления (rate) обычно выбирается в диапазоне 0.1–0.5 в зависимости от размера модели и объема данных.

  • Расположение слоя:

    • Для временных рядов: сразу после слоя эмбеддинга или входного LSTM.
    • Для изображений: после каждого блока сверточных слоев, перед полносвязными слоями.
  • Комбинация с другими регуляризаторами: SpatialDropout хорошо сочетается с BatchNormalization, но порядок слоев важен — сначала нормализация, затем Dropout.


Поддержка Keras.js

В Keras.js слои SpatialDropout1D и SpatialDropout2D доступны через модуль layers. Они полностью поддерживают сериализацию моделей из Keras (Python), что позволяет загружать предварительно обученные модели и выполнять инференс в браузере или на сервере с Node.js.

Особенность использования в Keras.js:

  • На этапе инференса слои автоматически отключаются, остаётся только масштабирование выхода.
  • Для обучения через Keras.js рекомендуется экспортировать веса из Python Keras, так как Keras.js ориентирован на выполнение готовых моделей, а не на обучение с нуля.