最近关注了下大模型,整理一下,备忘。

1. ResNet,原始caffe版本,结构如下:

    基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

InsightFace对Resnet的实现有点不同,首先是默认会把第一个7×7的卷积换成3×3,并去掉pool操作(人脸识别输入分辨率112×112比ImageNet小),另外当层数大于101时才使用先1×1再3×3再1×1的bottleneck结构,resnet50里面还是2个3×3卷积,这样简单看的话,同样是50层的resnet,Insightface的版本相当于用16个3×3卷积换之前的1×1,参数量是变多的。后来看ZhaoJ实现的pytorch版本才注意到这个差别,具体如下:

    基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

    在ZhaoJ代码里这个结构名字是IR-SE,SE好理解,就是加了Squeeze and Exciation Block,起初以为是基于Inception-Resnet backbone,仔细分析其实是每个bottleneck里的差距,所以IR是指Insightface-Resnet或者是Improved Resnet?

 2. ResNeXt,原始版本貌似是lua的,框架不变,修改bottleneck内部,论文切图:

    基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

    基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

就是把ResNet拆成多个组卷积,论文认为像VGG、ResNet这种简单卷积模块的堆叠除了设计/实现简单方便之外,还可以减少对某一特定数据集过拟合的问题;而inception这种复杂的手工设计更容易在有限的计算量下达到更高的准确率,于是将ResNet里bottleneck中的3×3卷积改为分组卷积,以兼收两者之长。

3. DenseNet,特点是把ResNet里的特征图对应通道相加改成通道拼接,这会导致网络越来约宽,因此每个DenseBlock之间插一个TransitionBlock(1×1卷积)做降维,torchvision有模型Insightface里也有实现:

基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

展开来大概长这样:

基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

 4. DPN,Dual Path Network,双路指的是Resnet+Desenet,参考Insightface模型描述:

基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

觉得可以理解成利用ResNet和DenseNet的结构相似性,让两者共用中间的3组卷积。原文还将ResneXt里的分组卷积应用到其中的3×3上,买一得三。。。

5. SENet,原始实现在这里,是caffe的,所以论文里的图合并时直接用的scale,是一个可以定制化地嵌入到各种网络中的小模块,Squeeze and Exciation Block。主要是想弥补卷积神经网络感受野比较小的话会太过关注局部信息的问题,Sequeeze部分将每个特征图进行全局池化,Excitiation部分引入非线性,操作就是获得每个通道的权重乘回去,结构就如原文所画,展开来大概像这样:

   基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

看论文里的图总有种错觉以为SE Block和bottleneck是并联的,但其实是串联的,bottleneck结构没有变,SE Block可以灵活地插在它的前面或后面。

DenseNet占显存已经被大家诟病很久了,关于速度这里说得比较详细,直接偷图了,侵删。确实加了SE以后训练速度会降,但是之前用caffe,端上的模型mergeBN只能带来比较小的收益,加速没有很明显。

基础网络-ResNet/ResNeXt/DenseNet/DPN/SENet-风君雪科技博客

其他参考:

卷积网络的进化史   大概参考下就好,不可深究….

模型结构可视化神器  netron(git)   好东东,众里寻他千百度。