Соединение слоев в сеть

ConvNetJS — это библиотека на JavaScript для создания, обучения и применения нейронных сетей, в первую очередь свёрточных. Она поддерживает полносвязные (Fully Connected), свёрточные (Convolutional) и подвыборочные (Pooling) слои, а также слои активации и нормализации. Основное внимание при проектировании сети уделяется правильному соединению слоев и управлению размерами тензоров.


Основные типы слоев

1. Полносвязный слой (Fully Connected, fc): Каждый нейрон связан с каждым нейроном предыдущего слоя. Используется для интеграции признаков после свёрточных и пуллинговых слоев.

2. Свёрточный слой (Convolutional, conv): Применяет фильтры к входным данным, создавая карты признаков (feature maps). Позволяет выявлять локальные закономерности, такие как края, углы и текстуры. Основные параметры: размер фильтра, количество фильтров, шаг свёртки (stride), смещение (padding).

3. Слой подвыборки (Pooling, pool): Уменьшает размер карты признаков, повышая устойчивость к смещению и снижая вычислительные затраты. Чаще всего используется MaxPooling или AveragePooling.

4. Слой активации (ReLU, Sigmoid, Tanh): Применяет нелинейное преобразование к входным данным. Без активации сеть не сможет моделировать сложные зависимости.

5. Слой нормализации (Local Response Normalization, BatchNorm): Улучшает сходимость и стабилизирует обучение, предотвращая резкие изменения градиентов.


Соединение слоев в ConvNetJS

В ConvNetJS слои объединяются в объект net, который создаётся с помощью класса ConvNetJS.Net. Основное соединение слоев осуществляется последовательным добавлением слоев через массив layers.

Пример структуры слоя:

var layer_defs = [];
layer_defs.push({type:'input', out_sx:32, out_sy:32, out_depth:3});
layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'fc', num_neurons:100, activation:'relu'});
layer_defs.push({type:'softmax', num_classes:10});

Ключевые моменты:

  • Порядок слоев критичен. Входные данные последовательно проходят через каждый слой.
  • Размерности выходов и входов должны соответствовать. ConvNetJS автоматически вычисляет размеры выходных тензоров для свёрточных и пуллинговых слоев.
  • Активационные функции задаются индивидуально для каждого слоя. Например, activation: 'relu' для ReLU или activation: 'sigmoid' для сигмоидальной функции.

Расчёт размеров тензоров при соединении слоев

Каждый слой преобразует входной тензор в новый размер:

  • Свёрточный слой: Для входа размера W × H с фильтром F × F, шагом S и паддингом P выход вычисляется по формуле:

    W_out = (W - F + 2*P)/S + 1
    H_out = (H - F + 2*P)/S + 1

    Глубина выходного тензора равна количеству фильтров.

  • Pooling слой: Размер выходного тензора после подвыборки с фильтром F и шагом S:

    W_out = (W - F)/S + 1
    H_out = (H - F)/S + 1

    Глубина остаётся неизменной.

  • Fully Connected слой: Входной тензор разворачивается в вектор, длина которого равна произведению всех элементов предыдущего слоя. Выходной вектор имеет длину num_neurons.


Соединение различных типов слоев

1. Conv → Pool → Conv → Pool → FC → Softmax

  • Свёрточные слои выявляют локальные признаки.
  • Pooling слои уменьшают размерность и предотвращают переобучение.
  • Полносвязный слой объединяет признаки в высокоуровневые представления.
  • Softmax слой обеспечивает вероятность классов для задачи классификации.

2. Conv → ReLU → Conv → ReLU → Pool → FC

  • Использование активации после каждого свёрточного слоя повышает нелинейность сети.
  • Чередование свёрток без подвыборки позволяет выявлять сложные шаблоны на одном уровне разрешения.

Настройка сети через ConvNetJS.Net

После определения массива слоев создаётся объект сети:

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

Для обучения используется объект Trainer, который подключается к сети:

var trainer = new convnetjs.Trainer(net, {
  method: 'sgd',
  learning_rate: 0.01,
  momentum: 0.9,
  batch_size: 20,
  l2_decay: 0.001
});
  • method: оптимизатор (sgd, adadelta, adam).
  • learning_rate: скорость обучения.
  • momentum: ускорение градиентного спуска.
  • batch_size: количество примеров в одной итерации.
  • l2_decay: коэффициент регуляризации для предотвращения переобучения.

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

  • Всегда проверять размерности тензоров при добавлении новых слоев.
  • Сначала тестировать небольшие сети с упрощёнными данными.
  • Использовать слои активации после каждой свёртки для повышения обучаемости.
  • Подвыборочные слои уменьшают вычислительную нагрузку и повышают устойчивость к шуму.
  • Для классификации последний слой должен быть softmax с числом нейронов, равным количеству классов.

Вывод

ConvNetJS позволяет гибко соединять слои и строить как простые, так и глубокие свёрточные сети. Правильное определение порядка слоев, их параметров и активационных функций напрямую влияет на производительность модели и скорость обучения. Грамотное соединение свёрток, подвыборки и полносвязных слоев создаёт прочную основу для построения эффективных нейронных сетей на JavaScript.