MobileNetV1
使用dw + pw代替原来的普通卷积 理论计算量是普通卷积的1/8-1/9
MobileNetV2
V1中的DW卷积容易训练废,提出倒残差结构 1*1先升维 + dw + pw降维 relu6用在高维度损失少 最后降维之后线性激活
MobileNetv3
倒残差结构更新
1*1升维 + dw + se通道注意力 + pw降维
激活函数 hard_sigmoid = relu6(x + 3)/6 hard_swish = x * hard_sigmoid
shuffleNetv2
输入channel split 分为两支 最后不用+ 用concat
Channel shuffle: group卷积是channel分为几组 每组分别组卷积操作 最后拼接 组之间没有信息交互 channel shuffle将不同组的feature重组 新分配的一个组中是由多个组的subgroup组成的
MobileViT(cnn + transformer)
mbv2: (pw, bn, relu6) -> (dw, bn, relu6) -> (pw,bn,) 反残差 先升再降
mbvit: 状态1(conv3*3, conv1*1) -> unfold -> transformer * n -> fold -> 状态2(conv1*1 还原c) 与 状态1 concat之后通道翻倍 其他不变 再通过conv3*3 将通道维度降为状态1
unfold: 假如patch的window是2*2 那么相同位置形成的序列就有4个 然后将这些序列喂入transformer
fold: transformer输出结果 还原至unfold之前的shape
transformer: norm -> msa -> shortcut -> norm -> mlp -> shortcunt 划分为patches之后 位置相同点才会做msa 原计算量/4
swin-vit
1 patch-merging: 2*2相邻像素划为一个patch 每个patch相同位置拼在一起得到4个feature_map,深度上拼接 经过layer-norm z再再深度上降维 得到(b, c, h, w) -> (b, 4c, h/2, w/2) -> (b, 2c, h/2, w/2)
2 w-msa, 仅在7*7或者12*12的窗口内做msa 普通msa计算量:4hwcc + 2hwhwc w-msa计算量4hwcc + 2mmhwc window_size=w 小于等于h,w 所以计算量少
3 sw-msa: 与w-msa结构交替使用,窗口朝右下角偏移了m//2个像素 分割的份数就多了 将分散的块通过上移动倒下 左移动到右的方式,暂时拼成w-msa类似的情况,做atten时,用mask把拼多多的区域分别计算,最后再还原回原图下移动到上 右移动到左
4 相对位置偏执 att = softmax(Q@K.T/sqrt(d) + bias) @ V
1 获取绝对位置索引
2 每个像素为起始,求相对于它的相对位置索引(该点的绝对位置索引 - 其他对应位置绝对位置索引)
3 展平,每一行对应2中的信息
4 每个相对位置索引都加m-1 m是窗口大小 这一步确保所有索引>=0
5 所有行索引 * (2m - 1)
6 每个位置的索引到(2m - 1)*(2m - 1)的table根据索引直接拿bias的值就行了