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 слои объединяются в объект 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});
Ключевые моменты:
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
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
});
sgd,
adadelta, adam).softmax с
числом нейронов, равным количеству классов.ConvNetJS позволяет гибко соединять слои и строить как простые, так и глубокие свёрточные сети. Правильное определение порядка слоев, их параметров и активационных функций напрямую влияет на производительность модели и скорость обучения. Грамотное соединение свёрток, подвыборки и полносвязных слоев создаёт прочную основу для построения эффективных нейронных сетей на JavaScript.