赞
踩
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,示例如下:
输入:
- import torch
-
- a = torch.range(1,10)
- print("a:",a,a.shape)
-
- b = torch.arange(1,10)
- 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]),例如:
输入:
- z1 = torch.range(5,10)
- print("z1",z1,z1.shape)
-
- z = torch.arange(10)
- 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复制张量
输入:
- z1 = torch.arange(10)
- print("z1",z1,z1.shape)
- z2 = torch.arange(10).repeat(10,1)
- 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) ,一旦数据数量不同,就会报数据无效的错误
代码示例
输入:
- z1 = torch.arange(10)
- print("z1",z1,z1.shape)
- z2 = torch.arange(10).repeat(10,1)
- print("z2",z2,z2.shape)
- z3 = torch.arange(10).repeat(10,1).view(1,1,10,10)
- 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()
输入:
- z = torch.arange(10).view(1,10).repeat(10,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:按照行进行合并,输入:
- a = np.array([[1, 2], [3, 4]])
- b = np.array([[5, 6]])
- np.concatenate((a, b), axis=0) # 这里的axis=0的表示按照行进行合并
输出:
array([[1, 2],
[3, 4],
[5, 6]])
concate:按照列进行合并
输入:
- a = np.array([[1, 2], [3, 4]])
- b = np.array([[5, 6]])
- np.concatenate((a, b.T), axis=1) # 这里的axis=1的表示按照列进行合并
输出:
array([[1, 2, 5],
[3, 4, 6]])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。