тензор
— просто контейнер для данных. У любого тензора есть два
фундаментальных свойства: тип данных (dtype) и форма.
dtype
определяет, какие
виды значений можно хранить в данном тензоре. Конкретный тензор способен хра
нить ровно один вид значений. На момент написания данной книги (версия 0.13.5)
в TensorFlow.js поддерживались следующие dtype: float32, int32 и bool.
Б
Краткое руководство
по тензорам и операциям
над ними в TensorFlow.js
550
Приложения
Форма (shape) — это массив целых чисел, определяющий количество элементов
тензора и то, как они организованы. Ее можно считать «формой и размером» кон
тейнератензора (рис. Б.1).
Рис. Б.1.
Примеры тензоров ранга 0, 1, 2, 3 и 4
Длина формы называется
рангом
(rank) тензора. Например, ранг одномерного
тензора
(вектора)
равен 1. У одномерного тензора форма представляет собой мас
сив, содержащий одно число, соответствующее длине этого одномерного тензора.
При увеличении ранга на 1 получается двумерный тензор, который можно наглядно
изобразить в виде сетки чисел на двумерной плоскости (в качестве примера можно
привести изображение в оттенках серого). Форма двумерного тензора состоит из
двух чисел, описывающих высоту и ширину этой сетки. При дальнейшем увеличении
ранга на 1 получается трехмерный тензор. Как показано в примере на рис. Б.1, трех
мерный тензор можно наглядно изобразить в виде трехмерной сетки чисел. Форма
трехмерного тензора состоит из трех чисел, соответствующих размерам этой сетки
по трем измерениям. Думаем, закономерность уже ясна. Тензоры ранга 4 (четырех
мерные тензоры) непосредственно визуализировать сложнее, поскольку мы живем
в трехмерном мире. Четырехмерные тензоры применяются во множестве моделей,
например в глубоких сверточных сетях. TensorFlow.js поддерживает тензоры вплоть
до ранга 6. На практике тензоры ранга 5 используются лишь в некоторых нишевых
сценариях (например, при работе с видеоданными), а тензоры ранга 6 — еще реже.
Б.1.1. Скаляры (тензоры ранга 0)
Скаляр — это тензор, форма которого представляет собой пустой массив (
[]
). У него
нет осей координат, и он содержит только одно значение. Создать новый скаляр мож
но с помощью функции
tf.scalar()
. В консоли JavaScript (опять же предполагая,
что TensorFlow.js загружен и доступен под псевдонимом
tf
), сделайте следующее:
Приложение Б. Краткое руководство по тензорам и операциям над ними
551
> const myScalar = tf.scalar(2018);
1
1
> myScalar.print();
Tensor
2018
> myScalar.dtype;
"float32"
> myScalar.shape;
[]
> myScalar.rank;
0
Мы создали скалярный тензор, содержащий одно значение
2021
. Его форма —
пустой список, как и следовало ожидать. dtype у него по умолчанию —
"float32"
.
Чтобы dtype был целым числом, необходимо указать дополнительный аргумент
'int32'
при вызове функции
tf.scalar()
:
> const myIntegerScalar = tf.scalar(2021, 'int32');
> myIntegerScalar.dtype;
"int32"
Для извлечения данных обратно из тензора можно воспользоваться асинхрон
ным методом
data()
. Этот метод асинхронный, поскольку в общем случае тензор
может храниться не только в основной памяти, а, например, в GPU, в виде тексту
ры WebGL. Извлечение значений подобных тензоров требует операций, которые
могут не выполняться сразу же, а нам не хотелось бы, чтобы они блокировали
основной поток выполнения JavaScript. Именно поэтому метод
data()
— асин
хронный. Существует также синхронная функция, предназначенная для извлечения
значений тензоров с помощью опроса:
dataSync()
. Этот метод удобен, но блокирует
основной поток выполнения JavaScript, так что использовать его следует осмотри
тельно (например, во время отладки). Лучше использовать везде, где можно, асин
хронный метод
data()
:
> arr = await myScalar.data();
Float32Array [2018]
> arr.length
1
> arr[0]
2018
Пример использования
dataSync()
:
> arr = myScalar.dataSync();
Float32Array [2018]
> arr.length
1
> arr[0]
2018
1
Обратите внимание, что ради экономии места и большей ясности мы опустили строки,
выведенные в консоль JavaScript в результате присваиваний, поскольку они для наших
целей неважны.
552
Приложения
Как видим, для тензоров типа float32 методы
data()
и
dataSync()
возвращают
значения в виде типа
Float32Array
JavaScript. Наверное, это удивит вас, особенно
если вы ждали обычное число, но представляется логичным, если учесть, что для
тензоров других типов может понадобиться вернуть контейнер, содержащий не
сколько чисел. Для типа int32 и тензоров булева типа
data()
и
dataSync()
возвра
щают
Int32Array
и
Uint8Array
соответственно.
Обратите внимание, что, хотя скаляр содержит всегда ровно один элемент, об
ратное неверно. Тензор ранга больше 0 может также содержать ровно один элемент,
если произведение чисел в его форме равно 1. Например, двумерный тензор формы
[1,
1]
содержит один элемент, но обладает двумя осями координат.
Б.1.2. tensor1d (тензоры ранга 1)
Одномерные тензоры иногда называют тензорами ранга 1 или векторами. Одно
мерный тензор включает ровно одну ось координат, а его форма — массив длиной 1.
Следующий код создает вектор в консоли:
> const myVector = tf.tensor1d([-1.2, 0, 19, 78]);
> myVector.shape;
[4]
> myVector.rank;
1
> await myVector.data();
Float32Array(4) [-1.2, 0, 19, 78]
Этот одномерный тензор содержит четыре элемента, а потому его можно на
звать четырехмерным вектором. Не путайте четырехмерный
Do'stlaringiz bilan baham: |