深度学习 -- 什么是张量 pytorch中张量的几种创建方法

前言
在学习深度学习的过程中,遇到的第一个概念就是张量,张量在pytorch中的计算十分重要,所以本篇博客记录本人学习张量的过程,以及自己的理解。
张量是什么?

张量是一个多维数组,它是标量、向量、矩阵的高维扩展
我们通常用三维张量去表示一张图像的数据
Tensor与Variable
张量在pytorch中是做求导计算的关键概念
Variable是torch.autograd中的数据类型,主要用于封装Tensor,进行自动求导

- data:被包装的Tensor
 - grad:data的梯度
 - grad_fn:创建Tensor的Function,是自动求导的关键
 - requires_grad:指示是否需要梯度
 - is_leaf:知识是否是叶子结点(张量)
 
Pytorch0.4.0版开始,Variable并入Tensor

- dtype:张量的数据类型,如 torch.FloatTensor,torch.cuda.FloarTensor
 - shape:张量的形状,如(64,3,224,224)
 - device:张量所在的设备,GPU/CPU,是加速的关键
 
如何创建张量?
直接创建
torch.tensor()
 功能:从data创建tensor
- data:数据,可以是list,numpy
 - dtype:数据类型,默认与data的一致
 - device:所在设备,cuda/cpu
 - requires_grad:是否需要梯度
 - pin_memory:是否存于锁页内存
 
import torch
import numpy as np
a_np = np.ones((3,3))
tensor = torch.Tensor(a_np,dtype=None,device=None,requires_grad=False,pin_memory=False,
)
print(tensor)
输出:
tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])
torch.from_numpy(ndarray)
功能:从numpy创建tensor
 注意事项:从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动

import torch
import numpy as np
a_np = np.array([[1,2,3,4],[1,2,3,4]])
# 创建张量
# print(torch.Tensor(a_np))# 从numpy数据类型创建
a_tensor = torch.from_numpy(a_np)
print(a_tensor)
输出:
tensor([[1, 2, 3, 4],[1, 2, 3, 4]], dtype=torch.int32)
如果更改numpy数组中的数据,tensor中的数据也会被改变,说明这两个数据是共享内存的。
a_np[0][0] = 2
print(a_tensor)
输出:
tensor([[2, 2, 3, 4],[1, 2, 3, 4]], dtype=torch.int32)
依据数值创建
torch,zeros()
 功能:依size创建全0张量
- size:张量的形状,如(3,3)、(3,224,224)
 - out:输出的张量
 - layout:内存中布局形式,有strided,space_coo等
 - device:所在设备,gpu/cpu
 - requires_grad:是否需要梯度
 

import torch
a_tensor = torch.zeros((3,3),out=None,layout=torch.strided,device=None)print(a_tensor)
输出:
tensor([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]])
torch.zeros_like()
 功能:依input形状创建全0张量
- intput:创建与input同形状的全0张量
 - dtype:数据类型
 - layout:内存中布局形式
 

a_tensor = torch.zeros((3,3),out=None,layout=torch.strided,device=None)
# print(a_tensor)b_tensor = torch.zeros_like(a_tensor,dtype=None,layout=None,device=None
)
print(b_tensor)
输出:
tensor([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]])
torch.ones()
 torch.ones_like()
全1张量的创建,创建方式与全0张量一样,就不过多赘述。
 
torch.full()
 torch.full_like()
 功能:依input形状创建全自定义数值的张量
- size:张量的形状
 - fill_value:张量的值
 
a_tensor = torch.full((3,3),3)
b_tensor = torch.full_like(a_tensor,4)
print(a_tensor)
print(b_tensor)
输出:
tensor([[3, 3, 3],[3, 3, 3],[3, 3, 3]])
tensor([[4, 4, 4],[4, 4, 4],[4, 4, 4]])
torch.arange()
 功能:创建等差的1维向量
- start:数列起始值
 - end:数列“结束值”
 - step:数列公差,默认为1
 

a_tensor = torch.arange(0,10,step=2)
print(a_tensor)
tensor([0, 2, 4, 6, 8])
注意:end的值不取
torch.linspace()
 功能:创建均分的1维张量
 注意事项:数值区间维[start,end] end是取的
- start:数列起始值
 - end:数列结束值
 - steps:数列长度
 

a_tensor = torch.linspace(1,100,20)
print(a_tensor)
输出:
tensor([  1.0000,   6.2105,  11.4211,  16.6316,  21.8421,  27.0526,  32.2632,37.4737,  42.6842,  47.8947,  53.1053,  58.3158,  63.5263,  68.7368,73.9474,  79.1579,  84.3684,  89.5789,  94.7895, 100.0000])
torch.logspace()
 创建对数均分的1维张量
- start:数列起始值
 - end: 数列结束值
 - steps:数列长度
 - base:对数函数的底,默认为10
 

torch.eye()
 功能:创建单位对角矩阵(2维张量)
- n:矩阵行数
 - m:矩阵列数
 

依概率分布创建张量
torch.normal()
 生成正态分布(高斯分布)
- mean:均值
 - std:标准差
 

gaosi = torch.normal(0.5,0.25,size=(4,))
print(gaosi)
输出:
tensor([0.2068, 0.5469, 0.4644, 0.6587])
torch.randn()
 torch.randn_like()
生成标准正态分布
- size:张量的形状
 

torch.rand()
 torch.rand_like()
 在[0,1)区间上,生成均匀分布
torch.randint()
 torch.randint_like()
 区间[low,high)上生成整数均匀分布
- size:张量形状
 
pytorh中常见的几种创建方法就是这些了,以后如果遇到新的创建方法我也会在博客中进行分享,下篇博客中,我将学习,张量的一些变换以及计算。


