Привет!
Этот блог является частью серии Факел по четвергам. План состоит в том, чтобы поделиться некоторыми лакомыми кусочками об использовании 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
и PyTorchtensor
:
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 и прийти~