Рис. Б.3.
Трехмерный тензор данных
для временных рядов
Рис. Б.4.
Четырехмерный тензор
данных для изображений
558
Приложения
В некоторых фреймворках измерение цветовых каналов предшествует высо
те и ширине по соглашению NCHW. Мы не станем использовать это соглашение
в нашей книге, но не удивляйтесь, если встретите гдето тензор с формой наподобие
[128,
3,
256,
256]
.
Видеоданные
Неформатированные видеоданные — одна из немногих разновидностей встреча
ющихся на практике данных, для которых вам понадобятся тензоры ранга 5. Ви
деоданные можно рассматривать как последовательность кадров, каждый из кото
рых представляет собой цветное изображение. А поскольку подобный кадр можно
хранить в тензоре ранга 3
[высота,
ширина,
цветовойКанал]
, то последовательность
кадров можно хранить в четырехмерном тензоре формы
[кадры,
высота,
ширина,
цветовойКанал]
, а значит, батч различных изображений можно хранить в пятимерном
тензоре формы
[примерыДанных,
кадры,
высота,
ширина,
цветовойКанал]
.
Например, 60секундный видеоролик из YouTube в разрешении 144
×
256, с дис
кретизацией четыре кадра в секунду содержит 240 кадров. Батч из четырех таких
видеороликов можно хранить в тензоре формы
[4,
240,
144,
256,
3]
. Суммарно
106 168 320 значений! При dtype этого тензора
'float32'
каждое значение зани
мает 32 бита, так что тензор будет содержать 405 Мбайт данных. Изрядный объем!
Встречающиеся на практике видеофайлы обычно занимают намного меньше места,
поскольку не хранятся в float32 и обычно достаточно сильно сжаты (например,
хранятся в формате MPEG).
Б.1.7. Создание тензоров из тензорных буферов
Мы показали, как создавать тензоры из JavaScriptмассивов, с помощью таких функ
ций, как
tf.tensor2d()
и
tf.tensor()
. Для этого необходимо определить значения
всех элементов и указать их заранее в JavaScriptмассиве. В некоторых случаях,
впрочем, создавать подобные JavaScriptмассивы с нуля достаточно утомительно.
Например, пусть нам нужно создать матрицу 5
×
5, в которой все внедиагональные
элементы — нули, а диагональные элементы формируют нарастающий ряд данных,
каждый элемент которого равен индексу строки (столбца) плюс 1:
[[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[0, 0, 0, 0, 5]]
Код создания вложенного JavaScriptмассива, соответствующего этим требова
ниям, выглядит примерно следующим образом:
const n = 5;
const matrixArray = [];
for (let i = 0; i < 5; ++i) {
Приложение Б. Краткое руководство по тензорам и операциям над ними
559
const row = [];
for (let j = 0; j < 5; ++j) {
row.push(j === i ? i + 1 : 0);
}
matrixArray.push(row);
}
После этого наконец можно преобразовать вложенный JavaScriptмассив
mat-
rixArray
в двумерный тензор:
> const matrix = tf.tensor2d(matrixArray);
Весьма длинный код, включающий два вложенных цикла
for
. Можно ли както
его упростить? Да, безусловно: можно воспользоваться методом
tf.tensorBuffer()
для создания объекта
TensorBuffer
. Элементы объекта
TensorBuffer
можно задавать
по индексам и менять их значения с помощью метода
set()
, в отличие от тензорных
объектов в TensorFlow.js, значения элементов которых —
неизменяемые
(immutable).
По завершении задания значений всех нужных элементов
TensorBuffer
можно легко
преобразовать
TensorBuffer
в настоящий тензорный объект с помощью его метода
toTensor()
. Следовательно, новый код, использующий метод
tf.tensorBuffer()
для
создания такого же тензора, как и в предыдущем коде, будет иметь вид:
Таким образом, благодаря методу
tf.tensorBuffer()
число строк снизилось
с десяти до пяти.
Б.1.8. Создание тензоров, содержащих одних нули
и одни единицы
Очень часто бывает нужно создать тензор заданной формы, все элементы которого
равны 0. Для этого предназначена функция
tf.zeros()
. При ее вызове необходимо
указать желаемую форму тензора в качестве аргумента:
> const x = tf.zeros([2, 3, 3]);
> x.print();
Tensor
[[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]]
560
Приложения
Тензор был создан с dtype по умолчанию (float32). Для создания содержащих
одни нули тензоров с другими dtype необходимо указать dtype в качестве второго
аргумента функции
tf.zeros()
.
Кроме того, существует функция
tf.zerosLike()
, с помощью которой можно
создать содержащий одни нули тензор с такой же формой и dtype, как и уже суще
ствующий. Например, вызов:
> const y = tf.zerosLike(x);
эквивалентен:
> const y = tf.zeros(x.shape, x.dtype);
но более лаконичен.
Аналогичные методы существуют для создания тензоров, в которых все элемен
ты равны 1:
tf.ones()
и
tf.onesLike()
.
Б.1.9. Создание тензоров со случайными значениями
Во многих случаях может пригодиться возможность создавать тензоры со случай
ными значениями, например, для инициализации весовых коэффициентов. Чаще
всего для этой цели применяются функции
tf.randomNormal()
и
tf.randomUniform()
.
Синтаксис у этих двух функций схожий, различаются только вероятностные распре
деления значений элементов. Как ясно из названия,
tf.randomNormal()
возвращает
тензоры, в которых элементы подчиняются нормальному (гауссовому) распределе
нию
1
. При вызове этой функции только с одним аргументом — формой, получится
тензор, элементы которого подчиняются
Do'stlaringiz bilan baham: |