Transfer learning — это методика машинного обучения, при которой знания, полученные при обучении одной модели на одной задаче, используются для ускорения и улучшения обучения модели на другой, часто смежной задаче. В контексте ConvNetJS это позволяет использовать предобученные сети для распознавания изображений или извлечения признаков без необходимости обучать модель с нуля.
ConvNetJS предоставляет возможность строить многослойные сверточные нейронные сети, состоящие из следующих типов слоев:
При transfer learning предобученные веса слоев, особенно сверточных, переносятся в новую сеть. Основная идея: нижние слои обучены извлекать универсальные признаки, такие как края, текстуры и формы, а верхние слои можно адаптировать под новую задачу.
ConvNetJS не имеет встроенного каталога предобученных моделей, но поддерживает импорт весов через JSON-формат, экспортируемый из других реализаций или из предыдущих тренировок. Типичный процесс:
net.fromJSON(json).layer.trainable = false.Пример создания и заморозки слоев:
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:64, activation:'relu'});
layer_defs.push({type:'softmax', num_classes:10});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
// Заморозка всех сверточных слоев
for(var i=0;i<net.layers.length;i++){
if(net.layers[i].layer_type === 'conv'){
net.layers[i].trainable = false;
}
}
Fine-tuning — это процесс дообучения верхних слоев модели с
использованием новой выборки. В ConvNetJS он осуществляется обычным
методом trainer.train(x, y), но с учетом, что часть слоев
заморожена. Основные рекомендации:
Пример создания тренера для fine-tuning:
var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.001, momentum:0.9, batch_size:32, l2_decay:0.001});
Иногда цель — не классификация, а извлечение признаков для других
алгоритмов. В таком случае используется выход промежуточного
слоя сети. ConvNetJS позволяет получать эти признаки через
метод net.forward(x, layer_index). Пример:
var x = new convnetjs.Vol(32, 32, 3); // изображение
var features = net.forward(x, 3); // выход третьего слоя (fc)
Эти признаки можно передавать в SVM, kNN или любую другую модель.
Transfer learning в ConvNetJS — мощный инструмент для быстрого прототипирования моделей и работы с ограниченными ресурсами, позволяющий переиспользовать уже изученные слои и значительно ускорять обучение.