Ранг, форма и тип данных тензора

Тензор в TensorFlow.js представляет собой многомерный массив данных. Его свойства определяют структуру и тип хранимой информации. Основные характеристики тензора — ранг, форма и тип данных.


Ранг тензора

Ранг (rank) определяет количество измерений тензора. В терминах линейной алгебры это количество осей, по которым можно индексировать элементы массива:

  • Скаляр — тензор ранга 0. Пример: tf.scalar(5). Не имеет осей, содержит одно значение.
  • Вектор — тензор ранга 1. Пример: tf.tensor1d([1, 2, 3]). Имеет одну ось, индексируемую одним числом.
  • Матрица — тензор ранга 2. Пример: tf.tensor2d([[1, 2], [3, 4]]). Имеет две оси: строки и столбцы.
  • Тензор более высоких рангов — ранга 3 и выше. Пример: tf.tensor3d([[[1],[2]], [[3],[4]]]). Каждое дополнительное измерение добавляет ось.

Ранг играет ключевую роль при построении моделей машинного обучения. Например, входные данные нейронной сети должны иметь строго определённый ранг. Несоответствие ранга часто вызывает ошибки во время обучения.


Форма тензора

Форма (shape) описывает размерность тензора по каждой оси. Она представляется в виде массива чисел, где каждый элемент — размер соответствующей оси:

const tensor = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);
console.log(tensor.shape); // [2, 3]
  • Первый элемент [2] — количество строк.
  • Второй элемент [3] — количество столбцов.

Форма позволяет точно определить структуру данных, что важно для операций:

  • Матричное умножение требует согласованных размеров: (m, n) * (n, p) = (m, p).
  • Изменение формы возможно с помощью reshape, сохраняя при этом данные:
const reshaped = tensor.reshape([3, 2]);
console.log(reshaped.shape); // [3, 2]

Нельзя изменить форму тензора на массив с другим количеством элементов, это вызовет ошибку.


Тип данных тензора

Тип данных (dtype) определяет, какой вид чисел хранится в тензоре. Основные типы:

  • float32 — числа с плавающей запятой, используется чаще всего для нейросетей.
  • int32 — целые числа 32-бит.
  • bool — логические значения.
  • complex64 — комплексные числа (редко используется в базовой практике).

Тип данных влияет на:

  • Операции с тензорами: например, нельзя напрямую умножать тензоры float32 и int32 без приведения типов.
  • Память и производительность: float32 занимает больше памяти, чем int32, но обеспечивает большую точность для вычислений с градиентами.
const tensor = tf.tensor([1, 2, 3], undefined, 'int32');
console.log(tensor.dtype); // int32

Если тип данных не указан, TensorFlow.js выбирает тип автоматически, исходя из переданных значений.


Практические примеры

  1. Создание тензора ранга 0:
const scalar = tf.scalar(42);
console.log(scalar.rank); // 0
console.log(scalar.shape); // []
  1. Создание матрицы:
const matrix = tf.tensor2d([[1, 2], [3, 4]]);
console.log(matrix.rank); // 2
console.log(matrix.shape); // [2, 2]
  1. Тензор ранга 3:
const tensor3 = tf.tensor3d([[[1],[2]], [[3],[4]]]);
console.log(tensor3.rank); // 3
console.log(tensor3.shape); // [2, 2, 1]
  1. Изменение формы тензора:
const t = tf.tensor2d([[1,2,3],[4,5,6]]);
const reshaped = t.reshape([3,2]);
console.log(reshaped.shape); // [3,2]

Связь ранга, формы и типов данных

  • Ранг определяет количество осей, форма — длину каждой оси, тип данных — что хранится в ячейках.
  • Для успешной работы с TensorFlow.js необходимо правильно задавать все три параметра.
  • Неправильный ранг или форма приводит к ошибкам во время операций или обучения моделей.
  • Приведение типов может потребоваться при арифметических операциях с разными dtype.

Эти три свойства составляют основу работы с тензорами и определяют структуру и поведение данных в вычислениях. Понимание их взаимосвязи критично для построения эффективных моделей машинного обучения и точных вычислений.