Предсказание: predict

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

const predictions = model.predict(inputTensor);

inputTensor должен соответствовать форме входных данных модели. Если модель ожидает вход размером [batchSize, features], то необходимо формировать тензор именно такой размерности.


Типы входных данных

predict поддерживает несколько форматов:

  1. Один тензор — используется для моделей с одним входом.
  2. Массив тензоров — когда модель имеет несколько входов.
  3. Объект с именованными тензорами — удобно для моделей с именованными входами, особенно после сохранения модели в формате SavedModel или TF.js Layers.

Пример для модели с несколькими входами:

const predictions = model.predict([tensorA, tensorB]);

Именованный формат:

const predictions = model.predict({input1: tensorA, input2: tensorB});

Форматы выхода

Метод возвращает тензор или массив тензоров, в зависимости от структуры модели. Если модель имеет один выход — возвращается один тензор, если несколько — массив тензоров.

Для преобразования предсказаний в удобный для анализа формат используется метод .dataSync() или .array():

const outputArray = predictions.dataSync();

.dataSync() возвращает синхронный массив, .array() — промис, который асинхронно возвращает данные в виде вложенных массивов JavaScript.


Подготовка данных для предсказания

Правильная подготовка данных является критически важной для корректного предсказания:

  • Нормализация: масштабирование значений входных данных в диапазон, соответствующий данным, на которых обучалась модель.
  • Форма тензора: соответствие размерности [batchSize, features].
  • Тип данных: обычно float32, но может отличаться в зависимости от модели.

Пример подготовки одного входа:

const inputArray = [0.5, 0.2, 0.1];
const inputTensor = tf.tensor2d([inputArray], [1, 3], 'float32');

Batch-предсказания

predict поддерживает batch-предсказания, что позволяет обрабатывать несколько примеров одновременно:

const batchInput = tf.tensor2d([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], [2, 3]);
const batchPredictions = model.predict(batchInput);

Преимущества использования batch:

  • Экономия ресурсов при обработке больших массивов данных.
  • Сокращение времени инференса за счет оптимизации вычислений на GPU.

Интеграция с визуализацией

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

const predictions = model.predict(inputTensor);
predictions.array().then(array => {
  console.log("Предсказанные значения:", array);
});

Для изображений чаще всего используется tf.browser.fromPixels:

const imgTensor = tf.browser.fromPixels(imageElement)
                        .resizeNearestNeighbor([224, 224])
                        .toFloat()
                        .expandDims();
const predictions = model.predict(imgTensor);

Тонкости и ошибки при использовании

  1. Несоответствие размерности входа — одна из самых частых причин ошибок. Ошибки вида Error: Input shape mismatch означают, что форма тензора не совпадает с ожидаемой.
  2. Необученная модельpredict сработает, но предсказания будут случайными.
  3. Освобождение ресурсов — тензоры нужно удалять через dispose(), чтобы избежать утечек памяти:
inputTensor.dispose();
predictions.dispose();
  1. Асинхронность — для .array() нужно использовать await или .then(), иначе можно получить неполные данные.

Использование predict с последовательными и функциональными моделями

Последовательные модели (Sequential):

const model = tf.sequential();
model.add(tf.layers.dense({units: 4, inputShape: [3]}));
model.add(tf.layers.dense({units: 1}));

const inputTensor = tf.tensor2d([[0.1, 0.2, 0.3]]);
const prediction = model.predict(inputTensor);

Функциональные модели (Functional API) позволяют объединять несколько входов и выходов:

const inputA = tf.input({shape: [3]});
const inputB = tf.input({shape: [2]});
const merged = tf.layers.concatenate().apply([inputA, inputB]);
const output = tf.layers.dense({units: 1}).apply(merged);

const model = tf.model({inputs: [inputA, inputB], outputs: output});
const pred = model.predict([tf.tensor2d([[0.1, 0.2, 0.3]]), tf.tensor2d([[0.5, 0.6]])]);

Преобразование предсказаний для дальнейшего анализа

После получения тензора можно выполнять постобработку:

  • Классификация: использование argMax() для выбора класса с наибольшей вероятностью.
  • Регрессия: прямое использование числовых значений.
  • Приведение к числу JavaScript: для одномерных предсказаний predictions.dataSync()[0].

Пример с классификацией:

const predictions = model.predict(inputTensor);
const predictedClass = predictions.argMax(-1).dataSync()[0];

Оптимизация работы

  • Использование tf.tidy() для автоматического освобождения промежуточных тензоров:
tf.tidy(() => {
  const predictions = model.predict(inputTensor);
  // Работа с predictions
});
  • Использование батчей при больших объемах данных.
  • Преобразование данных в тензоры заранее, чтобы избежать лишних преобразований в процессе инференса.

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