pytorch张量运算基础
(1)随机创建秩为2的张量:
>>> torch.rand(2,2)
tensor([[0.1380, 0.6323],
[0.1372, 0.3706]])
(2)由列表创建张量,改变张量中的一个值
>>> x = torch.tensor([[0,0,1],[1,1,1],[0,0,0]])
>>> x
tensor([[0, 0, 1],
[1, 1, 1],
[0, 0, 0]])
>>> x[0][0]=5
>>> x
tensor([[5, 0, 1],
[1, 1, 1],
[0, 0, 0]])
(3)使用ones()和zeros()函数创建张量
>>> torch.zeros(2,2)
tensor([[0., 0.],
[0., 0.]])
(4)张量的加法运算
>>> torch.ones(1,2) + torch.ones(1,2)
tensor([[2., 2.]])
(5)使用to()函数将张量复制进CPU或GPU
>>> cpu_tensor = torch.rand(2)
>>> cpu_tensor
tensor([0.5383, 0.4437])
>>> cpu_tensor.device
device(type='cpu')
>>> gpu_tensor = cpu_tensor.to('cuda')
>>> gpu_tensor.device
device(type='cuda', index=0)
(6)求张量中的最大元素
>>> torch.rand(2,2).max()
tensor(0.8762)
>>> torch.rand(2,2).max().item()
0.9710603952407837
(7)在原函数后面加下划线,可用于节省内存
>>> random_tensor = torch.rand(2,2)
>>> random_tensor.log2()
tensor([[-0.1777, -8.2509],
[-0.3882, -2.2375]])
>>> random_tensor.log2_()
tensor([[-0.1777, -8.2509],
[-0.3882, -2.2375]])
(8)张量的变形view()和reshape()函数
如MNIST数据集为28×28的灰度图像集合,但其被变换为长度为784的数组,后续转换为1×28×28的张量(1为通道数)
关于view()和reshape()函数的区别:
view()会处理为原张量的一个视图,如果底层数据发生改变,视图也会发生改变,如果视图不连续,则会报错,reshape()会在后台完成这些操作
因此推荐使用reshape()函数!!!!!!
>>> flat_tensor = torch.rand(784)
>>> viewed_tensor = flat_tensor.view(1,28,28)
>>> viewed_tensor.shape
torch.Size([1, 28, 28])
>>> reshaped_tensor = flat_tensor.reshape(1,28,28)
>>> reshaped_tensor.shape
torch.Size([1, 28, 28])
(9)交换张量维度
图像一般存储为[height, width, channel] 的张量,但是pytorch通常按照[channel, height, width]处理,因此可以使用permute()函数交换维度,permute()函数中为维度的索引值
>>> hwc_tensor = torch.rand(640,480,3)
>>> chw_tensor = hwc_tensor.permute(2,0,1)
>>> chw_tensor.shape
torch.Size([3, 640, 480])
(10)张量广播
张量广播的条件:
两个张量维度大小相等(我理解的是列数相等)
并且其中一个维度大小为1(其中一个的行数为1)
比如将一个[2, 2]的张量增加成[3, 3]的张量则会报错
但是将一个[1, 3]的张量增加为[3,3]的张量则可行