《南溪的目标检测学习笔记》——常见算子的学习笔记

Basic

Optimality Theory

在最优化理论中,我们可以将算子看作是向量值函数映射,
在这里插入图片描述
举例来说,这里:

  • 输入张量 X \mathcal{X} X看作是向量 x ∈ R n \mathbf{x} \in \mathbb{R}^n xRn
  • 输出张量 Y \mathcal{Y} Y看作是向量 y ∈ R m \mathbf{y} \in \mathbb{R}^m yRm
  • 张量 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=XM

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 sampleFPSBS
Focuswait…wait…
Nearestwait…wait…
Bilinearwait…wait…
Bicubicwait…wait…
MaxPoolwait…wait…
AdaptiveMaxPoolwait…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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值