One-hot кодирование является ключевым инструментом при работе с
категориальными данными в нейронных сетях. Оно позволяет преобразовать
метки классов в бинарный формат, который легко воспринимается моделью,
особенно при использовании функций потерь, ориентированных на
классификацию, таких как categorical_crossentropy.
One-hot кодирование превращает каждый класс в уникальный вектор,
длина которого равна количеству классов. Вектор содержит все нули, кроме
позиции, соответствующей конкретному классу, где стоит единица.
Например, если существует три класса: A, B,
C, их one-hot представление будет следующим:
Такое представление предотвращает неверное восприятие модели числового порядка классов, что особенно важно при классификации.
В 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 позволяет загружать модели, обученные в 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.
0 и 1, что
экономит память.One-hot кодирование является базовым, но критически важным инструментом подготовки меток для нейронных сетей в JavaScript и Keras.js, обеспечивая корректное обучение и точное предсказание категориальных данных.