Сохранение в файловую систему в Node.js

Для работы с Keras.js в среде Node.js используется пакет keras-js, который предоставляет возможность загружать и выполнять модели, подготовленные с использованием Keras в Python. Установка производится через npm:

npm install keras-js

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

const KerasJS = require('keras-js');

Важно учитывать, что Keras.js ориентирован на использование моделей, экспортированных в форматах .json для структуры сети и .bin для весов.


Загрузка и подготовка модели

Модель Keras необходимо сначала экспортировать в формат, поддерживаемый Keras.js. В Python это выполняется следующим образом:

from keras.models import load_model
import json
import numpy as np

model = load_model('model.h5')

# Экспорт структуры модели
model_json = model.to_json()
with open('model.json', 'w') as json_file:
    json_file.write(model_json)

# Экспорт весов
model.save_weights('model_weights.bin', format='bin')

После этого файлы model.json и model_weights.bin становятся доступными для загрузки в Node.js.

В Node.js модель загружается следующим образом:

const model = new KerasJS.Model({
  filepaths: {
    model: 'path/to/model.json',
    weights: 'path/to/model_weights.bin'
  },
  gpu: false
});

model.ready()
  .then(() => console.log('Модель успешно загружена'))
  .catch(err => console.error('Ошибка загрузки модели:', err));

Параметр gpu указывает, использовать ли WebGL ускорение (при работе в браузере) или нет. В Node.js обычно используется false.


Работа с входными данными

В Keras.js входные данные передаются в виде объектов, где ключ — это имя входного слоя модели, а значение — тензор в формате Float32Array. Например, если входной слой называется input_1:

const inputData = {
  input_1: new Float32Array([0.5, 0.2, 0.1, 0.7])
};

model.predict(inputData)
  .then(outputData => {
    console.log('Результат предсказания:', outputData);
  })
  .catch(err => console.error('Ошибка предсказания:', err));

Форма массива должна совпадать с ожидаемой моделью. Для многомерных входов используется Float32Array соответствующей длины, с учетом flatten или reshaping, если требуется.


Сохранение предсказаний в файловую систему

Node.js позволяет работать с файловой системой через встроенный модуль fs. Для сохранения результатов предсказаний достаточно преобразовать выходные данные в удобный формат, например JSON или CSV:

const fs = require('fs');

model.predict(inputData)
  .then(outputData => {
    // Преобразование данных в JSON
    const jsonData = JSON.stringify(outputData, null, 2);
    
    // Сохранение в файл
    fs.writeFileSync('prediction_output.json', jsonData);
  })
  .catch(err => console.error('Ошибка при сохранении предсказаний:', err));

Для CSV можно использовать пакет csv-writer:

const createCsvWriter = require('csv-writer').createObjectCsvWriter;

const csvWriter = createCsvWriter({
  path: 'prediction_output.csv',
  header: Object.keys(outputData).map(key => ({id: key, title: key}))
});

const records = Object.keys(outputData)[0] ? Object.keys(outputData).map(key => ({[key]: outputData[key]})) : [];

csvWriter.writeRecords(records)
  .then(() => console.log('CSV файл успешно сохранен'));

Управление большими моделями и бинарными весами

При работе с моделями большого размера следует учитывать несколько особенностей:

  • Постепенная загрузка весов: если весовые файлы превышают несколько сотен мегабайт, рекомендуется использовать потоки (fs.createReadStream) для чтения бинарных данных.
  • Буферизация данных: данные можно загружать в буфер перед передачей в Keras.js:
const buffer = fs.readFileSync('model_weights.bin');
model.weights = buffer;
  • Асинхронная обработка: Keras.js полностью поддерживает промисы, что позволяет не блокировать основной поток Node.js при вычислениях.

Отладка и логирование

Для детальной диагностики загрузки и предсказаний используется:

model.ready()
  .then(() => console.log('Модель загружена'))
  .catch(err => console.error('Ошибка при загрузке модели:', err));

model.predict(inputData)
  .then(output => console.log('Предсказание:', output))
  .catch(err => console.error('Ошибка предсказания:', err));

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


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

  • Формат Float32: Keras.js оптимизирован под массивы Float32Array. Использование других типов данных значительно снижает скорость.
  • Пакетная обработка: если есть множество входов, лучше группировать их в батчи и передавать за один вызов predict, чтобы минимизировать накладные расходы на вызовы функции.
  • Минимизация сериализации: при повторных предсказаниях избегать лишнего конвертирования в JSON до завершения всех вычислений.

Итоговая структура работы с Keras.js и Node.js

  1. Экспорт модели и весов из Keras в формате JSON/BIN.
  2. Установка keras-js через npm и подключение в коде.
  3. Загрузка модели и ожидание готовности через model.ready().
  4. Подготовка входных данных в формате Float32Array.
  5. Выполнение предсказания через model.predict().
  6. Сохранение выходных данных в файловую систему (JSON, CSV, бинарный формат).
  7. Оптимизация работы с большими моделями и пакетной обработкой данных.

Эта последовательность обеспечивает эффективное применение Keras.js в серверных приложениях Node.js, позволяя интегрировать предобученные модели в полноценные рабочие процессы.