Работа с CSV и JSON данными

Keras.js — это библиотека для выполнения предобученных моделей Keras в среде браузера на JavaScript с использованием WebGL. Одним из ключевых аспектов работы с моделями является подготовка входных данных, особенно если данные представлены в формате CSV или JSON. В Keras.js данные должны быть преобразованы в массивы чисел (Float32Array) и соответствовать форме (shape) входного слоя модели.


Загрузка CSV данных

CSV (Comma-Separated Values) часто используется для хранения табличных данных. В JavaScript чтение CSV требует преобразования текстового формата в числовые массивы.

Пример загрузки CSV файла через fetch и его обработка:

async function loadCSV(url) {
    const response = await fetch(url);
    const text = await response.text();
    const rows = text.trim().split('\n');
    const data = rows.map(row => row.split(',').map(Number));
    return data;
}

В этом примере:

  • fetch получает CSV файл с сервера.
  • split('\n') разделяет текст на строки.
  • split(',') преобразует каждую строку в массив значений.
  • map(Number) конвертирует строковые значения в числа.

После получения массива чисел его необходимо привести к форме, подходящей для модели.


Преобразование данных в формат Keras.js

Keras.js требует, чтобы входные данные были представлены в виде одномерного Float32Array. Для двумерных данных из CSV (например, [samples][features]) используется функция flatten:

function flattenData(data) {
    return new Float32Array(data.flat());
}

Если модель ожидает определённую форму, необходимо убедиться, что данные имеют правильные размеры:

const inputShape = [1, 28, 28, 1]; // пример для изображения 28x28
const inputData = flattenData(csvData);

Здесь inputShape должен соответствовать форме входного слоя модели, а inputData — одномерный массив Float32Array.


Работа с JSON

JSON (JavaScript Object Notation) чаще используется для обмена структурированными данными. В контексте Keras.js JSON может содержать как массивы чисел, так и более сложные структуры.

Пример загрузки и обработки JSON данных:

async function loadJSON(url) {
    const response = await fetch(url);
    const json = await response.json();
    return json.data; // предполагается, что числовые данные находятся в поле data
}

После получения данных JSON нужно преобразовать их в Float32Array аналогично CSV:

const inputData = new Float32Array(jsonData.flat());

Приведение данных к форме модели

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

Пример функции для проверки и корректировки формы:

function reshapeData(data, shape) {
    const totalSize = shape.reduce((a, b) => a * b);
    if (data.length !== totalSize) {
        throw new Error(`Размер данных (${data.length}) не совпадает с ожидаемой формой (${totalSize})`);
    }
    return data;
}

Это обеспечивает соответствие данных требованиям модели и предотвращает ошибки во время предсказания.


Передача данных в модель Keras.js

После подготовки данных модель Keras.js использует объект KerasJS.Model для выполнения предсказаний:

const model = new KerasJS.Model({
    filepaths: {
        model: 'model.json',
        weights: 'model_weights.buf',
        metadata: 'model_metadata.json'
    },
    gpu: true
});

await model.ready();

const outputData = await model.predict({ input: inputData });
console.log(outputData);

Особенности работы:

  • filepaths указывают пути к JSON описанию модели, бинарным весам и метаданным.
  • Включение gpu: true позволяет использовать WebGL для ускорения вычислений.
  • Входной объект должен иметь ключ, соответствующий имени входного слоя модели.

Масштабирование и нормализация данных

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

function normalize(data, min = 0, max = 1) {
    const flatData = data.flat();
    const dataMin = Math.min(...flatData);
    const dataMax = Math.max(...flatData);
    return new Float32Array(flatData.map(x => (x - dataMin) / (dataMax - dataMin) * (max - min) + min));
}

Работа с батчами

Для больших наборов данных имеет смысл разбивать данные на батчи, чтобы уменьшить нагрузку на память браузера:

function createBatches(data, batchSize) {
    const batches = [];
    for (let i = 0; i < data.length; i += batchSize) {
        batches.push(new Float32Array(data.slice(i, i + batchSize).flat()));
    }
    return batches;
}

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


Практические рекомендации

  • Всегда проверять размерность данных после загрузки CSV или JSON.
  • Использовать Float32Array для совместимости с WebGL.
  • Нормализовать числовые данные в диапазоне, ожидаемом моделью.
  • Для больших данных применять батчи.
  • Проверять ключи входного объекта при передаче в predict.

Эти шаги обеспечивают корректную и эффективную работу моделей Keras.js с CSV и JSON данными, позволяя интегрировать машинное обучение непосредственно в браузерные приложения.