Group Conv

Depthwise

# Involution的设计原则

Involution的设计原则就是颠倒常规卷积核的两个设计原则，即从空间无关性，频域特殊性转变成空间特殊性频域无关性

，让他根据输入的张量，输出一个跟特征图长宽相关的张量，再把它作为卷积核。

...
reduction_ratio = 4
self.group_channels = 16
self.groups = self.channels // self.group_channels
self.conv1 = ConvModule(
in_channels=channels,
out_channels=channels // reduction_ratio,
kernel_size=1,
conv_cfg=None,
norm_cfg=dict(type='BN'),
act_cfg=dict(type='ReLU'))
self.conv2 = ConvModule(
in_channels=channels // reduction_ratio,
out_channels=kernel_size**2 * self.groups,
kernel_size=1,
stride=1,
conv_cfg=None,
norm_cfg=None,
act_cfg=None)
def forward(self, x):
weight = self.conv2(self.conv1(x if self.stride == 1 else self.avgpool(x)))
...

Involution

import torch.nn as nn
from mmcv.cnn import ConvModule

class involution(nn.Module):

def __init__(self,
channels,
kernel_size,
stride):
super(involution, self).__init__()
self.kernel_size = kernel_size
self.stride = stride
self.channels = channels
reduction_ratio = 4
self.group_channels = 16
self.groups = self.channels // self.group_channels
self.conv1 = ConvModule(
in_channels=channels,
out_channels=channels // reduction_ratio, # 通过reduction_ratio控制参数量
kernel_size=1,
conv_cfg=None,
norm_cfg=dict(type='BN'),
act_cfg=dict(type='ReLU'))
self.conv2 = ConvModule(
in_channels=channels // reduction_ratio,
out_channels=kernel_size**2 * self.groups,
kernel_size=1,
stride=1,
conv_cfg=None,
norm_cfg=None,
act_cfg=None)
if stride > 1:
# 如果步长大于1，则加入一个平均池化
self.avgpool = nn.AvgPool2d(stride, stride)
self.unfold = nn.Unfold(kernel_size, 1, (kernel_size-1)//2, stride)

def forward(self, x):
weight = self.conv2(self.conv1(x if self.stride == 1 else self.avgpool(x))) # 得到involution所需权重
b, c, h, w = weight.shape
weight = weight.view(b, self.groups, self.kernel_size**2, h, w).unsqueeze(2) # 将权重reshape成 (B, Groups, 1, kernelsize*kernelsize, h, w)
out = self.unfold(x).view(b, self.groups, self.group_channels, self.kernel_size**2, h, w) # 将输入reshape
out = (weight * out).sum(dim=3).view(b, self.channels, h, w) # 求和，reshape回NCHW形式
return out

# 总结

0 条评论

• ### 【CNN结构设计】无痛的涨点技巧：ACNet

不知道你是否发现了，CNN的结构创新在这两年已经变得相对很少了，同时要做出有影响力并且Solid的工作也变得越来越难，最近CNN结构方面的创新主要包含两个方面：

• ### 卷积神经网络学习路线（十七） | Google CVPR 2017 MobileNet V1

这是卷积神经网络的第十七篇文章，Google 2017年发表的MobileNet V1，其核心思想就是提出了深度可分离卷积来代替标准卷积，将标准卷积分成Dept...

• ### 基于Pytorch的动态卷积复现

【GaintPandaCV导语】 最近动态卷积开始有人进行了研究，也有不少的论文发表（动态卷积论文合集https://github.com/kaijieshi7...

• ### 卷积神经网络学习路线（十七） | Google CVPR 2017 MobileNet V1

这是卷积神经网络的第十七篇文章，Google 2017年发表的MobileNet V1，其核心思想就是提出了深度可分离卷积来代替标准卷积，将标准卷积分成Dept...

• ### 五分钟了解：端侧神经网络GhostNet（2019）

GhostNet是华为诺亚方舟实验室提出的一个新型神经网络结构。目的类似Google提出的MobileNet，都是为了硬件、移动端设计的轻小网络，但是效果相比M...

• ### 抛开卷积，多头自注意力能够表达任何卷积操作

近年来很多研究将NLP中的attention机制融入到视觉的研究中，得到很不错的结果。这篇发表于 ICLR 2020 的论文侧重于从理论和实验去验证self-a...