当前位置:   article > 正文

pytorch的基础学习1_pytorch concatenate

pytorch concatenate

1、range和arange

相同点:torch.range(1,10)和 torch.arange(10)都产生了一个1维的数组,类型是 <class ‘torch.Tensor’>

不同点:range产生的长度是10-1+1=10 是由1到10组成的1维张量,类型float
             而arange产生的是10-1=9 由1-9组成的1维度张量 ,类型int,示例如下:

输入:

  1. import torch
  2. a = torch.range(1,10)
  3. print("a:",a,a.shape)
  4. b = torch.arange(1,10)
  5. print("b:",b,b.shape)

输出:

a: tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]) torch.Size([10])
b: tensor([1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.Size([9])

需要注意的是: range(start=起始数,end=终止数),起始数不可缺少。arange可以,默认0,其输出就是:tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.Size([10]),例如:

输入:

  1. z1 = torch.range(5,10)
  2. print("z1",z1,z1.shape)
  3. z = torch.arange(10)
  4. print("z",z,z.shape)

输出: 

z1 tensor([ 5.,  6.,  7.,  8.,  9., 10.]) torch.Size([6])
z tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.Size([10])

二、repeat复制张量 

输入:

  1. z1 = torch.arange(10)
  2. print("z1",z1,z1.shape)
  3. z2 = torch.arange(10).repeat(10,1)
  4. print("z2",z2,z2.shape)

输出:

z1 tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.Size([10])
z2 tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) torch.Size([10, 10])

三、view:改变张量形状 

View的机制顺序地拿数据填充形状,注意,定义的形状所需要的数据的数量必须=能提供的数据数量
比如:[10x10] 的张量可以.view(1,1,10,10) 也可以.view(5,20) 但是不可以.view(10,11) ,一旦数据数量不同,就会报数据无效的错误
代码示例

输入:

  1. z1 = torch.arange(10)
  2. print("z1",z1,z1.shape)
  3. z2 = torch.arange(10).repeat(10,1)
  4. print("z2",z2,z2.shape)
  5. z3 = torch.arange(10).repeat(10,1).view(1,1,10,10)
  6. print("z3",z3,z3.shape)

输出:

z1 tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.Size([10])
z2 tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) torch.Size([10, 10])
z3 tensor([[[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]]]) torch.Size([1, 1, 10, 10])
 

view()+ repeat()

输入: 

  1. z = torch.arange(10).view(1,10).repeat(10,2)
  2. print("z",z,z.shape)

 输出:

z tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) torch.Size([10, 20])
 

 四、Concat和add操作

  一般情况下,feature maps的结合有两种方法,一种是元素对应相加,简称add,另一种就是把特征图堆到一起来,简称concatenate。

Concat:张量拼接,会扩充两个张量的维度,增加通道数
add:张量相加,张量直接相加,不会扩充维度。


假设feature map 1 的维度为B1∗ C1 ∗ H1 ∗ W1
feature map 2 的维度为B2 ∗ C2 ∗ H2 ∗ W2 ​

1)在add情况下,就是两个四维矩阵的按元素相加,那么这时候我们需要两个矩阵维度全部相等。并且相加后矩阵维度不变。
例如26 * 26 * 256和26 * 26 * 256相加,结果还是26 * 26 * 256

2)在concatenate情况下,我们把两个矩阵在某个维度叠加起来,这要求在这个连接的维度上可以不同,但是在其他维度上必须相等。叠加后,某个维度会增加,是两个矩阵上的某个维度相加。比如,我们在Channel这个维度上连接两个矩阵,那么新的矩阵维度是B2 ∗ ( C2 + C1 )∗ H2 ∗ W2
例如26 * 26 * 256和26 * 26 * 512相加,结果是26 * 26 * 768

作用区别:

concat作用
concat是通道数的增加,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加;横向或纵向空间上的叠加.
add作用
add为简单的像素叠加,是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。
 

concate就是将原始特征直接拼接,让网络去学习,应该如何融合特征,这个过程中信息不会损失。
add其实是concate的一种特殊情况。但是concate带来的计算量较大,在明确原始特征的关系可以使用add操作融合的话,使用add操作可以节省计算代价,用add来替代concat,这样更节省参数和计算量(concat是add的2倍)。

 

concate:按照行进行合并,输入:

  1. a = np.array([[1, 2], [3, 4]])
  2. b = np.array([[5, 6]])
  3. np.concatenate((a, b), axis=0) # 这里的axis=0的表示按照行进行合并

输出: 

array([[1, 2],
       [3, 4],
       [5, 6]])

 

concate:按照列进行合并

输入:

  1. a = np.array([[1, 2], [3, 4]])
  2. b = np.array([[5, 6]])
  3. np.concatenate((a, b.T), axis=1) # 这里的axis=1的表示按照列进行合并

 输出:

 array([[1, 2, 5],
       [3, 4, 6]])

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/929651
推荐阅读
相关标签
  

闽ICP备14008679号