1.Tensor(张量)介绍
1.1 Tensor(张量)的概念
张量是一个多维数组,它是表量,向量,矩阵的高维扩展。
举个栗子:
1.2 Tensor(张量)的属性
- data:Tensor的值
- dtype:Tensor的数据类型
- shape:Tensor的形状
- device:Tensor所在的设备(CPU/GPU)
- requires_gard:是否需要梯度
- grad:Tensor的梯度
- grad_fn:创建Tensor
- is_leaf:是否是叶子节点
举个栗子:
注意:关于Tensor的数据类型
9大数据类型,3大类:
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:是否锁页面内存;
举个栗子
2.2 方式二:从numpy创建tensor
torch.from_numpy(ndarray)
从numpy创建tensor,此时ndarra与tensor共享内存,当修改其中的一个数据,另外一个也会被改动。
举个栗子:
2.3 方式三:根据数值创建tensor
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:内存中布局形式;
举个栗子
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:内存中布局形式;
举个栗子:
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:是否需要梯度;
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:是否需要梯度;
举个栗子:
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: 是否需要梯度 ;
举个栗子:
3.3.6 创建单位对角矩阵,默认是方阵
torch.eye(n,m=None,out=None,dtype=None,device=None,requires_grad=False)
- n: 矩阵行数(通常只设置n,结果为nxn的方阵);
- m: 矩阵列数;
举个栗子:
2.4 根据概率创建Tensor
2.4.1 生成正态分布
x=torch.normal(mean,std,size)
- mean: 均值;
- std: 标准差;
- size:形状
举个栗子
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: 是否需要梯度;
举个栗子:
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: 是否需要梯度;
举个栗子:
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: 是否需要梯度;
举个栗子:
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: 是否需要梯度;
举个栗子:
2.4.6 生成伯努利分布(0-1分布)
torch.bernoulli(input,out=None)
- input: 出现1的概率值,必须为张量;
- out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
举个栗子:
3.张量的操作
3.1 拼接
3.1.1 torch.cat()
将张量按照dim维度进行拼接
torch.cat(tensors,dim=0,out=None)
- tensors:待拼接的张量序列
- dim:要拼接的维度
- out:输出的张量,如果指定,则返回的张量和out指向同一个地址;
举个栗子:
3.1.2 torch.stack()
将张量在新创建的dim维度上进行拼接
torch.stack(tensors,dim=0,out=None)
- tensors:待拼接的张量序号
- dim: 要拼接的维度
- out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
举个栗子:
3.2切分
3.2.1 torch.chunk()
将张量按照dim维度进行平均切分,若不能整除,则最后一份张量小于其他张量。
torch.chunk(input,chunks,dim=0)
- input:待切分的张量;
- chunks:切分的份数;
- dim:切分的维度;
举个栗子:
3.2.2 torch.split()
将张量按照dim维度进行平均切分,可以指定每一个分量的长度
torch.split(input,split_size_or_sections,dim=0)
- input:待切分的张量;
- split_size_or_sections:若为int,表示每一个分量的长度;若为list,按照list元素给分量分配长度;
- dim:切分的维度;
举个栗子:
3.3 索引
3.3.1 torch.index_select()
在dim维度上,按照index索引提取数据
torch.index_select(input,dim,index)
- input:要索引的张量;
- dim:要索引的维度;
- index:要索引的序号,为张量;
举个栗子:
3.3.2 torch.mask_select()
torch.masked_select(input,mask)
- input:要索引的张量;
- mask:与input同形状的元素为布尔类型的张量;
举个栗子:
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:要变换的形状
举个栗子:
注意:tensor的属性包括:data,dtype,shape,device,requires_grad,grad;grad_fn和is_leaf等;
经过reshape变换后的t2与t共享data属性,即两者的data属性地址相同;但是t2与t不属于同一个tensor,两者的地址不相同。
3.4.2 torch.transpose()
变换张量的两个维度;如:CHW — HWC
torch.transpose(input,dim0,dim1)
- input:要变换的张量
- dim0:要交换的第一个维度
- dim1:要交换的第二个维度
3.4.3 torch.t()
对2维张量转置。
torch.t(input)
- input:要变换的张量
- dim0:要交换的第一维度
举个栗子:
注意:
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时可以移除;
举个栗子:
3.4.5 torch.unsequeeze()
根据dim扩展维度,长度为1。
torch.unsequeeze(input,dim)
- input:要变换的张量
- dim:指定要扩展的维度
举个栗子: