Хотя функции tf.concat
и Array.push
выглядят и ведут себя одинаково, есть одно большое отличие:
tf.concat
создает новый тензор из ввода
Array.push
добавляет ввод в первый массив
Примеры
tf.concat
const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([3]);
const c = tf.concat([a, b]);
a.print(); // Result: Tensor [1, 2]
b.print(); // Result: Tensor [3]
c.print(); // Result: Tensor [1, 2, 3]
Результирующая переменная c
является новым тензором, а a
и b
не изменяются.
Array.push
const a = [1,2];
a.push(3);
console.log(a); // Result: [1,2,3]
Здесь переменная a
напрямую изменяется.
Влияние на время выполнения
Для скорости выполнения это означает, что tf.concat
копирует все значения тензора в новый тензор перед добавлением ввода. Очевидно, это занимает больше времени, чем больше массив, который нужно скопировать. В отличие от этого, Array.push
не создает копию массива, и поэтому время выполнения будет более или менее одинаковым, независимо от размера массива.
Обратите внимание, что это «по замыслу», поскольку тензоры неизменны, поэтому каждая операция над существующим тензором всегда создает новый тензор. Цитата из документов :
Тензорные переменные являются неизменяемыми, поэтому все операции всегда возвращают новые Тензорные и никогда не изменяют входные Тензорные.
Поэтому, если вам нужно создать большой тензор из входных данных, рекомендуется сначала прочитать все данные из вашего файла и объединить их с «ванильными» функциями JavaScript, прежде чем создавать из них тензор.
Обработка данных слишком велика для памяти
Если у вас такой большой набор данных, что вам нужно обрабатывать его порциями из-за ограничений памяти, у вас есть два варианта:
- Используйте функцию
trainOnBatch
- Использовать генератор набора данных
Вариант 1: trainOnBatch
Функция trainOnBatch
позволяет обучаться на пакете данных вместо использования полного набора данных к нему. Таким образом, вы можете разбить свой код на разумные партии перед их обучением, чтобы вам не приходилось объединять данные одновременно.
Вариант 2: генератор наборов данных
Другой ответ уже прошел основы. Это позволит вам использовать функцию генератора JavaScript для подготовки данных. Я рекомендую использовать синтаксис генератора вместо фабрики итераторов (используется в другом ответе), поскольку это более современный синтаксис JavaScript.
Пример (взято из документов ):
function* dataGenerator() {
const numElements = 10;
let index = 0;
while (index < numElements) {
const x = index;
index++;
yield x;
}
}
const ds = tf.data.generator(dataGenerator);
Затем вы можете использовать функцию fitDataset
для обучения вашей модели.