PyTorch入门实战教程笔记(六):基础张量操作3

PyTorch入门实战教程笔记(六):基础张量操作3

包括:Broadcasting自动扩展、合并与分割

Broadcasting自动扩展:

特点:Expand(自动的)、without copying data。
  比如,现在有一个张量A、B,将B扩展成与A相同的维度,假设A是feature map,B为偏置,A[4,32,14,14],B:[32],那么怎么办呢,可进行如下图扩展,要注意,扩展一定是先从小维度开始,再到高维扩展(倒着写): PyTorch入门实战教程笔记(六):基础张量操作3_第1张图片
  扩展后就可以直接相加,来看一个形象点的,比如下图:可以把Broadcasting理解为插图一个新的维度,扩展为相同的shape。PyTorch入门实战教程笔记(六):基础张量操作3_第2张图片
  具体意义:比如现在有一个学校:[class, students, scores],而因为某种原因,需要给每个同学都加上5 score,我们知道,如果[4, 32, 8] + [4, 32, 8]是可以直接相加的,但是[4, 32, 8] + [5.0]就没法进行,复杂的方法:就得需要 .unsqueeze(0).unsqueeze(0)插入维度,得到[1,1,1],然后通过expend扩展为[4, 32, 8],此外,如果用repeat还有一个内存消耗的问题,比如5.0分占一个字节,那么通过repeat扩展为[4,32,8]就1024B,也就是内存扩大了1000倍,而用Broadcasting能够自动扩展且无内存消耗。
PyTorch入门实战教程笔记(六):基础张量操作3_第3张图片

合并与分割:

  • cat:合并
  • stack
  • split
  • chunk
    cat:
      cat(),一共有两个参数,一个list,list包含了所有需要统计的Tensor,一个dim,决定了我们在哪一个维度上进行合并。比如说现在有两个老师,一个负责1-4班,一个负责5-9班,那么想把他们两个班的学生合并一下,可以这样操作:
      PyTorch入门实战教程笔记(六):基础张量操作3_第4张图片
      再比如,在神经网络中要级联数据,要注意,cat()需要dim是一样的,要cat的dim可以不一样,但是其余的一定要一样,要不需要进行零填充。那就可以进行如下操作:
    PyTorch入门实战教程笔记(六):基础张量操作3_第5张图片
      对于具体的图像处理,四个维度:Batchsize、channel、H、W,始终要记得一个原则,就是对应的dim不一致,那只能在这个dim上合并,而不能在其他上面合并,比如[4,3,32,32]和 [5,3,32,32]在第‘0’个序列号上合并,可以得到9张图片。[4,3,32,32]和[4,1,32,32]在第‘1’个序列号上合并,比如RGB和D(T),即彩色图像和深度或者红外图像合并。[4,3,16,32]和[4,3,16,32]在第‘2’个序列号上合并,可以将图像的行拼接起来。如下图代码操作:
    PyTorch入门实战教程笔记(六):基础张量操作3_第6张图片
    Stack:create new dim
      假设现在有a = torch.rand[32,8]和b = torch.rand[32,8],那么用stack在‘0’序列上合并,就会生成size为[2,32,8],当序列为‘0’时,代表a,当序列为‘1’时,代表b。就比如说有两个班,每班32个学生,每个学生有8门成绩,如果用cat就成[64,8],显然是不对的,没有区分开两个班级,但是用stack就可以在创建一个班级的维度。并且在使用stack之前,所有维度必须一致。
      PyTorch入门实战教程笔记(六):基础张量操作3_第7张图片
    Split:
      Split主要有两个参数,第二个按照哪个dim拆分,第一个参数有两种,①指定的一个数比如x,假设要拆分的维度有n个数据,那么拆分结果就是一组有n/x(前提是整数)个数据。②给定一个列表,假设要拆分的维度的数据为6个,给定的列表为[1,2,3],那拆分结果为1个数据一组,2个数据一组,3个数据一组。如下:
    PyTorch入门实战教程笔记(六):基础张量操作3_第8张图片
    Chunk:chunk其实与split类似,只不过第一个参数指的是每一组拆分的数据的个数。

你可能感兴趣的:(PyTorch实战学习笔记)