张量是多维数组,是标量、向量、矩阵的高维拓展
数据类型
Pytorch0.4.0之前的张量数据类型:torch.autograd.Variable,
用处:用来封装Tensor,进行自动求导
属性:
data-----被包装的Tensor
grad-----data的梯度
grad_fn:创建Tensor的Function,是自动求导的关键
requires_grad:指示是否需要梯度
Is_leaf:指示是否是叶子结点(张量)
========================================================================================================
现在的张量数据类型: torch.Tensor
属性:data,dtype,shape,device,requires_grad,grad,grad_fn,is_leaf
Dtype: 张量数据类型,torch.FloatTensor,torch.cuda.FloatTensor
Shape:张量形状,如(64,3,224,224)
Device:张量所在设备,GPU/CPU,是加速关键
创建方式Tensor:
-
直接创建
Torch.tensor(data)
Torch.from_numpy(data) 与data是同一个内存
-
根据数值创建
- Torch.zeros(size,out,layout,device,requires_grad)
| Out: 输出的张量 layout:内存中的布局形式,如stride,sparese_coo,默认stride Device:所在设备
|
- Torch.zeros_like(input,dtype,layout)
根据input形状创建全0张量
- Torch.ones()
- Torch.ones_like()
- Torch.full()
- Torch.full_like(size,fill_value) , fill_value为张量的值
- Torch.arrange(start,end,step)
创建等差的一维张量
start:数列起始值
End: 数列“结束值”
Step: 数列公差,默认为1
- Torch.linspace(start,end,steps)
创建均分的一维张量
steps数列长度
- Torch.logspace(start,end,steps,base)
创建对数均分的1维张量
Base: 对数函数的底,默认为10
- Torch.eye(n,m)
创建对角矩阵
n: 行
m: 列
-
根据概率分布创建张量
- Torch.normal() 生成正太分布(即高斯分布)
Mean: 均值(张量\标量)
Std: 方差(张量\标量)
1)张量 + 张量
依次对应4个不同均值和方差的概率分布的采样
2)标量+标量
3)标量 + 张量
依次生成4个均值相同,方差不同的概率分布采样
3) 张量+标量
依次生成4个均值不同,方差相同的概率分布采样
- Torch.randn()
生成标准正态分布的张量
- Torch.randn_like()
- Torch.rand()生成均匀分布
- Torch.rand_like()
- Torch.randint()整数均匀分布
- Torch.randint_like()
- Torch.randperm(n)
生成从0到n-1的随机排列
n:张量长度
- Torch.bernoulli()
以input为概率,生成伯努利分布
=================================================================================================================================================================================================
张量的操作
-
张量拼接与切分
- Torch.cat(tensor,dim):
将张量按照维度dim进行拼接
Tensor: 张量序列
Dim: 要拼接的维度
- Torch.stack(tensor,dim)
在新创建的维度dim上进行拼接
Tensor: 张量序列
Dim: 要拼接的维度
- Torch.chunk(input,chunks,dim)
将张量按照dim进行平均切分
返回值:张量列表
注意事项:若不能整除,最后一份张量小于其他张量
Chunks: 要切分的份数
Dim: 要切分的维度
- Torch.split(tensor,split_size_or_sections,dim)
将张量按照维度切分
返回值:张量列表
Split_size_or_sections: 为int时,是每份的长度;为list时,按list元素切分
- 张量索引
- Torch.index_select(input,dim,index)
在维度dim上,按index索引数据
返回值:index索引数据拼接成的向量
Index:要索引数据的序号
- Torch.masked.select(input,mask)
按照mask中的true进行索引,返回一维张量,所有满足mask要求的值
Mask:与input通形状的布尔类型向量
- 张量变换
- Torch.reshape(input,shape)
变换张量形状
注意:当张量在内存中是连续的时,新张量与input共享数据内存
Input:要变换的张量
shape:新张量的形状
- Torch.transpose(input,dim0,dim1)
交换张量的两个维度
转置?
- Torch.t()
二维矩阵的转置,相当于torch.transpose(input,0,1)
- Torch.squeeze()
压缩(删除)长度为1的轴,把轴内元素合并
Dim: 为None的话压缩所有轴长为1的;若为指定维度,当且仅当该轴长度为1时,可以被移除。
- Torch.unsqueeze()
依据dim进行扩展维度,分割出一个维度
-
张量数学运算
- 加减乘除
Torch.add(input,other) 加法
Torch.addcdiv(input,tensor1,tensor2,value,out) 加法复合运算
Torch.addcmul(): out= input + value*tensor1*tensor2
Torch.sub() 减法
Torch.div() 除法
Torch.mul() 乘法
- 对数,指数,幂函数
Torch.log() 对数函数
Torch.log10() 以10为底的对数函数
torch.log2() 以2为底的对数函数
Torch.exp() 指数函数
torch.pow(a,b)求幂函数
- 三角函数
Torch.abs()
Torch.acos()
Torch.cosh()双曲余弦
torch.cos()
Torch.asin()
Torch.atan()
Torch.atan2() 返回x,y坐标的反正切值