Tensors
Tensors张量是一种特殊的数据结构,它类似于数组和矩阵,在Pytorch中,我们使用tensors来给模型的输入输出以及参数进行编码,Tensors除了张量可以在gpu或者其他专用硬件上来使用加速计算之外,其他用法类似于Numpy中的ndarrays。
import torch
import numpy as np
初始化Tensor有很多方法:
1.从数据创建
data = [[1, 2],[3, 4]]
x_data=torch.tensor(data)
2.从Nmupy创建
np_array = np.array(data)
x_np=torch.from_numpy(np_array)
3.从其他tensor创建
x_ones=torch.ones_like(x_data)#创建类似于x_data的单位张量
x_rands=torch.rand_like(x_data,dtype=torch.float)
#创建类似于x_data,数据类型为float且数据随机的张量返回在区间[0,1)[0,1)上由均匀分布的随机数填充的张量
shape=(2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor=torch.zeros(shape)
Tensors属性
tensor = torch.rand(3,4)
Tensors操作
Tensors有超过100个操作,该网站可以访问:https://pytorch.org/docs/stable/torch.html
它们都可以在GPU上运行,通常性能要好于CPU,如果使用的Colab,通过编辑>笔记本来分配一个GPU
We move our tensor to the GPU if available
if torch.cuda.is_available():
tensor = tensor.to('cuda')
切片操作:
tensor = torch.ones(4,4)
tensor[:,1]=0 #让所有行的第一列变为0,结果如下
tensor([[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.]])
合并操作:
可以使用torch.cat来沿着特定维数来连接一些列张量。torch.stack()另一个加入op的张量与torch.cat略有不同
t1=torch.cat([tensor,tensor,tensor],dim=1)
#dim=0按行拼接,dim=1按列拼接
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
tensors的加法:
a=2020
tensor=tensor([ 0.2824, -0.3715, 0.9088])
tensor.mul(tensor,a)
#对两个张量进行逐元素乘法,也就是tensor中的所有元素乘以a,要求两个张量维度相同,如1*2 mul 1*2返回1*2张量,1*4和1*1mul返回1*4张量,但是4*5和6*7不可以mul,也可以用*直接代替
原地操作
带有后缀_的操作表示原地操作,例如x.copy_(y),x.t_()将改变x
tensor.add_(5)#矩阵原地+5
tensor转换为numpt数组
t=torch.ones(5)
n=t.numpy()
t:tensor([1.,1.,1.,1.,1.])
n:[1.1.1.1.1]
Numpy数组也可以转换为Tensor
n=np.ones(5)
t=torch.from_numpy(n)
值得一提的是索引和切片操作,我们可以用[-1]选择最后一个元素,用[1:3]第二和第三个元素,这个的[1:3]是一个区间可以理解为大于等于1且小于3。