Pytorch является популярным, открытым исходным кодом, оптимизированная тензорная библиотека широко используется в глубоком обучении и исследованиях AI, разработанная исследователями на Facebook Ai. Пакет факела содержит структуры данных для многомерных тензоров и математических операций над ними.
В этом сообщении в блоге мы стремимся охватывать некоторые полезные функции, которые Факел
Пакет обеспечивает манипулирование тензорами. В частности, мы возьмем помощь примеров, чтобы понять, как работают различные функции, включая случаи, когда функции не выполняются, как ожидалось, и бросают ошибки. Мы рассмотрим следующие функции тензорной манипулирования.
Torch.cat
– объединяет данную последовательность тензоров в данном измеренииTorch.unbind
– Удаляет тензорное измерениеTorich.movedim
– перемещает размерность (ы) ввода в положении (ы) в источнике в положение (ов) в пункте назначенияTorich.squeze
– Возвращает тензор со всеми размерами ввода размера 1 удален.Torch.unsqueeze
– Возвращает новый тензор с измерением размера, который вставлен в указанное положение.
Прежде чем начать, давайте импортируем факел
.
import torch
TORCH.CAT
Torch.cat (тензоры, *,)
Объединяет данную последовательность тензоров в данном измерении.
Все тензоры должны иметь одну и ту же форму (за исключением случаев соединения) или быть пустым.
Аргумент тензоры
обозначает последовательность тензоров, которая должна быть объединена.
тусклый
является необязательным аргументом, который указывает размерность, вдоль которой мы хотим тензоры
быть объединенным. ( по умолчанию
)
вне
является дополнительным аргументом ключевых слов.
# Example 1 ip_tensor_1=torch.tensor([[1,2,3],[4,5,6]]) ip_tensor_2=torch.tensor([[7,8,9],[10,11,12]]) torch.cat((ip_tensor_1,ip_tensor_2),dim=0) # Output tensor([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])
Как мы указали dim = 0
, входные тензоры были объединены вдоль измерения 0. Входные тензоры у каждого имели форму (2,3), и, поскольку тензоры были объединены вдоль размерности 0, выходной тензор имеет форму (4,3)
# Example 2 ip_tensor_1=torch.tensor([[1,2,3],[4,5,6]]) ip_tensor_2=torch.tensor([[7,8,9,10],[11,12,13,14]]) torch.cat((ip_tensor_1,ip_tensor_2),dim=1) # Output tensor([[ 1, 2, 3, 7, 8, 9, 10], [ 4, 5, 6, 11, 12, 13, 14]])
Ну, на этот раз мы решили объединить вдоль первого измерения ( dim = 1
). ip_tensor_1
был в форме (2,3) и ip_tensor_2.
был в форме (2,4). Как мы решили объединить вдоль первого измерения, выходной тензора возвращается в форме (2,7). Теперь давайте посмотрим, что произойдет, когда мы пытаемся объединить два выше входных тензорах вдоль dim = 0.
.
# Example 3 ip_tensor_1=torch.tensor([[1,2,3],[4,5,6]]) ip_tensor_2=torch.tensor([[7,8,9,10],[11,12,13,14]]) torch.cat((ip_tensor_1,ip_tensor_2),dim=0) # Output --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last)in () 3 ip_tensor_2=torch.tensor([[7,8,9,10],[11,12,13,14]]) 4 ----> 5 torch.cat((ip_tensor_1,ip_tensor_2),dim=0) RuntimeError: Sizes of tensors must match except in dimension 0. Got 3 and 4 in dimension 1 (The offending index is 1)
Мы видим, что ошибка брошена, когда мы пытаемся объединить вдоль dim = 0.
. Это именно потому, что размер тензоров должен согласиться во всех габаритах, кроме того, что мы объединяем вместе. Здесь ip_tensor_1.
имеет размер 3 вдоль того, что ip_tensor_2
имеет размер 4 вдоль dim = 1
Вот почему мы столкнулись с ошибкой.
Поэтому мы можем использовать Torch.cat
Функция, когда мы хотим ConcateNate тензоры вдоль действительного измерения При условии, что тензоры имеют тот же размер во всех других размерах Отказ
Torch.unbind.unbind
Torch.unbind (вход,)
Эта функция удаляет размер тензора, указанного в аргументе тусклый
.(дефолт)
Возвращает кортеж кусочков тензора вдоль указанного тусклый
Отказ
# Example 1 ip_tensor=torch.tensor([[1,2,3],[4,5,6]]) torch.unbind(ip_tensor,dim=0) # Output (tensor([1, 2, 3]), tensor([4, 5, 6]))
IP_Tensor имеет форму (2,3). Как мы указали dim = 0.
Мы видим, что нанесение уединения вдоль dim = 0
Возвращает кортеж кусочков IP_Tensor
вдоль нулевого измерения.
# Example 2 ip_tensor=torch.tensor([[1,2,3],[4,5,6]]) torch.unbind(ip_tensor,dim=1) # Output (tensor([1, 4]), tensor([2, 5]), tensor([3, 6]))
В приведенном выше примере мы видим, что когда мы решили уничтожить вдоль dim = 1.
Мы получаем кортеж, содержащий три ломтика входного тензора вдоль первого измерения.
# Example 3 ip_tensor=torch.randn(10,10) torch.unbind(ip_tensor,dim=2) # Output -------------------------------------------------------------------------------- IndexError Traceback (most recent call last)in () 2 ip_tensor=torch.randn(10,10) 3 print(ip_tensor) ---------> 4 torch.unbind(ip_tensor,dim=2) IndexError: Dimension out of range (expected to be in range of [-2, 1], but got 2)
Как и ожидалось, мы видим, что входной тензор имеет форму (10,10) и когда мы выберем умирают вдоль измерения, который недействителен, мы вступаем в ошибку.
Необходимо четкое понимание размеров и размеров вдоль определенного измерения; Несмотря на то, что наш входной тензор имеет 100 элементов и имеет размер 10 в каждом из измерений 0 и 1, у него нет третьего размера индекса 2; Следовательно, важно проходить в действительное измерение для операций тензора манипулирования.
Функция UBIND может быть полезна, когда мы хотели бы Изучите ломтики тензора вдоль Указанное входное измерение Отказ
Torich.movedim.
Torch.Movedim (вход, источник, пункт назначения)
Эта функция перемещает размеры ввода на положениях в Источник
на позиции, указанные в назначение
Отказ
Источник
и назначение
может быть либо int
(одномерное измерение) или кортеж
измерений для перемещения.
Другие размеры ввода, которые явно не перемещаются, остаются в их первоначальном порядке и появляются на позициях, не указанных в пункте назначения.
# Example 1 ip_tensor= torch.randn(4,3,2) print(f"Input Tensor shape:{ip_tensor.shape}\n") op_tensor=torch.movedim(ip_tensor,1,2) print(f"Output Tensor shape:{op_tensor.shape}\n") # Output Input Tensor shape:torch.Size([4, 3, 2]) Output Tensor shape:torch.Size([4, 2, 3])
В этом примере мы хотели переместить измерение 1 в входном тензорном тензоре для размера 2 в выходном тензоре, и мы сделали только что с помощью функции Movedim.
IP_Tensor
имеет форму (4,3,2), тогда как Op_tensor
имеет форму (4,2,3), то есть Dim1
В входном тензоре переехал в Dim2
в выходном тензоре.
# Example 2 ip_tensor= torch.randn(4,3,2) print(f"Input Tensor shape:{ip_tensor.shape}\n") op_tensor=torch.movedim(ip_tensor,(1,0),(2,1)) print(f"Output Tensor shape:{op_tensor.shape}\n") # Output Input Tensor shape:torch.Size([4, 3, 2]) Output Tensor shape:torch.Size([2, 4, 3])
В этом примере мы хотим переместить размеры 1 и 0 в входном тензор до размеров 2 и 1 в выходном тензоре. И мы видим, что это изменение было отражено путем проверки формы соответствующих тензоров.
# Example 3 ip_tensor= torch.randn(4,3,2) print(f"Input Tensor shape:{ip_tensor.shape}\n") op_tensor=torch.movedim(ip_tensor,(1,0),(1,1)) print(f"Output Tensor shape:{op_tensor.shape}\n") # Output Input Tensor shape:torch.Size([4, 3, 2]) -------------------------------------------------------------------------------- RuntimeError Traceback (most recent call last)in () 2 ip_tensor= torch.randn(4,3,2) 3 print(f"Input Tensor shape:{ip_tensor.shape}\n") ---------> 4 op_tensor=torch.movedim(ip_tensor,(1,0),(1,1)) 5 print(f"Output Tensor shape:{op_tensor.shape}\n") RuntimeError: movedim: repeated dim in `destination` ([1, 1])
В этом примере мы получаем ошибку, как мы повторили размерность 1 в пункте назначения кортежа. Записи в Источник и назначение кортежи Все должны быть уникальными Отказ
Таким образом, функция Movedim
помогает войти от тензора указанной формы к другому при сохранении те же базовые элементы Отказ
Torich.squeze.
Torich.squeeze (вход ,, *,)
Эта операция возвращает тензор со всеми размерами вход
размером 1 удален.
Когда тусклый
Указана, то сжатие операции выполняется только вдоль этого измерения.
# Example 1 ip_tensor=torch.randn(2,1,3) print(ip_tensor) print(f"Input Tensor shape:{ip_tensor.shape}\n") op_tensor=torch.squeeze(ip_tensor) print(op_tensor) print(f"Output Tensor shape:{op_tensor.shape}\n") # Output tensor([[[ 0.2819, 0.3406, -1.8031]], [[-0.9314, 1.0048, -0.3198]]]) Input Tensor shape:torch.Size([2, 1, 3]) tensor([[ 0.2819, 0.3406, -1.8031], [-0.9314, 1.0048, -0.3198]]) Output Tensor shape:torch.Size([2, 3])
У нас было IP_Tensor
формы (2,1,3). В Op_tensor
После сжатия операции у нас есть форма (2,3). В входном тензоре IP_Tensor
Второе измерение размера 1 было снижено.
# Example 2 a ip_tensor=torch.randn(2,1,3,1) print(ip_tensor) print(f"Input Tensor shape:{ip_tensor.shape}\n") op_tensor=torch.squeeze(ip_tensor,dim=0) print(op_tensor) print(f"Output Tensor shape:{op_tensor.shape}\n") # Output tensor([[[[ 0.4133], [-0.6541], [-0.5506]]], [[[-1.1734], [-0.3823], [-0.8710]]]]) Input Tensor shape:torch.Size([2, 1, 3, 1]) tensor([[[[ 0.4133], [-0.6541], [-0.5506]]], [[[-1.1734], [-0.3823], [-0.8710]]]]) Output Tensor shape:torch.Size([2, 1, 3, 1])
В приведенном выше примере мы устанавливаем аргумент измерения dim = 0.
. Входной тензор IP_Tensor
есть Размер = 2
вдоль dim = 0.
. Как у нас не было Размер = 1
вдоль dim = 0.
, нет никакого эффекта сжатия операции на тензор, а выходной тензор идентичен входному тензоре.
# Example 2 b ip_tensor=torch.randn(2,1,3,1) print(ip_tensor) print(f"Input Tensor shape:{ip_tensor.shape}\n") op_tensor=torch.squeeze(ip_tensor,dim=1) print(op_tensor) print(f"Output Tensor shape:{op_tensor.shape}\n") # Output tensor([[[[-1.7004], [-0.1863], [ 1.1550]]], [[[-1.1890], [-0.4821], [-0.3731]]]]) Input Tensor shape:torch.Size([2, 1, 3, 1]) tensor([[[-1.7004], [-0.1863], [ 1.1550]], [[-1.1890], [-0.4821], [-0.3731]]]) Output Tensor shape:torch.Size([2, 3, 1])
В приведенном выше примере мы устанавливаем аргумент измерения dim = 1
Отказ
Как тензор имел Размер = 1
Вдоль первого измерения, в выходном тензоре, что измерение удаляли, а выходной тензор имеет форму (2,3,1).
# Example 3 ip_tensor=torch.randn(2,3) print(ip_tensor) print(f"Input Tensor shape:{ip_tensor.size()}\n") op_tensor=torch.squeeze(ip_tensor,dim=2) # Output tensor([[-0.0688, -0.7170, -1.5563], [-0.2138, -0.5387, -1.0245]]) Input Tensor shape:torch.Size([2, 3]) -------------------------------------------------------------------------------- IndexError Traceback (most recent call last)in () 3 print(ip_tensor) 4 print(f"Input Tensor shape:{ip_tensor.size()}\n") ---------> 5 op_tensor=torch.squeeze(ip_tensor,dim=2) IndexError: Dimension out of range (expected to be in range of [-2, 1], but got 2)
В приведенном выше примере мы видим, что IP_Tensor
имеет форму (2,3) и представляет собой 2-D тензором с 1 определенным. Как мы пытались выжать dim = 2.
который не существует в оригинальном тензоре, мы получаем IndexError
Отказ
По сути, сжать
Функция помогает удалить Все размеры размера 1 или вдоль определенного измерения .
Torch.unsqueeze.
torch.unsqueeze (вход, тусклый)
Здесь тусклый
Обозначает индекс, на котором мы хотим вставить размерность размера 1.
Эта функция возвращает новый тензор с размерностью размера, который вставляется в указанном положении. Возвращенные тензорные делится те же основные данные с этим тензором.
# Example 1 ip_tensor = torch.tensor([1, 2, 3, 4]) torch.unsqueeze(ip_tensor, 0) # Output tensor([[1, 2, 3, 4]])
В этом простом примере показано выше, Usceeze вставляет размерное измерение в указанном индексе 0.
# Example 2 ip_tensor=torch.rand(2,3) torch.unsqueeze(ip_tensor,2) # Output tensor([[[0.3670], [0.1786], [0.7115]], [[0.4241], [0.0422], [0.2277]]])
В этом простом примере показано выше, Unsheeze
Вставляет размер синглтон в указанном индексе 2 (вход имеет размер 2 (0,1), и мы вставили новое измерение размера 1 вместе).
# Example 3 ip_tensor=torch.rand(2,3) torch.unsqueeze(ip_tensor,3) # Output ------------------------------------------------------------------------------- IndexError Traceback (most recent call last)in () 1 # Example 3 2 ip_tensor=torch.rand(2,3) ---------> 3 torch.unsqueeze(ip_tensor,3) IndexError: Dimension out of range (expected to be in range of [-3, 2], but got 3)
Мы получаем ошибку индекса, как и ожидалось; Это потому, что аргумент тусклый
может принимать только значения до input_dim + 1
Отказ В этом случае тусклый
может принимать максимальное значение 2.
Таким образом Unsheeze
Функция позволяет нам вставить Размер размера 1 по нужным индексе.
В этом посте мы попытались охватить некоторые полезные функции, которые можно использовать для манипулирования тензорами. Надеюсь, вы нашли это полезным. Счастливое обучение!
использованная литература
[1] Официальная документация по тензорным операциям: https://pytorch.org/docs/stable/torch.html . ) [2] Полезный блог на основах тензоров: https://www.kdnuggets.com/2018/05/pytorch-tensor-basics.html
Обложка Изображение: Фото Энни Спратт на Бессмысленно
Оригинал: “https://dev.to/balapriya/useful-tensor-manipulation-functions-in-pytorch-4g4c”