张量是一个多维数组,它是表量,向量,矩阵的高维扩展。
举个栗子:
举个栗子:
注意:关于Tensor的数据类型
9大数据类型,3大类:
torch.tensor(data,dtype=None,device=None,requires_gard=False,pin_memory=False)
torch.from_numpy(ndarray)
从numpy创建tensor,此时ndarra与tensor共享内存,当修改其中的一个数据,另外一个也会被改动。
举个栗子:
torch.zeros(size,out=None,dtype=None,device=None,requires_grad=False,layout=torch.strided)
torch.zeros_like(input,dtype=None,device=None,requires_grad=False,layout=None)
torch.ones(size,out=None,dtype=None,device=None,requires_grad=False)
# 或者
torch.one_like(input,dtype=None,device=None,require_grad=False)
torch.full(size,fill_vlaue,out=None,dtype=None,device=None,require_grad=False)
torch.full_like(input,fill_value,dtype=None,device=None,requires_grad=False)
torch.arange(start=0,end,step=1,out=None,dtype=None,device=None,requires_grad=False)
torch.eye(n,m=None,out=None,dtype=None,device=None,requires_grad=False)
x=torch.normal(mean,std,size)
torch.randn(size,out=None,dtype=None,device=None,requires_grad=False)
torch.rand(size,out=None,dtype=None,device=None,requires_grad=False)
torch.randint(low=0,high,size,out=None,dtype=None,device=None,requires_grad=False)
troch.randperm(n,out=None,dtype=None,device=None,requires_grad=False)
n: 张量的长度
out: 输出的张量,如果指定,则返回的张量和out指向同一个地址;
dtype: 张量的数据类型;
device: 所在设备,CPU/GPU;
requires_grad: 是否需要梯度;
torch.bernoulli(input,out=None)
将张量按照dim维度进行拼接
torch.cat(tensors,dim=0,out=None)
将张量在新创建的dim维度上进行拼接
torch.stack(tensors,dim=0,out=None)
将张量按照dim维度进行平均切分,若不能整除,则最后一份张量小于其他张量。
torch.chunk(input,chunks,dim=0)
将张量按照dim维度进行平均切分,可以指定每一个分量的长度
torch.split(input,split_size_or_sections,dim=0)
在dim维度上,按照index索引提取数据
torch.index_select(input,dim,index)
torch.masked_select(input,mask)
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]])
变换张量的形状;当张量在内存中是连续时,返回的张量和原来的张量共享数据内存,改变其中一个张量时,另一个张量也会改变。
torch.reshape(input,shape)
注意:tensor的属性包括:data,dtype,shape,device,requires_grad,grad;grad_fn和is_leaf等;
经过reshape变换后的t2与t共享data属性,即两者的data属性地址相同;但是t2与t不属于同一个tensor,两者的地址不相同。
变换张量的两个维度;如:CHW — HWC
torch.transpose(input,dim0,dim1)
对2维张量转置。
torch.t(input)
举个栗子:
注意:
torch.t (input) 与 torch.transpose (input,dim0=0,dim1=1)等价。
压缩长度为1的维度。
torch.sequeeze(input,dim=None)
根据dim扩展维度,长度为1。
torch.unsequeeze(input,dim)