Оценка модели: evaluate

Функция evaluate предназначена для количественной оценки качества обученной модели на наборе данных, который не использовался в процессе обучения. В контексте TensorFlow.js эта функция применяется к объектам моделей, созданным с помощью классов tf.Sequential и tf.LayersModel. Основная цель — вычисление значения функции потерь и метрик на тестовых данных, что позволяет понять, насколько модель способна обобщать информацию за пределами обучающей выборки.


Синтаксис и параметры

Метод вызывается у объекта модели следующим образом:

const result = model.evaluate(x, y, { batchSize, verbose });

Параметры:

  • x — входные данные для оценки. Может быть:

    • tf.Tensor с формой [numSamples, ...inputShape]
    • Массив тензоров для моделей с несколькими входами
  • y — целевые метки для соответствующих входов. Аналогично, может быть тензором или массивом тензоров.

  • batchSize (опционально) — размер мини-батча, используемого при вычислениях. Оптимальный размер зависит от объема данных и доступной памяти.

  • verbose (опционально) — уровень логирования. 0 — без вывода, 1 — вывод прогресса в консоль.

Возвращаемое значение: Функция возвращает массив значений, содержащих:

  1. Значение функции потерь.
  2. Значения метрик, указанных при компиляции модели.

Если метрик несколько, они возвращаются в том порядке, в котором были указаны при вызове model.compile().


Использование с разными типами моделей

Модели с одним входом и одной метрикой

Простейший случай — модель с одним входом и одной метрикой, например accuracy:

const result = model.evaluate(testXs, testYs);
result.print();

Вывод будет примерно таким:

Tensor
    [[0.135],  // Потери
     [0.95]]   // Точность

Здесь первый элемент массива соответствует функции потерь, второй — точности модели на тестовой выборке.

Модели с несколькими выходами

Если модель имеет несколько выходов, evaluate вернет массив для каждого выхода по отдельности:

const results = model.evaluate([x1, x2], [y1, y2]);
results.forEach(tensor => tensor.print());

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


Применение batchSize

Использование параметра batchSize важно при работе с большими наборами данных, чтобы избежать переполнения памяти:

const batchSize = 32;
const result = model.evaluate(testXs, testYs, { batchSize });

TensorFlow.js разбивает данные на пакеты указанного размера и последовательно вычисляет потери и метрики для каждого пакета, затем усредняет результаты.


Взаимодействие с tf.data.Dataset

Метод evaluate поддерживает объекты типа tf.data.Dataset, что позволяет оценивать модели на потоковых данных:

const dataset = tf.data.array({ xs: testXs, ys: testYs })
                      .batch(32);

const result = await model.evaluateDataset(dataset);

Отличие метода evaluateDataset в том, что он работает асинхронно и может эффективно обрабатывать большие объемы данных без необходимости загружать их полностью в память.


Интерпретация результатов

  • Потери (loss) — количественная мера расхождения предсказаний модели и фактических меток. Меньшее значение указывает на более точное соответствие.
  • Метрики — специфичные для задачи показатели, например точность (accuracy) для классификации или среднеквадратичная ошибка (mse) для регрессии.
  • Важно понимать, что низкая потеря не всегда означает высокую точность. Выбор метрики должен соответствовать конкретной задаче.

Пример комплексного использования

const model = tf.sequential({
  layers: [
    tf.layers.dense({ units: 64, activation: 'relu', inputShape: [10] }),
    tf.layers.dense({ units: 3, activation: 'softmax' })
  ]
});

model.compile({
  optimizer: 'adam',
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});

// Обучение модели
await model.fit(trainXs, trainYs, { epochs: 10, batchSize: 32 });

// Оценка модели
const [loss, accuracy] = model.evaluate(testXs, testYs);
console.log(`Loss: ${loss.dataSync()}, Accuracy: ${accuracy.dataSync()}`);

В этом примере показано сочетание методов fit и evaluate для полного цикла обучения и тестирования модели.


Важные рекомендации

  • Всегда использовать отдельный набор данных для оценки модели, чтобы получить корректную оценку обобщающей способности.
  • Для больших наборов данных предпочтительнее использовать evaluateDataset с батчингом.
  • При нескольких метриках следить за порядком их определения при компиляции модели, чтобы правильно интерпретировать результаты.
  • evaluate не изменяет параметры модели, а только вычисляет показатели на заданных данных.

Метод evaluate является ключевым инструментом для объективной проверки производительности модели и контроля переобучения, обеспечивая надежное измерение качества прогнозов.