PyTorch学习笔记(二):Tensor操作 |
您所在的位置:网站首页 › array和tensor › PyTorch学习笔记(二):Tensor操作 |
什么是Tensor
Tensor,又名张量,最早接触这个词是来自于TensorFlow,这个概念也被广泛的应用于不同的深度学习框架。 如果一个物理量,在物体的某个位置上只是一个单值,那么就是普通的标量,比如密度。如果它在同一个位置、从不同的方向上看,有不同的值,而且这个数恰好可以用矩阵乘观察方向来算出来,就是张量。几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。 从工程角度来讲,可简单地认为它就是一个数组,且支持高效的科学计算。它可以是一个数(标量)、一维数组(向量)、二维数组(矩阵)和更高维的数组(高阶数据)。 PyTorch中的TensorTensor是PyTorch中重要的数据结构,可认为是一个高维数组。Tensor和Numpy中的ndarrays类似,但Tensor可以使用GPU进行加速计算。PyTorch中有许多不同的方法可以创建Tensor。 创建Tensor的方法:torch.Tensor(*sizes):随机创建指定形状的Tensor。 使用该方法创建Tensor时,系统不会马上分配空间,只是会计算剩余的内存是否足够使用,使用到Tensor时才会分配。而其它操作都是在创建完Tensor之后马上进行空间分配。 >>> a = torch.Tensor(2, 3) >>> a tensor([[1.2748e-10, 4.5916e-41, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00]])torch.Tensor(data):将List转换为Tensor。 >>> a = torch.Tensor([[1,2,3],[4,5,6]]) >>> a tensor([[1., 2., 3.], [4., 5., 6.]])torch.ones(data):创建全1的Tensor。 >>> torch.ones(2, 3) tensor([[1., 1., 1.], [1., 1., 1.]])torch.zeros(data):创建全0的Tensor。 >>> torch.zeros(2, 3) tensor([[0., 0., 0.], [0., 0., 0.]])torch.eye(*size):创建对角Tensor。 >>> torch.eye(3, 3) tensor([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])torch.arange(s, e, step):生成从s到e,步长为step的一维Tensor。 >>> torch.arange(1, 10, 2) tensor([1, 3, 5, 7, 9])torch.linspace(s, e, n):生成从s到e,size为n的一维Tensor。 >>> torch.linspace(1, 10, 2) tensor([ 1., 10.])torch.randn(*size):标准分布。 >>> torch.randn(2, 3) tensor([[-0.8712, -0.2707, -0.4527], [ 0.3612, 0.2612, -0.6841]])torch.rand(*size):均匀分布。 >>> torch.rand(2, 3) tensor([[0.5604, 0.5680, 0.5437], [0.6341, 0.0839, 0.2817]])torch.tensor是在0.4版本新增加的一个新版本的创建tensor方法,使用的方法,和参数几乎和np.array完全一致。不论输入的类型是什么,torch.tensor都会进行数据拷贝,不会共享内存。 >>> a = np.array([1, 2, 3]) >>> b = torch.tensor(a) >>> a[0] = 0 >>> a array([0, 2, 3]) >>> b tensor([1, 2, 3], dtype=torch.int32) Tensor转换:Torch定义了七种CPU tensor类型和八种GPU tensor类型: dtype他们之间可以通过内置函数互相转换: 将tensor投射为long类型:newtensor = tensor.long() 将tensor投射为半精度浮点(16位浮点)类型:newtensor = tensor.half() 将tensor投射为int类型:newtensor = tensor.int() 将tensor投射为double类型:newtensor = tensor.double() 将tensor投射为float类型:newtensor = tensor.float() 将tensor投射为char类型:newtensor = tensor.char() 将tensor投射为byte类型:newtensor = tensor.byte() 将tensor投射为short类型:newtensor = tensor.short() >>> a.dtype torch.float32 >>> a.int() tensor([1, 2, 3], dtype=torch.int32) >>> a.double() tensor([1., 2., 3.], dtype=torch.float64) >>> a.long() tensor([1, 2, 3])Tensor可以存放在不同的device(cpu/gpu)。 cpu –> gpu,使用data.cuda()。 gpu –> cpu,使用data.cpu()。 >>> a = torch.Tensor([1, 2, 3], device=torch.device('cpu')) >>> a.device device(type='cpu')Tensor可以和Numpy的ndarray互相转换。返回的新tensor与源tensor共享内存,也即更改其中的一个,另外一个也会跟着改变。 当numpy的数据类型和Tensor的类型不一样的时候,数据会被复制,不会共享内存。 Tensor –> Numpy.ndarray ,可以使用 data.numpy()。 Numpy.ndarray –> Tensor ,可以使用torch.from_numpy(data)。 >>> a.numpy() array([1., 2., 3.], dtype=float32)Tensor –>Python List,可以使用 data.tolist()。 >>> a.tolist() [1., 2., 3.]一个tensor如果想要转换为标准的python对象数值,需要调用tensor.item(),这个方法只对包含一个元素的tensor适用。 >>> a tensor(10) >>> a.item() 10 >>> c = torch.tensor([1, 2, 3]) >>> c.item() Traceback (most recent call last): File "", line 1, in ValueError: only one element tensors can be converted to Python scalars Tensor常规操作查看Tensor的大小:tensor.size()。 查看Tensor的大小:tensor.shape。 >>> a.size() torch.Size([3]) >>> a.shape torch.Size([3])统计Tensor的元素个数:Tensor.numel()。 >>> a.numel() 3调整tensor的形状:tensor.view()。 该函数必须保证调整前后元素总数一致。view不会修改自身的数据,返回的新tensor与源tensor共享内存,也即更改其中的一个,另外一个也会跟着改变。 >>> a.view(-1, 3) tensor([[1., 2., 3.]])为Tensor添加维度:tensor.unsqueeze()。 为Tensor减少维度:tensor.squeeze()。 >>> a tensor([1., 2., 3.]) >>> b = a.unsqueeze(0) >>> b tensor([[1., 2., 3.]]) >>> b = b.squeeze(0) >>> b tensor([1., 2., 3.]) Tensor索引操作Tensor支持与numpy.ndarray类似的索引操作,语法上也类似,索引出来的结果与原tensor共享内存,也即修改一个,另一个会跟着修改。 索引示例如下: >>> a = torch.rand(3, 3) >>> a tensor([[0.8817, 0.0785, 0.8402], [0.9164, 0.9220, 0.8753], [0.1414, 0.7123, 0.9890]]) >>> a[1] tensor([0.9164, 0.9220, 0.8753]) >>> a[:, 0] tensor([0.8817, 0.9164, 0.1414]) >>> a[a > 0.5] tensor([0.8817, 0.8402, 0.9164, 0.9220, 0.8753, 0.7123, 0.9890]) Tensor运算PyTorch支持几种不同的运算,如下示例所示: Tensor内置函数:Tensor.sum()。 Torch运算函数:Torch.sum()。 >>> a.sum() tensor(6.) >>> torch.sum(a) tensor(6.) >>> a.sum_()不修改Tensor的内置函数:Tensor.add(b)。 修改Tensor的内置函数:Tensor.add_(b)。 函数名以_结尾的都是inplace方式,即会修改调用者自己的数据。 >>> a = torch.tensor(6) >>> b = torch.tensor(4) >>> a.add(b) tensor(10) >>> a tensor(6) >>> a.add_(b) tensor(10) >>> a tensor(10)符号运算:tensor + tensor。 >>> a + b tensor(14)常用的Tensor操作如上所示,但是以上介绍并不包括所有的Tensor操作,详细的可以查看PyTorch手册。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |