One-hot кодирование — это метод представления категориальных данных в виде бинарных векторов, где каждой категории соответствует уникальный индекс, а значение в этом индексе равно 1, а все остальные элементы вектора — 0. Этот подход широко применяется при работе с нейронными сетями, так как большинство моделей требуют числового представления входных данных.
Пусть имеется множество категорий:
['красный', 'зелёный', 'синий']. Каждая категория
преобразуется в вектор фиксированной длины, равной количеству категорий.
Для данного примера:
'красный' → [1, 0, 0]'зелёный' → [0, 1, 0]'синий' → [0, 0, 1]Такое представление позволяет моделям распознавать категории без привязки к числовому порядку, что исключает ложные зависимости между значениями.
TensorFlow.js предоставляет встроенные функции для преобразования категориальных данных в формат one-hot.
import * as tf from '@tensorflow/tfjs';
// Пример категориальных данных
const labels = [0, 1, 2, 1]; // Индексы категорий
const numClasses = 3;
// Преобразование в one-hot векторы
const oneHotLab els = tf.oneHot(labels, numClasses);
oneHotLabels.print();
Результат:
[[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 1, 0]]
Ключевые моменты:
tf.oneHot(indices, depth) — indices: массив индексов
категорий, depth: общее число категорий.float32 по
умолчанию.Для текста сначала необходимо преобразовать слова в числовые индексы. Пример с набором слов:
const vocabulary = ['кот', 'собака', 'птица'];
const wordToIndex = {
'кот': 0,
'собака': 1,
'птица': 2
};
const text = ['кот', 'птица', 'собака'];
const indices = text.map(word => wordToIndex[word]);
const oneHotT ext = tf.oneHot(indices, vocabulary.length);
oneHotText.print();
Такое представление особенно полезно для задач классификации текста или при использовании рекуррентных сетей, когда входные данные требуют фиксированного числового формата.
При обучении моделей TensorFlow.js one-hot часто используется для меток классов. Например, при многоклассовой классификации:
const xs = tf.tensor2d([
[0.1, 0.2],
[0.4, 0.5],
[0.7, 0.8]
]);
const ys = tf.oneHot([0, 1, 2], 3); // Метки классов
const model = tf.sequential();
model.add(tf.layers.dense({units: 5, inputShape: [2], activation: 'relu'}));
model.add(tf.layers.dense({units: 3, activation: 'softmax'}));
model.compile({optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy']});
model.fit(xs, ys, {epochs: 50}).then(() => {
console.log('Обучение завершено');
});
Особенности:
categoricalCrossentropy.sparseCategoricalCrossentropy, что
экономит память.tf.oneHot можно
применять к многомерным массивам, формируя батчи данных для
обучения.tf.tidy — это может привести к утечке памяти.tf.oneHot вместо ручного создания
массивов — это обеспечивает оптимизацию под GPU и WebGL.One-hot кодирование в TensorFlow.js — фундаментальный инструмент для работы с категориальными данными и текстом, обеспечивающий правильное представление информации для нейронных сетей. Правильное применение этого подхода повышает точность моделей и упрощает обработку данных при обучении.