Тестирование слоёв и моделей

TensorFlow.js предоставляет широкие возможности для построения, обучения и тестирования нейронных сетей прямо в браузере или в среде Node.js. Ключевой аспект разработки моделей — проверка их корректности и производительности, что включает тестирование отдельных слоёв и полной архитектуры модели.


Тестирование отдельных слоёв

Каждый слой TensorFlow.js является объектом класса tf.layers.Layer и обладает методами для прямого вычисления выходов на основе входных данных. Для тестирования слоя важно проверять:

  1. Корректность формы входных и выходных тензоров. Методы layer.apply(input) или layer.call(input) позволяют получить выходные данные слоя. После этого можно проверить размерность:

    const denseLayer = tf.layers.dense({units: 4, inputShape: [3]});
    const input = tf.tensor2d([[1, 2, 3]]);
    const output = denseLayer.apply(input);
    console.log(output.shape); // [1, 4]

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

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

    const reluLayer = tf.layers.dense({units: 2, activation: 'relu'});
    const inputTensor = tf.tensor2d([[-1, 0, 1]]);
    const outputTensor = reluLayer.apply(inputTensor);
    outputTensor.print(); // Должны быть все неотрицательные значения
  3. Инициализация весов. Проверка корректной инициализации весов и смещений позволяет убедиться, что слой настроен правильно:

    const dense = tf.layers.dense({units: 3, inputShape: [2], kernelInitializer: 'ones'});
    const output = dense.apply(tf.tensor2d([[1, 2]]));
    output.print(); // Ожидается сумма входов, так как веса равны 1

Тестирование полной модели

Модель в TensorFlow.js создаётся с помощью tf.sequential() или tf.model(). Тестирование модели включает несколько аспектов:

  1. Проверка структуры модели. Используется метод model.summary() для вывода информации о слоях, параметрах и формах:

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

    Вывод помогает убедиться, что каждый слой имеет ожидаемую форму и количество параметров.

  2. Тестирование прямого прохода (forward pass). На этом этапе проверяется, что модель корректно обрабатывает входные данные:

    const testInput = tf.tensor2d([[0.5, 0.1, -0.3]]);
    const output = model.predict(testInput);
    output.print(); // Должен быть тензор размером [1, 2]

    Forward pass позволяет выявить ошибки в вычислениях до начала обучения.

  3. Проверка функции потерь и метрик. Для моделей, предназначенных для классификации или регрессии, важно тестировать работу функции потерь и метрик на небольших данных:

    model.compile({
      optimizer: 'sgd',
      loss: 'meanSquaredError',
      metrics: ['mse']
    });
    
    const xs = tf.tensor2d([[1, 2, 3]]);
    const ys = tf.tensor2d([[0, 1]]);
    const evalResult = model.evaluate(xs, ys);
    evalResult[0].print(); // Значение функции потерь
    evalResult[1].print(); // Значение метрики

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

  4. Юнит-тестирование с использованием tf.test_util. TensorFlow.js предоставляет утилиты для сравнения тензоров и проверки точности:

    const tf = require('@tensorflow/tfjs-node');
    const expected = tf.tensor2d([[0.5, 0.5]]);
    const actual = model.predict(tf.tensor2d([[1, 1, 1]]));
    tf.test_util.expectArraysClose(actual, expected, 1e-3);

    Этот подход позволяет автоматизировать тестирование и интегрировать его в CI/CD процессы.


Проверка модели на устойчивость и производительность

Помимо функционального тестирования, важно анализировать:

  • Стабильность при разных диапазонах входов. Проверка, что модель не выдает NaN или бесконечные значения при крайних данных.

  • Производительность forward pass. Использование метода tf.time() позволяет измерить время вычислений:

    tf.time(() => model.predict(tf.tensor2d([[0.1, 0.2, 0.3]])));
  • Тестирование на батчах. Важно проверять работу модели не только на одном примере, но и на пакетах данных различного размера.


Практика: создание тестов для слоёв и моделей

  • Для слоёв создаются тестовые тензоры с известными значениями и проверяется соответствие выходных данных ожидаемым.
  • Для моделей проверяется совместимость формы входов и выходов, корректность функции потерь, стабильность вычислений и производительность.
  • Использование утилит tf.test_util обеспечивает строгую проверку численных значений, что особенно важно для моделей с малыми отклонениями, где визуальный контроль невозможен.

Тщательное тестирование на каждом уровне — слой, модуль, модель — позволяет создавать надежные нейронные сети, минимизировать ошибки в данных и вычислениях и гарантирует предсказуемость работы модели в продакшн-среде.