跳转至

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

函数后面加一_代表原位操作,即结果直接写到原位置上