Классификация через предобученные модели

TensorFlow.js предоставляет мощный инструментарий для использования предобученных моделей, что позволяет выполнять сложные задачи машинного обучения без необходимости обучать модели с нуля. Это особенно актуально для задач классификации изображений, текста и других типов данных. Основная идея заключается в том, что модель уже обучена на большом наборе данных и может быть использована для извлечения признаков или прямой классификации.

Загрузка предобученной модели

В TensorFlow.js доступно несколько способов загрузки предобученной модели:

  1. Через URL модели, сохранённой в формате TensorFlow.js:
import * as tf from '@tensorflow/tfjs';

const model = await tf.loadLayersModel('https://example.com/model.json');
  1. Использование готовых моделей из пакета @tensorflow-models, таких как MobileNet, Coco-SSD, BodyPix:
import * as mobilenet from '@tensorflow-models/mobilenet';

const model = await mobilenet.load();

Второй подход удобен, так как модель сразу оптимизирована для браузера и содержит функции классификации и предобработки данных.

Подготовка данных для классификации

Для корректной работы модели необходимо привести входные данные к формату, ожидаемому моделью:

  • Изображения необходимо преобразовать в тензор:
const img = document.getElementById('image');
const tensor = tf.browser.fromPixels(img)
                 .resizeNearestNeighbor([224, 224])
                 .toFloat()
                 .expandDims();
  • Масштабирование пикселей может потребоваться в зависимости от модели (например, MobileNet требует нормализации пикселей в диапазоне [−1, 1]):
const normalized = tensor.div(tf.scalar(127.5)).sub(tf.scalar(1));

Классификация изображений

После подготовки тензора можно выполнить классификацию:

const predictions = await model.classify(img);
predictions.forEach(p => {
  console.log(`${p.className}: ${p.probability.toFixed(4)}`);
});

Ключевой момент: classify возвращает массив объектов, где className — название класса, а probability — вероятность принадлежности изображения этому классу.

Извлечение признаков (Feature Extraction)

Для задач transfer learning часто используется извлечение признаков из последнего скрытого слоя модели:

const activation = model.infer(tensor, 'conv_preds');

activation — это тензор признаков, который можно использовать в качестве входа для собственной модели, обучаемой на новом наборе данных.

Создание кастомного классификатора на основе предобученной модели

  1. Заморозка слоев предобученной модели, чтобы сохранить её знания:
model.layers.forEach(layer => layer.trainable = false);
  1. Добавление новых слоев для задачи классификации:
const newModel = tf.sequential();
newModel.add(tf.layers.dense({inputShape: [activation.shape[1]], units: 128, activation: 'relu'}));
newModel.add(tf.layers.dense({units: numClasses, activation: 'softmax'}));
  1. Компиляция и обучение:
newModel.compile({
  optimizer: tf.train.adam(),
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});

await newModel.fit(trainXs, trainYs, {epochs: 10, batchSize: 32});

Оптимизация и производительность

  • Для работы в браузере рекомендуется использовать WebGL backend:
await tf.setBackend('webgl');
  • Для мобильных устройств можно применять тензорные оптимизации и уменьшать размер входных изображений.

  • Предобученные модели в TensorFlow.js часто поставляются в виде легковесных версий (MobileNet, Tiny YOLO), что позволяет выполнять классификацию с минимальной задержкой.

Использование предобученных моделей для текста

TensorFlow.js поддерживает также текстовые модели, такие как Universal Sentence Encoder:

import * as use from '@tensorflow-models/universal-sentence-encoder';

const model = await use.load();
const embeddings = await model.embed(['Пример текста для классификации']);

Эти векторы признаков можно подавать на вход классификатора для анализа тональности, тематической классификации или кластеризации.

Практические советы

  • Для работы с изображениями рекомендуется использовать HTMLCanvasElement, чтобы динамически подготавливать изображения к классификации.
  • Модели, загружаемые из @tensorflow-models, уже включают функции предобработки, что облегчает интеграцию.
  • Для больших наборов данных лучше использовать tf.data API, чтобы создавать потоковые батчи и избегать переполнения памяти.
  • Сочетание предобученной модели и собственного классификатора (transfer learning) позволяет достичь высокой точности при ограниченных ресурсах.

Предобученные модели в TensorFlow.js открывают возможность создавать мощные веб-приложения с машинным обучением, используя готовые решения для извлечения признаков и классификации, что значительно ускоряет разработку и уменьшает вычислительные затраты.