Типичные ошибки и их исправление

Неправильная инициализация сети

Одной из наиболее распространённых ошибок является некорректная инициализация слоёв сети. 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 строго требует, чтобы размеры входных данных совпадали с параметрами входного слоя. Ошибка часто проявляется при попытке подать изображение неправильной размерности.

Симптомы:

  • Исключение при создании Vol (объекта данных)
  • Непредсказуемое поведение функции 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 не выполняет автоматическую нормализацию входов.

Примеры ошибок:

  • Использование пикселей в диапазоне 0–255 вместо 0–1
  • Игнорирование вычитания среднего и деления на стандартное отклонение

Корректный подход:

for(var i=0;i<input.length;i++) {
  input[i] = (input[i] - mean) / std;
}

Ключевой момент: нормализованные данные ускоряют обучение и повышают стабильность градиентов.


Ошибки при выборе функции потерь

ConvNetJS предоставляет разные типы слоёв потерь: softmax, svm, regression. Частая ошибка — несовпадение типа последнего слоя с задачей.

Пример ошибки: использование softmax для регрессии или regression для классификации.

Правильное сочетание:

  • Классификация: последний слой softmax, функция потерь softmax
  • Регрессия: последний слой regression, функция потерь regression

Влияние ошибки:

  • Невозможность обучения
  • Сильно замедленное сходимость

Неправильная настройка параметров обучения

ConvNetJS использует объект Trainer для оптимизации. Ошибки здесь часто связаны с несоответствием скорости обучения или отсутствием регуляризации.

Типичные проблемы:

  • Очень большой learning rate → градиенты взрываются
  • Отсутствие L2 или dropout → переобучение
  • Неверный batch size → нестабильная сходимость

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

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

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

Исправление: убедиться, что forward() вызывается с правильным флагом:

var output = net.forward(x, false); // false — тестовый режим

Совет: тестовая и обучающая фаза должны быть строго разделены.


Игнорирование случайности

ConvNetJS использует инициализацию весов случайным образом. Ошибка — ожидание одинакового поведения сети при каждом запуске.

Решение: для воспроизводимости использовать фиксированное значение seed при генерации случайных чисел:

convnetjs.randSeed = 1234;

Влияние ошибки: без фиксированного seed результаты обучения могут сильно различаться при каждом запуске.


Эти ошибки являются наиболее типичными при работе с ConvNetJS. Их внимательное выявление и исправление существенно повышает стабильность обучения и качество работы нейронной сети.