One-hot кодирование меток

One-hot кодирование является ключевым инструментом при работе с категориальными данными в нейронных сетях. Оно позволяет преобразовать метки классов в бинарный формат, который легко воспринимается моделью, особенно при использовании функций потерь, ориентированных на классификацию, таких как categorical_crossentropy.

Основная концепция

One-hot кодирование превращает каждый класс в уникальный вектор, длина которого равна количеству классов. Вектор содержит все нули, кроме позиции, соответствующей конкретному классу, где стоит единица. Например, если существует три класса: A, B, C, их one-hot представление будет следующим:

  • A → [1, 0, 0]
  • B → [0, 1, 0]
  • C → [0, 0, 1]

Такое представление предотвращает неверное восприятие модели числового порядка классов, что особенно важно при классификации.

Преобразование меток в JavaScript

В Keras.js используется подход, совместимый с форматами, подготовленными в Python Keras, поэтому для работы с one-hot кодированием меток часто применяются вспомогательные функции JavaScript. Классический способ — создать массив нулей фиксированной длины и выставить единицу на позиции класса:

function oneHotEncode(labels, numClasses) {
    return labels.map(label => {
        const vector = new Array(numClasses).fill(0);
        vector[label] = 1;
        return vector;
    });
}

// Пример использования
const labels = [0, 2, 1, 0]; // номера классов
const numClasses = 3;
const encodedLabels = oneHotEncode(labels, numClasses);
console.log(encodedLabels);
/*
[
  [1, 0, 0],
  [0, 0, 1],
  [0, 1, 0],
  [1, 0, 0]
]
*/

Ключевой момент: важно заранее определить количество классов (numClasses), чтобы векторы имели одинаковую длину.

Интеграция с Keras.js

Keras.js позволяет загружать модели, обученные в Python Keras, и выполнять предсказания прямо в браузере. Модели, использующие категориальные выходы, требуют, чтобы входные метки были one-hot кодированы. Пример передачи закодированных меток для вычисления функции потерь:

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

const model = new KerasJS.Model({
  filepath: 'model.bin',
  gpu: true
});

// Пример предсказания
const inputData = new Float32Array([/* данные признаков */]);
const targetData = new Float32Array(encodedLabels.flat());

model.predict({ input: inputData })
  .then(output => {
      console.log('Выход модели:', output.output);
      // Можно сравнивать с targetData для вычисления точности
  })
  .catch(err => console.error(err));

Здесь encodedLabels.flat() используется для превращения двумерного массива в одномерный формат, который ожидает Keras.js.

Преобразование категориальных меток из текста

В реальных задачах метки часто представлены строками. Их необходимо сначала преобразовать в числовые индексы, а затем выполнить one-hot кодирование:

function labelToIndex(labels) {
    const uniqueLabels = Array.from(new Set(labels));
    const labelMap = Object.fromEntries(uniqueLabels.map((label, i) => [label, i]));
    return labels.map(label => labelMap[label]);
}

const textLabels = ['cat', 'dog', 'mouse', 'cat'];
const numericLabels = labelToIndex(textLabels);
const encodedTextLabels = oneHotEncode(numericLabels, 3);

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

Оптимизация работы с большими массивами

Для больших датасетов часто применяется библиотека ndarray или Tensor из tensorflow.js для эффективного представления one-hot кодирования. Использование Typed Arrays снижает нагрузку на память и ускоряет вычисления:

const tf = require('@tensorflow/tfjs');

const labelsTensor = tf.tensor1d(numericLabels, 'int32');
const oneHotTen sor = tf.oneHot(labelsTensor, numClasses);
oneHotTensor.print();

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

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

  • Всегда проверять размерность векторов после one-hot кодирования. Неправильная длина приводит к ошибкам при передаче данных в Keras.js.
  • Использовать одинаковый порядок классов для всех этапов работы с моделью.
  • Для бинарной классификации можно использовать single-hot кодирование или представление меток как 0 и 1, что экономит память.

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