初识Pytorch
在Pytorch当中,torch.tensor是储存和变化的主要工具。其中Tensor提供GPU计算和自动求梯度等功能,这让Tensor更加适合深度学习
首先导入Pytorch:
import torch
torch有一个操作是rand,它可以来生成一个指定大小的随机矩阵
y = torch.rand(5,3)
y
tensor([[0.0714, 0.8323, 0.1296],
[0.8457, 0.9962, 0.9307],
[0.3740, 0.7760, 0.5245],
[0.3022, 0.2628, 0.1213],
[0.5137, 0.3057, 0.7018]])
另外还可以形成零矩阵,同时可以自己指定数据的类型
x = torch.zeros(5,3,dtype=torch.long)
x
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
还可以直接根据数据进行创建
x = torch.tensor([5.5,3])
x
tensor([5.5000, 3.0000])
可以通过shape和size返回一个tuple,代表这个数据的大小:
x.size()
torch.Size([2])
x.shape
torch.Size([2])
由于是tuple类型,所以支持所有的tuple操作
索引
索引出来的结果与元数据共享内存,如果修改了一个,另外一个也会跟着修改
x = torch.rand(5,3,dtype=torch.float)
x
tensor([[0.7576, 0.3497, 0.5464],
[0.3435, 0.6653, 0.3712],
[0.7674, 0.4093, 0.9313],
[0.0418, 0.0199, 0.4834],
[0.9696, 0.6401, 0.4849]])
y = x[0,:]
y
tensor([0.7576, 0.3497, 0.5464])
y += 1
print(y)
print(x[0,:])
tensor([1.7576, 1.3497, 1.5464])
tensor([1.7576, 1.3497, 1.5464])
可以发现修改y,x也同时被修改了
改变形状
view()提供了这个功能,它能够改变Tensor的形状,但要注意,view仅仅是改变了对这个张量的观察角度,内部数据并没有发生改变
y = x.view(15)
z = x.view(-1, 5) # -1所指的维度可以根据其他维度的值推出来
print(x.size(), y.size(), z.size())
torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])
如果我们只是想返回一个副本,不想改变原数据集该怎么办》Pytorch提供了clone,它就是创建一个副本
x_cp = x.clone()
x += 5
print(x)
print(x_cp)
tensor([[6.7576, 6.3497, 6.5464],
[5.3435, 5.6653, 5.3712],
[5.7674, 5.4093, 5.9313],
[5.0418, 5.0199, 5.4834],
[5.9696, 5.6401, 5.4849]])
tensor([[1.7576, 1.3497, 1.5464],
[0.3435, 0.6653, 0.3712],
[0.7674, 0.4093, 0.9313],
[0.0418, 0.0199, 0.4834],
[0.9696, 0.6401, 0.4849]])
使用clone还有一个好处是会被记录在计算图中,即梯度回传到副本时也会传到源Tensor
还有一个函数item(),它可以将一个Tensor标量转换成一个number
x = torch.randn(1)
print(x)
print(x.item())
tensor([-0.1111])
-0.11108279973268509
线性代数
Pytorch中的Tensor支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数等