1. Tensor和pytorch基本操作
Note
本笔记只能做一些简要的介绍,真正要深入了解还是要去pytorch官网多查查源码
Tensor是pytorch中最基本的运算单元,可以用来存放数组,矩阵等,用法和numpy的array类似,两者也支持一定程度的转换,在实践中经常遇到array,tensor,PILImage等多种数据格式的互相转换。
- 以下代码展示了如何生成一个tensor
b=torch.tensor([[1,2,3],[4,5,6]]) #将列表或者np array传入,生成对应的矩阵
b.dtype #数据类型,一般为torch.float32
torch.ones_like(b) #生成一个同样大小的全为1的向量
torch.zeros_like()
torch.rand_like()
torch.rand((2,2,)) #生成一个大小为2x2的随机向量,上文是传入列表,下面这类是直接传入维数
- 以下代码检查是否能使用GPU
torch.cuda.is_available();
- 以下代码展示了一些对tensor的基本操作
torch.is_tensor()
torch.is_nonzero() #单一元素且不为0
torch.numel() #所有元素的总个数
torch.set_default_tensor_type()
torch.arange(start=0,end,step=1) #[start,end) size= (end-start) // step
torch.range(start=0 end,step=1) #[start,end] size=(end-start) //step +1
torch.linsapce(start,end,steps) #[start,end] 线性分成steps个点
torch.eye(n,m) #对角线全为1
torch.full(size,fill_value) #full_like类似
- 以下代码展示了一些对多个tensor的基本操作
Danger
pytorch中维度的计算是从0开始的,一般第0维为列,第一维为行
torch.cat([a,b],dim)#除了cat维度,其他维度要保持一致,连接后cat维度变为a,b之和,其余维度不变。
a,b=torch.chunk(input,chunks,dim=0)#在dim上对chunks进行分割,最后一个如果不能整除会显得小
(存疑)torch.column_stack((a,b,b))#先转置,然后并排放
gather(input,dim,index) #不好解释草,看看官网吧
reshape(input,shape)#shape为-1的部分自动计算
a=scatter(dim,index,src) #和gather很像,将src中对应index位置的值写入自身张量
scatter_add_(dim,index,src)
split(input,split_size_or_sections)#传入整数则将dim设置为这个整数来划分,
#传入列表则将划分的子张量对应dim的大小设为该数
squeeze(input)#将维度为1的dim去掉
stack(tensors_list,dim=0) #dim=0:3x2,3x2->2x3x2:
#dim=1:3x2,3x2->3x2x2
torch.take(src,index)
torch.tile(src,dim_list) #少的维度往前补1
torch.unbind(src,dim) #按dim切片
torch.unsqueeze(src,dim)#增维dim=-1表示最后一维
torch.where(condition,x,y)#如果condition成立则返回x,不然返回y
Note
gather公式
out[i][j][k] = input[index[i][j][k]][j][k] # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k] # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]] # if dim == 2
Note
函数后面加一_代表原位操作,即结果直接写到原位置上