tf.data.csv — это специализированный метод библиотеки
TensorFlow.js для удобной загрузки и предварительной обработки табличных
данных, хранящихся в формате CSV. Он позволяет эффективно интегрировать
данные в пайплайны обучения нейронных сетей, сохраняя при этом высокую
производительность и гибкость.
Метод tf.data.csv создаёт объект
tf.data.Dataset, который представляет поток данных,
доступный для итерации и дальнейшей обработки. Данные не загружаются
целиком в память сразу, что особенно важно при работе с крупными
CSV-файлами. Вместо этого TensorFlow.js использует ленивую загрузку —
строки читаются по мере необходимости.
Сигнатура функции:
tf.data.csv(source, options)
Request.options1. hasHeader boolean — определяет
наличие заголовка в CSV. По умолчанию true. Если заголовка
нет, имена колонок будут автоматически сгенерированы в формате
column0, column1 и т.д.
2. columnConfigs Объект, где ключи — имена колонок, а значения — конфигурации:
{
columnName: {
required: true, // Обязательное поле
dtype: 'float32', // Тип данных: 'float32' или 'string'
default: 0 // Значение по умолчанию, если в ячейке пусто
}
}
3. configuredColumnsOnly boolean — если
true, в набор будут включены только колонки, указанные в
columnConfigs. Остальные будут игнорированы.
4. delimiter string — разделитель
столбцов. По умолчанию ,.
5. compression Поддержка сжатых CSV-файлов.
Возможные значения: 'gzip', 'none'.
Каждая строка CSV преобразуется в объект, где ключи — имена колонок, а значения — элементы данных. Для передачи данных в модель необходимо конвертировать их в тензоры:
const dataset = tf.data.csv('data.csv', { hasHeader: true })
.map(({ xs, ys }) => {
return {
xs: tf.tensor(Object.values(xs)), // Признаки
ys: tf.tensor(Object.values(ys)) // Метки
};
});
Использование метода .map() позволяет гибко
преобразовывать строки в нужный формат для обучения нейронных сетей.
Dataset поддерживает методы для эффективного формирования батчей и случайного перемешивания данных:
const batchSize = 32;
const preparedDataset = dataset
.shuffle(1000) // Перемешивание данных с буфером 1000
.batch(batchSize)
.prefetch(1); // Подготовка следующего батча заранее
Категориальные колонки требуют кодирования в числовой формат. Чаще всего используется one-hot кодирование:
function oneHotEncode(label, classes) {
const vector = new Array(classes.length).fill(0);
const index = classes.indexOf(label);
if (index !== -1) vector[index] = 1;
return vector;
}
const dataset = tf.data.csv('data.csv', { hasHeader: true })
.map(row => ({
xs: tf.tensor(Object.values(row.xs)),
ys: tf.tensor(oneHotEncode(row.ys.label, ['A', 'B', 'C']))
}));
Для числовых данных часто необходимо:
[0, 1] или стандартизация
(z-score):.map(({ xs, ys }) => {
const xsValues = Object.values(xs).map(val => val === null ? 0 : val);
const normalized = xsValues.map(val => val / 100); // пример нормализации
return {
xs: tf.tensor(normalized),
ys: tf.tensor(ys)
};
});
Метод tf.data.csv возвращает объект
Dataset, который может быть использован асинхронно с
for await:
for await (const { xs, ys } of dataset) {
console.log(xs.shape, ys.shape);
}
Это позволяет обрабатывать очень большие CSV-файлы, не загружая их полностью в память.
tf.Model.fitDatasetПодготовленный Dataset напрямую интегрируется в метод
model.fitDataset:
const model = tf.sequential();
model.add(tf.layers.dense({ units: 10, inputShape: [featureCount] }));
model.add(tf.layers.dense({ units: numClasses, activation: 'softmax' }));
model.compile({
optimizer: 'adam',
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
await model.fitDataset(preparedDataset, {
epochs: 50,
batchesPerEpoch: 20
});
.batch() и .prefetch() для
минимизации времени ожидания чтения данных..shuffle() с разумным размером буфера для
предотвращения чрезмерного потребления памяти..map(), чтобы данные поступали
в модель уже готовыми.tf.data.csv предоставляет мощный инструмент для
построения пайплайнов машинного обучения в браузере или на сервере
Node.js, позволяя гибко работать с табличными данными любого объема.