本文主要是介绍《南溪的目标检测学习笔记》——常见算子的学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Basic
Optimality Theory
在最优化理论中,我们可以将算子看作是向量值函数映射,
举例来说,这里:
- 输入张量 X \mathcal{X} X看作是向量 x ∈ R n \mathbf{x} \in \mathbb{R}^n x∈Rn,
- 输出张量 Y \mathcal{Y} Y看作是向量 y ∈ R m \mathbf{y} \in \mathbb{R}^m y∈Rm;
- 张量 X \mathcal{X} X的维度平铺之后可以看作为向量,即: n = N C H W n=NCHW n=NCHW
1 Convolution
1.2 乘性注意力卷积: Y = X ⋅ M \mathcal{Y} = \mathcal{X} \cdot\mathcal{M} Y=X⋅M
CCA Block: BSNR.CCALayer
这里我们使用BSNR论文中的图来学习 CCA Block
在CCA生产注意力时,有一个很有趣的模块Contrast,它的实现是这样的 [Contrast | stdv_channels()]
def stdv_channels(F):assert (F.dim() == 4)F_mean = mean_channels(F)F_variance = (F - F_mean).pow(2).sum(3, keepdim=True).sum(2, keepdim=True) / (F.size(2) * F.size(3))return F_variance.pow(0.5)contrast = stdv_channels
相当于InstanceNorm的前半部分的分布归一化;
2 Activation
2.2 Softmax:非线性归一化
数学公式:
Softmax ( x i ) = exp ( x i ) ∑ j exp ( x j ) \operatorname{Softmax}\left(x_i\right)=\frac{\exp \left(x_i\right)}{\sum_j \exp \left(x_j\right)} Softmax(xi)=∑jexp(xj)exp(xi)
3 Sampling
4.1 Down Sampling
Down sample | FPS | BS |
---|---|---|
Focus | wait… | wait… |
Nearest | wait… | wait… |
Bilinear | wait… | wait… |
Bicubic | wait… | wait… |
MaxPool | wait… | wait… |
AdaptiveMaxPool | wait… | wait… |
2.2 Up Sampling
Conv+PixelShuffle: Learnable sub-pixel layer
第一次看到这个上采样算子是在RFDN模型中,其代码为: [code]
def pixelshuffle_block(in_channels, out_channels, upscale_factor=2, kernel_size=3, stride=1):conv = conv_layer(in_channels, out_channels * (upscale_factor ** 2), kernel_size, stride)pixel_shuffle = nn.PixelShuffle(upscale_factor)return sequential(conv, pixel_shuffle)
3 Information Exchange
3.1 ChannelShuffle: A good competitor of 1*1 convolutiuon [SOURCE]
ChannelShuffle是ShuffleNetV2中十分经典的算子,从效果上看,其主要作用是进行了通道间的信息交换,这一点跟 1*1-Conv 的作用十分类似;
在ShuffleNetV2
中,使用ChannelShuffle的语句是:out = channel_shuffle(out, 2)
,届在cat
操作后面实现res特征与conv特征的信息交换;
4 Pooling
关于池化层的基本实现,请参考《22 池化层【动手学深度学习v2】》;
5 Experiment
Hardware for Test
GPU: 2080Ti (Turing)
Input size
我们需要对算子占用的显存大小进行测试,在测试时需要模拟输入的特征张量,对于输入特征图的大小,这里我们使用YOLOv5主干部分计算量密集(即使用了多个C3
模块)stages的输出特征图尺寸取平均值:
nums_C3s = (3,6,9,3)
(160*nums_C3s[0] + 80*nums_C3s[1] + 40*nums_C3s[2] + 20*nums_C3s[3])/sum(nums_C3s)
>>> 65.71428571428571
这里我们取最近的8的倍数,也就是128;
这篇关于《南溪的目标检测学习笔记》——常见算子的学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!