Что значит изменить форму тензора?

Вернуться к предыдущему сообщению

Вернуться к первому сообщению

1.2 Что такое изменение формы тензора?

Скачать Jupyter Notebook можно здесь.

Примечание — рекомендуется ознакомиться с предыдущим постом.

Изменение формы тензора — это просто изменение формы тензора или разделение тензора различными способами.

Начнем с создания двумерного тензора формы (6, 4). Для ясности элементы расположены от 1 до 24 в порядке возрастания. Поверьте мне, этот порядок сыграет важную роль в понимании преобразования тензора.

import numpy as np
np.random.seed(42)
x = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]])
print(x)
len(x.shape)

Видите ли вы порядок возрастания скалярных элементов в массиве? Начиная сверху, слева направо это 1, 2, 3, 4, а затем спускаясь вниз это 5, 6, 7, 8 и так далее 9, 10, 11, 12….

x.shape
x.size

Общее количество скалярных элементов в тензоре всегда равно произведению чисел в кортеже формы. Здесь 6 * 4 = 24.

x.size также дает общее количество скалярных элементов

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

Допустим, в начале у нас есть вектор, содержащий скалярные элементы от 1 до 24 в порядке возрастания.

Затем мы разбиваем его на 6 групп, и, по-видимому, в каждой сформированной группе будет по 4 скаляра.

Вот как был создан этот двумерный тензор. Мы разбили 24 на 6 и 4.

Примечание. Это объяснение может противоречить тому, что мы видели в первом посте, но оно поможет нам понять операцию изменения формы.

Можем ли мы разбить его на 4 и 6, или 8 и 3, или 3 и 8?

Мы можем изменить форму тензора на (8, 3), используя эту строку кода.

print(x.reshape((8, 3)))

Вы можете заметить, что порядок возрастания остается прежним.

Примечание. Форма массива по-прежнему (6, 4), потому что мы не присвоили измененный тензор переменной.

Подобно этому,

print(x.reshape((12, 2)))
print(x.reshape((2, 12)))
print(x.reshape((2, 3, 4)))
print(x.reshape((3, 4, 2)))
print(x.reshape((4, 3, 2)))

Порядок возрастания остается неизменным.

Еще один сложный пример

print(x.reshape((4, 3, 2)))

Разобьем его на 4 группы, чтобы в каждой группе было по 6 скаляров.

Разбиваем группу из 6 на 3 группы

И в каждой новой сформированной группе есть 2 скаляра.

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

print(x.reshape((2, 13)))
print(x.reshape((2, 11)))

Надеюсь, теперь вы понимаете, почему мы получили эти ValueError. Здесь у нас нет 26 или 22 скаляров, у нас есть 24 скаляра.

24 != 2 * 13 = 26
24 != 2*11 = 22

В дальнейшем мы можем разбить 24 на (2, 2, 1, 1, 1, 2, 3) или (3, 4, 1, 1, 1, 1, 1, 2)

print(x.reshape((2, 2, 1, 1, 1, 2, 3)))
print(x.reshape((3, 4, 1, 1, 1, 1, 1, 2)))

Порядок возрастания остается неизменным.

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

И то, как NumPy показывает нам эти тензоры, выглядит следующим образом:
скаляры по горизонтали
другие элементы более высокого измерения по вертикали

Теперь давайте подойдем к самой важной части этого поста.

В чем смысл преобразования тензора в (-1, 1), или (-1,), или (1, -1)?

(-1, 1)

Когда мы преобразуем тензор в (-1, 1)
-1 эквивалентно общему количеству скаляров, деленному на положительное число в кортеже формы.

В данном случае это 24, потому что 24/1 = 24
Это похоже на преобразование в (24, 1)

Это полезно, когда нам нужно преобразовать тензор в двумерный тензор, в котором одномерный тензор должен иметь ровно 1 скалярный элемент или как вектор-столбец.

print(x.reshape((-1, 1)))
print(x.reshape(24, 1))

Преобразование в (-1, 1) эквивалентно преобразованию в (24, 1)

(-1, )

Когда мы преобразуем его в (-1) или сгладим,
-1 эквивалентно общему количеству скаляров в тензоре.

Здесь -1 эквивалентно 24. Это похоже на преобразование тензора в вектор.

print(x.reshape((-1)))
print(x.reshape((24,)))
print(x.flatten())

Преобразование в (-1,) эквивалентно преобразованию в (24,) или сглаживанию.

(1, -1)

Когда мы преобразуем его в (1, -1)
-1 эквивалентно общему количеству скаляров, деленному на положительное число в кортеже формы.

В данном случае это 24, потому что 24 / 1 = 24
Это похоже на преобразование в (1, 24)

print(x.reshape((1, -1)))
print(x.reshape(1, 24))

Можете ли вы сказать мне, что произойдет, если мы изменим его на (2, -1, 3)?

Это эквивалентно (2, 4, 3), потому что 24 / (2 * 3) = 4

print(x.reshape((2, -1, 3)))
x.reshape((2, -1, 3)).shape

Надеюсь, теперь вы понимаете, что такое тензорное изменение формы и что значит преобразовать его в (-1, 1), или (-1,), или (1, -1)?

Мы будем использовать (-1, 1) на протяжении всего курса. Это поможет нам понять, как мы будем строить нейронные сети.

Смотрите видео на youtube и подписывайтесь на канал, чтобы получать такие видео и посты.
Каждый слайд длится 3 секунды и без звука. Вы можете поставить видео на паузу, когда захотите.
Вы также можете включить музыку, если хотите.

В видео в принципе все что есть в посте только в слайдах.

Большое спасибо за вашу поддержку и отзывы.

Если вам понравился этот курс, вы можете поддержать меня на

Это много значило бы для меня.

Перейти к следующему сообщению — 1.3 Некоторые полезные операции NumPy.