Статья Автор: Деникина Н.В., Деникин А.В.

Тензоры и их формы

Зачем данные раскладывают по полочкам

Сеть складывает и умножает числа. Больше она не делает ничего: ни читать адрес, ни смотреть на карту она не умеет.

Значит, прежде чем что-то считать, надо превратить заказ в числа и разложить их так, чтобы к ним можно было обращаться по номеру.

С заказами это уже сделано: они так и лежат в базе.

Таблица 2. Четыре заказа из базы

№ заказакилометровсветофоровсвободных курьеров
0426
1182
22220
3604

Читаем по строкам: строка — один заказ, три числа в ней — его признаки. Обратите внимание на второй заказ: он ближе всех, всего километр, но светофоров на маршруте восемь. И на третий: рядом с ним двадцать свободных курьеров. Эти два заказа понадобятся дальше как крайние случаи.

Нумерация строк начинается с нуля — так принято в программировании, и в коде мы будем обращаться именно так.

Тензор

Тензор — многомерный массив чисел одного типа, у которого вдоль каждой оси элементов поровну.

Одна ось — это вектор, две оси — матрица, для большего числа осей отдельных названий нет, поэтому говорят просто «тензор».

В этом курсе почти всегда речь о таблицах вида (число примеров, число признаков) — как таблица 2 выше.

Для интересующихся. В алгебре и физике тензором называют другой объект, со своими свойствами. Совпадение названий историческое, и тензорного исчисления за многомерным массивом не стоит.

Условие «вдоль каждой оси поровну» существенно, а не формально. Если у одного заказа записан код домофона, а у другого нет, такая выгрузка в тензор не превратится, пока не решено, чем заполнить пропуск. Все дальнейшие операции — умножение на матрицу, сложение — требуют прямоугольной таблицы и на рваной не работают.

Для интересующихся. В настоящей работе на приведение данных к прямоугольному виду уходит больше времени, чем на саму модель.

Форма

Про таблицу нужно как-то говорить: сколько в ней заказов, сколько признаков. Для этого есть форма.

Форма — список размеров по всем осям, записанный в скобках через запятую.

Форма — не просто «размер». Это последовательность ответов на вопрос «чего сколько», и отвечать на него надо строго по порядку.

Таблица 2 имеет форму (4, 3). Читаем: четыре — чего? Заказов. Три — чего? Признаков у каждого заказа.

Возьмём пример сложнее: (32, 64, 64, 3). Тридцать два снимка; у каждого шестьдесят четыре строки пикселей; в каждой строке шестьдесят четыре столбца; в каждом пикселе три числа — яркости красного, зелёного и синего.


каждое число отвечает на вопрос «чего сколько»(4,заказов3признакау каждого)четыре заказа,у каждого три числа(32,снимков64,строкпикселей64,столбцов3чиселв пикселе)порядок менять нельзя: (3, 64, 64, 32) — это уже другие данные

Порядок менять нельзя. Форма (3, 64, 64, 32) описывает совсем другие данные, хотя чисел в ней ровно столько же.

Ещё одно, здесь часто путаются. Сравните две формы:

(32, 64, 64, 3)   тридцать два снимка
(64, 64, 3)       один снимок

Что произошло с первой осью? Она исчезла — потому что снимок один и считать нечего. Число примеров дописывают первой осью только тогда, когда данные подают пачкой.

Первая ось считает примеры, последняя описывает один пример.

Сколько чисел в тензоре

Число элементов — произведение всех размеров, а не их сумма.

Для формы (32, 64, 64, 3): 64 · 64 = 4096 пикселей в снимке, умножаем на 3 — получается 12 288 чисел на снимок, и на 32 снимка — 393 216 чисел.

Тридцать две небольшие картинки дают почти четыреста тысяч чисел. Этот порядок величин объяснит многое в главе 7, где речь пойдёт о изображениях.

Срезы

Из таблицы постоянно нужно достать не всё, а часть: один заказ или один признак у всех заказов. Для этого есть срезы.

Срез — способ получить часть тензора, указав, что брать по каждой оси.

Запись x[0] даёт нулевой заказ целиком, все три его числа: 4, 2, 6. Это строка таблицы, её форма — (3,).

Запись x[:, 0] даёт нулевой признак — расстояние — сразу у всех четырёх заказов: 4, 1, 2, 6. Это столбец таблицы, его форма — (4,).

Двоеточие читается как «все». На первом месте стоит номер заказа, на втором — номер признака. Двоеточие на первом месте означает «все заказы».

Путаница между этими двумя записями — самая частая ошибка этой главы, и она коварна тем, что программа не остановится с ошибкой. Она посчитает не то и ничего не сообщит.

Переразложение

reshape — операция, которая меняет форму тензора, не меняя самих чисел: она перекладывает их по другим осям.

Количество элементов обязано сойтись. Двадцать четыре числа лягут в форму (4, 6) или (2, 3, 4), но не в (5, 5): двадцать пять не равно двадцати четырём.

Если вместо одного из размеров поставить −1, он будет вычислен из остальных. Двадцать четыре числа при запросе reshape(-1, 3) дадут форму (8, 3), потому что 24 : 3 = 8.

Две вещи про reshape, на которых спотыкаются почти все.

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

Вторая: формы (3,) и (3, 1) — разные, хотя чисел в них поровну, и складываются они с другими тензорами по-разному. Почему — в следующем разделе.


Массив имеет форму (10, 20, 30). Какая форма будет у среза x[2]?


Реши практическую задачу

Загрузка...
Чтобы оставить комментарий, необходимо авторизоваться
💬
Пока нет комментариев. Будьте первым!
Печать