Рубрики
Без рубрики

Полезные функции манипуляции тензора в Pytorch [Учебное пособие]

Pytorch – популярный, открытый источник, оптимизированная тензорная библиотека широко используется в глубоком обучении и AI … Теги с Python, Deplearning, Nowerners, учебником.

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”