Перенос знаний (transfer learning) — ключевой подход в современной разработке моделей машинного обучения, позволяющий использовать предварительно обученные нейронные сети для решения новых задач с минимальными затратами на обучение. В контексте TensorFlow.js это особенно актуально, так как работа происходит непосредственно в браузере или на Node.js, что накладывает ограничения на производительность и объём доступной памяти.
1. Использование предварительно обученных моделей
Предварительно обученные модели, такие как MobileNet, Inception, ResNet,
доступны в TensorFlow.js через пакет @tensorflow-models.
Они обучены на больших датасетах (например, ImageNet) и обладают
высококачественными признаками, которые можно повторно использовать.
2. Фиксация слоёв и дообучение Типичный подход состоит из двух этапов:
Пример структуры модели для переноса знаний:
import * as tf from '@tensorflow/tfjs';
import * as mobilenet from '@tensorflow-models/mobilenet';
// Загрузка предварительно обученной модели
const baseModel = await mobilenet.load({version: 2, alpha: 1.0});
// Заморозка слоёв
baseModel.layers.forEach(layer => layer.trainable = false);
// Создание новой модели
const model = tf.sequential();
model.add(tf.layers.inputLayer({inputShape: [224, 224, 3]}));
model.add(baseModel);
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 128, activation: 'relu'}));
model.add(tf.layers.dense({units: numClasses, activation: 'softmax'}));
model.compile({
optimizer: tf.train.adam(),
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
Для эффективного переноса знаний критично корректно подготовить данные. Основные шаги:
1. Преобразование изображений Изображения должны быть масштабированы до размеров, подходящих для базовой модели (например, 224x224 для MobileNet).
const imageTensor = tf.browser.fromPixels(imageElement)
.resizeBilinear([224, 224])
.toFloat()
.div(tf.scalar(127.5))
.sub(tf.scalar(1));
2. Кодирование меток Для многоклассовой классификации используется one-hot кодирование:
const labelsTensor = tf.tensor2d(labels.map(label => {
const encoded = new Array(numClasses).fill(0);
encoded[label] = 1;
return encoded;
}));
3. Разделение на обучающую и тестовую выборки Важна сбалансированность классов и корректное разбиение данных (обычно 80/20 или 70/30).
После первичного обучения новых слоёв возможно включение части слоёв базовой модели в обучение для улучшения точности. Рекомендуется размораживать только верхние слои:
baseModel.layers.slice(-5).forEach(layer => layer.trainable = true);
Настройка скорости обучения (learning rate) имеет критическое значение: низкая скорость минимизирует разрушение уже выученных признаков базовой модели.
TensorFlow.js позволяет выполнять модели на CPU и WebGL. Для крупных моделей необходимо учитывать следующие аспекты:
tf.data для ленивой загрузки данных и
минимизации использования памяти.model.save('downloads://model') с
последующей оптимизацией с помощью tfjs-converter.model.predict с батчами вместо обработки
изображений по одному.Классификация изображений
Детекция объектов
Анализ текста
Эта методология позволяет создавать эффективные модели на JavaScript с минимальными вычислительными затратами, используя уже существующие наработки и обеспечивая высокую точность при ограниченных ресурсах.