Для проведения юнит-тестирования моделей Keras.js в JavaScript требуется правильно подготовленное окружение. Основные компоненты:
Установка необходимых пакетов через npm:
npm install keras-js jest @tensorflow/tfjs-node
keras-js позволяет загружать модели, экспортированные
из Keras.@tensorflow/tfjs-node ускоряет выполнение
математических операций через нативные оптимизации.jest обеспечивает удобный синтаксис для описания тестов
и проверки результатов.В package.json необходимо добавить скрипт для запуска
тестов:
"scripts": {
"test": "jest"
}
Модель в формате Keras (.json и .weights)
загружается с помощью класса KerasJS.Model. Основные
параметры конструктора:
filepath — путь к JSON-файлу модели.backend — можно указать 'cpu' или
'webgl' для выполнения в браузере.Пример инициализации:
const KerasJS = require('keras-js');
const model = new KerasJS.Model({
filepaths: {
model: 'model.json',
weights: 'model_weights.buf'
},
backend: 'cpu'
});
await model.ready();
model.ready() возвращает промис, который разрешается
после полной загрузки архитектуры и весов модели.
Jest использует глобальные функции describe и
test (или it) для структурирования тестов.
Основные принципы:
Пример структуры теста для Keras.js:
describe('Тестирование модели классификации', () => {
let model;
beforeAll(async () => {
model = new KerasJS.Model({
filepaths: { model: 'model.json', weights: 'model_weights.buf' },
backend: 'cpu'
});
await model.ready();
});
test('Выходное значение для нулевого входа', async () => {
const inputData = new Float32Array([0, 0, 0, 0]);
const output = await model.predict({ input: inputData });
const expected = new Float32Array([0.25, 0.25, 0.25, 0.25]);
for (let i = 0; i < output.input.length; i++) {
expect(Math.abs(output.input[i] - expected[i])).toBeLessThan(0.01);
}
});
});
beforeAll обеспечивает однократную загрузку модели
перед запуском всех тестов.toBeLessThan(0.01).Юнит-тестирование можно разделить на несколько уровней:
Проверка структуры модели
inputShape,
outputShape).Тестирование предсказаний
Проверка совместимости бэкендов
Float32Array и Tensor.Пример проверки формы выходного тензора:
test('Форма выхода модели', async () => {
const inputData = new Float32Array([1, 2, 3, 4]);
const output = await model.predict({ input: inputData });
expect(output.input.length).toBe(4);
});
Так как Keras.js выполняет вычисления асинхронно, все тесты должны
быть промис-ориентированными или использовать async/await.
Пример:
test('Асинхронная проверка предсказания', async () => {
const inputData = new Float32Array([0.5, 0.5, 0.5, 0.5]);
const output = await model.predict({ input: inputData });
expect(output.input.reduce((a, b) => a + b, 0)).toBeCloseTo(1.0, 5);
});
toBeCloseTo для сравнения чисел с
плавающей точкой.reduce суммирует элементы выходного массива, что удобно
для проверки нормализации вероятностей.Для проверки устойчивости модели к некорректным данным можно
использовать мокированные входные данные или специально подставленные
undefined, null, неверные размеры массива.
Пример проверки ошибки:
test('Ошибка при неверной форме входа', async () => {
const invalidInput = new Float32Array([1, 2]); // Ожидается длина 4
await expect(model.predict({ input: invalidInput }))
.rejects
.toThrow(/Input shape mismatch/);
});
rejects.toThrow для асинхронного
тестирования исключений.Jest поддерживает запуск одинаковых тестов с разными входными данными
с помощью test.each:
test.each([
[new Float32Array([0, 0, 0, 0]), [0.25, 0.25, 0.25, 0.25]],
[new Float32Array([1, 1, 1, 1]), [0.25, 0.25, 0.25, 0.25]]
])('Проверка выхода для %p', async (inputData, expected) => {
const output = await model.predict({ input: inputData });
for (let i = 0; i < output.input.length; i++) {
expect(Math.abs(output.input[i] - expected[i])).toBeLessThan(0.01);
}
});
Для глубокого анализа работы модели можно включать логирование:
model.predict({ input: inputData })
.then(output => console.log('Output:', output))
.catch(err => console.error('Error:', err));
Jest легко интегрируется в пайплайны CI/CD (GitHub Actions, GitLab CI, Jenkins). Основные моменты:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm install
- run: npm test