Привет!

Этот блог является частью серии Факел по четвергам. План состоит в том, чтобы поделиться некоторыми лакомыми кусочками об использовании PyTorch через это. Сегодняшний блог, в частности, предназначен для того, чтобы поделиться некоторыми краткими заметками, основанными на видеоруководстве PyTorch по тензорам. Этот блог предполагает знакомство с PyTorch framework и numpy.

Тензор

PyTorch предоставляет torch.Tensor для представления многомерного массива, содержащего элементы одного типа данных.

В основном это то же самое, что и массив numpy: он ничего не знает о глубоком обучении, вычислительных графах или градиентах и ​​представляет собой просто общий n-мерный массив, который можно использовать для произвольных числовых вычислений. Самая большая разница между массивом numpy и тензором PyTorch заключается в том, что тензор PyTorch может работать как на ЦП, так и на графическом процессоре. Чтобы выполнять операции на графическом процессоре, просто приведите тензор к типу данных cuda.

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

torch.tensor атрибуты



Существует три атрибута: torch.dtype, torch.device и torch.layout.

Тип тензора — torch.dtype

  • Тензор Torch по умолчанию создается с типом данных FP32, используйте аргумент dtype для установки других типов по мере необходимости (например, int8 и т. д.).

Создание копий тензоров

  • когда вы копируете тензор, используя присваивание «=», он создает другую ссылку, указывающую на то же самое место под капотом (например, если a является torch.tensor, и мы выполняем присваивание, подобное b = a, любое обновление a также будет отражаться на b , По сути, они ссылаются на одно и то же распределение памяти).
  • вместо этого используйте b = a.clone(), это гарантирует, что вы сделали отдельную копию. Однако обратите внимание, что параметр torch.requires_grad копируется как есть из исходного тензора.
  • Если мы не хотим копировать параметр require_grad, мы должны использовать detach() on исходный тензор во время копирования, например: c = a.detach().clone()

Использование тензорного графического процессора — с помощью torch.device

  • проверьте, доступно ли более быстрое оборудование (GPU): torch.cuda.is_available()
  • создайте тензор на устройстве GPU, используя аргумент устройства: a = torch.rand(2,2, device=”cuda”)
  • перемещение данных на интересующее устройство:
a = torch.rand(2,2, device='cpu')
# transfer tensor created on cpu to gpu accessible memory.
if torch.cuda.is_available():
      device = torch.device('cuda') # create a device handle
       a = a.to(device) # pass device handle created.
# using string
torch.device('cuda')
torch.device('cpu')
torch.device('cuda:0')
# using string and device ordinal
torch.device('cuda', 0)
torch.device('cpu', 0)

Изменение размерности тензоров

  • пример, когда вы хотите изменить размеры: вы хотите работать с «партией» входных данных, переданных в модель, а не с одним экземпляром ввода.
  • используйте squeeze() и unsqueeze() (работает только с измерением экстента 1)
  • их также можно сделать на месте, используя сжатие_() и разжатие_().

(знаете ли вы? Методы PyTorch, имена которых заканчиваются символом подчеркивания, означают, что они выполняют операции на месте).

# ex : image classification model
# image : 3,326,326 tensor
#  n * 326 * 326
a = torch.rand(3, 326, 326)
b = a.unsqueeze(0) # adds one extra dimension of extent 1.
# essentially extending dimension using unsqueeze retains the same number of elements as the original tensor. <becomes 1 x 3 x326 x 326>
c = b.squeeze(0) # back to (3,326,326)
#  ex : create data for batch of 1 during inference.
  • изменить форму
  • conv → linear (уровень FC) в классификаторе изображений
  • features * h * d → 1-D вектор слоя FC — используйте метод reshape().
a3d = torch.rand(6, 20, 20)
a1d = a3d.reshape(6*20*20)
// note : reshape puts a view on orig tensor (uses same underlying memory of original tensor, no copy is made)

пустой мост

  • переключение между numpy ndarrays и PyTorch tensor :
import numpy as np
# convert from numpy to PyTorch
np_array = np.ones((2,3))
pytorch_tensor = torch.from_numpy(np_array)
# convert from PyTorch to numpy
pt_tensor = torch.rand(2,3)
numpy_array = pt_tensor.numpy()
# they share same underlying memory. So, changes to one shall be reflected on the other. 
# for ex : pt_tensor update results in an update to numpy_array.

Как всегда, если вы нашли этот блог полезным, не забудьте поставить несколько аплодисментов (знаете ли вы? — вы можете добавить более одного аплодисмента :)) — так он сможет привлечь больше людей. Спасибо! Кроме того, не забудьте подписаться на @howsofcoding и прийти~

Рекомендации