Одной из наиболее распространённых ошибок является некорректная инициализация слоёв сети. ConvNetJS требует точного указания параметров каждого слоя: количество нейронов, размер фильтров, шаг свёртки, тип активации.
Пример ошибки:
var layer_defs = [];
layer_defs.push({type:'input', out_sx:28, out_sy:28, out_depth:1});
layer_defs.push({type:'conv', sx:5, filters:8, stride:1, pad:0}); // нет указания функции активации
layer_defs.push({type:'softmax', num_classes:10});
Исправление: Каждый свёрточный слой должен содержать
определение функции активации. Обычно используют relu или
tanh.
layer_defs.push({type:'conv', sx:5, filters:8, stride:1, pad:0, activation:'relu'});
Ключевой момент: всегда проверять соответствие параметров слоёв ожидаемым размерам входных данных.
ConvNetJS строго требует, чтобы размеры входных данных совпадали с параметрами входного слоя. Ошибка часто проявляется при попытке подать изображение неправильной размерности.
Симптомы:
forward()Пример исправления:
var img = getImageData(); // например 28x28
var x = new convnetjs.Vol(28, 28, 1); // создание Vol с корректной размерностью
for(var i=0;i<28*28;i++) x.w[i] = img[i]/255.0; // нормализация
Совет: перед подачей данных всегда нормализовать значения и убедиться в правильной форме Vol.
Одной из частых причин плохой сходимости сети является отсутствие нормализации. ConvNetJS не выполняет автоматическую нормализацию входов.
Примеры ошибок:
Корректный подход:
for(var i=0;i<input.length;i++) {
input[i] = (input[i] - mean) / std;
}
Ключевой момент: нормализованные данные ускоряют обучение и повышают стабильность градиентов.
ConvNetJS предоставляет разные типы слоёв потерь:
softmax, svm, regression. Частая
ошибка — несовпадение типа последнего слоя с задачей.
Пример ошибки: использование softmax для регрессии
или regression для классификации.
Правильное сочетание:
softmax, функция потерь
softmaxregression, функция потерь
regressionВлияние ошибки:
ConvNetJS использует объект Trainer для оптимизации.
Ошибки здесь часто связаны с несоответствием скорости обучения или
отсутствием регуляризации.
Типичные проблемы:
Пример исправления:
var trainer = new convnetjs.Trainer(net, {
method: 'sgd',
learning_rate: 0.01,
momentum: 0.9,
batch_size: 20,
l2_decay: 0.001
});
Совет: начинать с малых learning rate и постепенно увеличивать при необходимости.
ConvNetJS предоставляет методы toJSON() и
fromJSON() для сериализации сети. Частая ошибка — попытка
использовать объект Trainer после восстановления сети без
пересоздания.
Правильный подход:
var json = net.toJSON();
var net2 = new convnetjs.Net();
net2.fromJSON(json);
var trainer2 = new convnetjs.Trainer(net2, {method:'sgd', learning_rate:0.01});
Ключевой момент: всегда создавать новый объект Trainer для восстановленной сети.
Dropout применяется только во время обучения. Ошибкой является использование его во время тестирования, что приводит к недооценке выходных значений.
Исправление: убедиться, что forward()
вызывается с правильным флагом:
var output = net.forward(x, false); // false — тестовый режим
Совет: тестовая и обучающая фаза должны быть строго разделены.
ConvNetJS использует инициализацию весов случайным образом. Ошибка — ожидание одинакового поведения сети при каждом запуске.
Решение: для воспроизводимости использовать фиксированное значение seed при генерации случайных чисел:
convnetjs.randSeed = 1234;
Влияние ошибки: без фиксированного seed результаты обучения могут сильно различаться при каждом запуске.
Эти ошибки являются наиболее типичными при работе с ConvNetJS. Их внимательное выявление и исправление существенно повышает стабильность обучения и качество работы нейронной сети.