张量操作专题

1.Tensor(张量)介绍

1.1 Tensor(张量)的概念

张量是一个多维数组,它是表量,向量,矩阵的高维扩展。
张量操作专题_第1张图片
举个栗子:
张量操作专题_第2张图片

1.2 Tensor(张量)的属性

张量操作专题_第3张图片

  • data:Tensor的值
  • dtype:Tensor的数据类型
  • shape:Tensor的形状
  • device:Tensor所在的设备(CPU/GPU)
  • requires_gard:是否需要梯度
  • grad:Tensor的梯度
  • grad_fn:创建Tensor
  • is_leaf:是否是叶子节点

举个栗子:
张量操作专题_第4张图片
注意:关于Tensor的数据类型
9大数据类型,3大类:
张量操作专题_第5张图片

2.张量的创建

2.1 方式一:利用torch.tensor()直接创建

torch.tensor(data,dtype=None,device=None,requires_gard=False,pin_memory=False)
  • data: 数据,如lis,numpy;
  • dtype:数据类型,默认与data一致;
  • device:所在设备,CPU、GPU;
  • requires_grad:是否需要梯度;
  • pin_memory:是否锁页面内存;

举个栗子
张量操作专题_第6张图片

2.2 方式二:从numpy创建tensor

torch.from_numpy(ndarray)

从numpy创建tensor,此时ndarra与tensor共享内存,当修改其中的一个数据,另外一个也会被改动。
张量操作专题_第7张图片
举个栗子:
张量操作专题_第8张图片

2.3 方式三:根据数值创建tensor

张量操作专题_第9张图片

2.3.1 根据size创建全0的张量

torch.zeros(size,out=None,dtype=None,device=None,requires_grad=False,layout=torch.strided)
  • size:张量的形状
  • out:输出的张量,如果指定,则返回的张量和out指向同一个地址;
  • dtype: 张量的数据类型;
  • device:所在设备,CPU/GPU;
  • requires_ grad:是否需要梯度;
  • layout:内存中布局形式;

举个栗子
张量操作专题_第10张图片

2.3.2 根据input形状创建全0的张量

torch.zeros_like(input,dtype=None,device=None,requires_grad=False,layout=None)
  • input: 创建于input张量同形状的全0张量;
  • dtype:数据类型,默认与input张量的数据类型相同
  • device:所在设备,CPU/GPU;
  • requires_ grad:是否需要梯度;
  • layout:内存中布局形式;
    举个栗子:
    张量操作专题_第11张图片

2.3.3 全1张量的创建

torch.ones(size,out=None,dtype=None,device=None,requires_grad=False)
# 或者
torch.one_like(input,dtype=None,device=None,require_grad=False)

2.3.4 根据size创建自定义数值的张量

torch.full(size,fill_vlaue,out=None,dtype=None,device=None,require_grad=False)
  • input: 创建于input张量同形状的全0张量;
  • fill_value:自定义的数值
  • out:输出的张量,如果指定,则返回的张量和out指向同一个地址
  • dtype:数据类型,默认与input张量的数据类型相同
  • device:所在设备,CPU/GPU;
  • requires_ grad:是否需要梯度;

张量操作专题_第12张图片

2.3.5 根据input形状创建自定义数值的张量

torch.full_like(input,fill_value,dtype=None,device=None,requires_grad=False)
  • input: 创建 与input张量同形状的自定义数值的张量;
  • fill _value:自定义的数值;
  • dtype: 数据类型,默认与input张量的数据类型相同;
  • device:所在设备,CPU/GPU;
  • requires_ grad:是否需要梯度;

举个栗子:
张量操作专题_第13张图片

2.3.6 创建等差1维张量,[start,end]

torch.arange(start=0,end,step=1,out=None,dtype=None,device=None,requires_grad=False)
  • start:起始值 ;
  • end:结束值(取不到);
  • step:公差(步长), 默认为1;
  • out:输出的张量, 如果指定,则返回的张量和out指向同-一个地址
  • dtype:张量的数据类型;
  • device:所在设备,CPU/GPU;
  • requires_ grad: 是否需要梯度 ;

举个栗子:
张量操作专题_第14张图片

3.3.6 创建单位对角矩阵,默认是方阵

torch.eye(n,m=None,out=None,dtype=None,device=None,requires_grad=False)
  • n: 矩阵行数(通常只设置n,结果为nxn的方阵);
  • m: 矩阵列数;

举个栗子:
张量操作专题_第15张图片

2.4 根据概率创建Tensor

张量操作专题_第16张图片

2.4.1 生成正态分布

x=torch.normal(mean,std,size)
  • mean: 均值;
  • std: 标准差;
  • size:形状

举个栗子
张量操作专题_第17张图片

2.4.2 生成标准正态分布(均值为0,标准差为1)

torch.randn(size,out=None,dtype=None,device=None,requires_grad=False)
  • size: 张量的形状;
  • out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
  • dtype: 张量的数据类型;
  • device: 所在设备,CPU/GPU;
  • requires_grad: 是否需要梯度;

举个栗子:
张量操作专题_第18张图片

2.4.3 生成[0,1)上的均匀分布

torch.rand(size,out=None,dtype=None,device=None,requires_grad=False)
  • size: 张量的形状;
  • out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
  • dtype: 张量的数据类型;
  • device: 所在设备,CPU/GPU;
  • requires_grad: 是否需要梯度;

举个栗子:
张量操作专题_第19张图片

2.4.4 生成[low,high)上的均匀分布

torch.randint(low=0,high,size,out=None,dtype=None,device=None,requires_grad=False)
  • low: 区间下限;
  • high: 区间上限;
  • size: 张量的形状;
  • out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
  • dtype: 张量的数据类型;
  • device: 所在设备,CPU/GPU;
  • requires_grad: 是否需要梯度;

举个栗子:
张量操作专题_第20张图片

2.4.5 打乱0~n-1,生成n个数的随机排列(常用于生成索引)

troch.randperm(n,out=None,dtype=None,device=None,requires_grad=False)

n: 张量的长度
out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
dtype: 张量的数据类型;
device: 所在设备,CPU/GPU;
requires_grad: 是否需要梯度;

举个栗子:
张量操作专题_第21张图片

2.4.6 生成伯努利分布(0-1分布)

张量操作专题_第22张图片

torch.bernoulli(input,out=None)
  • input: 出现1的概率值,必须为张量;
  • out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;

举个栗子:
张量操作专题_第23张图片

3.张量的操作

张量操作专题_第24张图片

3.1 拼接

3.1.1 torch.cat()

将张量按照dim维度进行拼接

torch.cat(tensors,dim=0,out=None)
  • tensors:待拼接的张量序列
  • dim:要拼接的维度
  • out:输出的张量,如果指定,则返回的张量和out指向同一个地址;
    张量操作专题_第25张图片
    举个栗子:
    张量操作专题_第26张图片

3.1.2 torch.stack()

将张量在新创建的dim维度上进行拼接

torch.stack(tensors,dim=0,out=None)
  • tensors:待拼接的张量序号
  • dim: 要拼接的维度
  • out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
    张量操作专题_第27张图片
    举个栗子:
    张量操作专题_第28张图片

3.2切分

3.2.1 torch.chunk()

将张量按照dim维度进行平均切分,若不能整除,则最后一份张量小于其他张量。

torch.chunk(input,chunks,dim=0)
  • input:待切分的张量;
  • chunks:切分的份数;
  • dim:切分的维度;
    张量操作专题_第29张图片
    举个栗子:
    张量操作专题_第30张图片
    张量操作专题_第31张图片

3.2.2 torch.split()

将张量按照dim维度进行平均切分,可以指定每一个分量的长度

torch.split(input,split_size_or_sections,dim=0)
  • input:待切分的张量;
  • split_size_or_sections:若为int,表示每一个分量的长度;若为list,按照list元素给分量分配长度;
  • dim:切分的维度;
    张量操作专题_第32张图片
    举个栗子:
    张量操作专题_第33张图片

3.3 索引

3.3.1 torch.index_select()

在dim维度上,按照index索引提取数据

torch.index_select(input,dim,index)
  • input:要索引的张量;
  • dim:要索引的维度;
  • index:要索引的序号,为张量;
    张量操作专题_第34张图片
    举个栗子:
    张量操作专题_第35张图片

3.3.2 torch.mask_select()

torch.masked_select(input,mask)
  • input:要索引的张量;
  • mask:与input同形状的元素为布尔类型的张量;
    张量操作专题_第36张图片
    举个栗子:
    张量操作专题_第37张图片

3.3.3 torch.gather

torch.gather(input,index_tensor)

当是一个多维张量的时候,需要对其他维度进行过滤数据。
举个例子:
我有一个510的二维张量,有一个52的索引张量,然后根据索引张量对第一个二维张量进行过滤。

	tensor=torch.randn(5,10)
    index_tensor=torch.tensor([[0,1],[4,6],[2,8],[2,5],[0,7]])
    filter_tensor=torch.gather(tensor,1,index_tensor)

输出结果:

tensor张量的value:
tensor([
[ 0.2962, -0.6312,  1.9905, -0.6701,  0.7903, -0.3884, -1.2570, -0.3893,-1.2469,  0.9444],
[-0.3355,  2.4038,  1.3065, -0.4189,  0.3941, -1.9919, -0.7030, -0.1080,-0.4161,  0.4711],
[-0.1550, -0.5828,  0.5407,  0.5705,  0.2898, -1.5406,  0.7004, -0.0204,-0.0164, -0.8491],
[ 0.0629, -1.2698, -2.4622,  0.6581,  1.1167,  0.5098, -0.3765,  0.7491,-1.7872, -1.1361],
[ 0.0255,  0.1839,  0.6344,  0.6063,  0.3264, -0.0668, -0.1057,  0.2875,-0.6241,  0.7373]])
index_tensor张量的value:
tensor([[0, 1],
        [4, 6],
        [2, 8],
        [2, 5],
        [0, 7]])
filter_tensor张量的value:   
tensor([[ 0.2962, -0.6312],
        [ 0.3941, -0.7030],
        [ 0.5407, -0.0164],
        [-2.4622,  0.5098],
        [ 0.0255,  0.2875]])

3.4 变换

3.4.1 torch.reshape()

变换张量的形状;当张量在内存中是连续时,返回的张量和原来的张量共享数据内存,改变其中一个张量时,另一个张量也会改变。

torch.reshape(input,shape)
  • input:要变换的张量
  • shape:要变换的形状
    张量操作专题_第38张图片
    举个栗子:
    张量操作专题_第39张图片

注意:tensor的属性包括:data,dtype,shape,device,requires_grad,grad;grad_fn和is_leaf等;
经过reshape变换后的t2与t共享data属性,即两者的data属性地址相同;但是t2与t不属于同一个tensor,两者的地址不相同。
张量操作专题_第40张图片

3.4.2 torch.transpose()

变换张量的两个维度;如:CHW — HWC

torch.transpose(input,dim0,dim1)
  • input:要变换的张量
  • dim0:要交换的第一个维度
  • dim1:要交换的第二个维度
    张量操作专题_第41张图片

3.4.3 torch.t()

对2维张量转置。

torch.t(input)
  • input:要变换的张量
  • dim0:要交换的第一维度

张量操作专题_第42张图片
举个栗子:
张量操作专题_第43张图片
注意:
torch.t (input) 与 torch.transpose (input,dim0=0,dim1=1)等价。

3.4.4 torch.sequeeze()

压缩长度为1的维度。

 torch.sequeeze(input,dim=None)
  • input:要变换的张量
  • dim:若为None,则移除所有长度为1的维度;若指定,则当且仅当该维度长度为1时可以移除;

举个栗子:
张量操作专题_第44张图片

3.4.5 torch.unsequeeze()

根据dim扩展维度,长度为1。

torch.unsequeeze(input,dim)
  • input:要变换的张量
  • dim:指定要扩展的维度
    举个栗子:
    张量操作专题_第45张图片

你可能感兴趣的:(#,深度学习+机器学习,张量,张量计算,向量计算)