数据操作
在深度学习中,我们通常会频繁地对数据进行操作。在PyTorch中,torch.Tensor是存储和变换数据的主要工具。Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。
"tensor"这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量。
//创建一个5x3的未初始化的`Tensor`:
x = torch.empty(5, 3)
//创建一个5x3的随机初始化的`Tensor`:
x = torch.rand(5, 3)
//创建一个5x3的long型全0的`Tensor`:
x = torch.zeros(5, 3, dtype=torch.long)
//可以通过shape或者size()来获取Tensor的形状:
print(x.size())
print(x.shape)
函数 | 功能 |
---|---|
Tensor(*sizes) | 基础构造函数 |
tensor(data,) | 类似np.array的构造函数 |
ones(*sizes) | 全1Tensor |
zeros(*sizes) | 全0Tensor |
eye(*sizes) | 对角线为1,其他为0 |
arange(s,e,step) | 从s到e,步长为step |
linspace(s,e,steps) | 从s到e,均匀切分成steps份 |
rand/randn(*sizes) | 均匀/标准分布 |
normal(mean,std)/uniform(from,to) | 正态分布/均匀分布 |
randperm(m) | 随机排列 |
这些创建方法都可以在创建的时候指定数据类型dtype和存放device(cpu/gpu)。
tensor各种操作
加法操作
y = torch.rand(5, 3)
print(x + y)
//加法形式2
print(torch.add(x, y))
//还可指定输出:
result= torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
//加法形式3__inplace
y.add_(x)
print(y)
索引
//索引
y = x[0, :]
y += 1
print(y)
print(x[0, :]) // 源tensor也被改了
高级函数 | 实现功能 |
---|---|
index_select(input,dim, index) | 在指定维度dim上选取,比如选取某些行、某些列 |
masked_select(input,mask) | 例子如上,a[a>0],使用ByteTensor进行选取 |
nonzero(input) | 非0元素的下标 |
gather(input,dim, index) | 根据index,在dim维度上选取数据,输出的size与index一样 |
y = x.view(15)
z = x.view(-1, 5)
print(x.size(), y.size(), z.size())
输出:torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])
view()返回的新Tensor与源Tensor虽然可能有不同的size,但是是共享data的,更改其中的一个,另外一个也会跟着改变。(顾名思义,view仅仅是改变了对这个张量的观察角度,内部数据并未改变)
Tensor on GPU
if torch.cuda.is_available():
device = torch.device("cuda") # GPU
y = torch.ones_like(x, device=device) # 直接创建一个在GPU上的Tensor
x = x.to(device) # 等价于 .to("cuda")
z = x + y
print(z)
print(z.to("cpu", torch.double)) # to()还可以同时更改数据类型
```