YOLO v4 糅合方法记录

YOLO v4 糅合方法记录

记录YOLO v4中使用的各种网络技术,用最简短的话(就是懒)进行总结,并记录思考。

ResNeXt

论文地址:
https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1611.05431
没错,很久不看论文,连这种基础的网络都不知道了。
但看最后的实现其实非常的简单,就是在以前的卷积方式上,增加了分组,pytorch上就直接加一个参数而已。但其推导过程很有意思,说明inception差不多就是group conv,推理过程如下图演示:
YOLO v4 糅合方法记录_第1张图片
不过,它说这三个过程完全等价,但看实现代码的时候,发现c每一次卷积之后都接一个BN,而这个BN是所有通道一起的,如果a、b的BN是分开的,那么他们之间还是有不同的。
还有一句挺重要的话
YOLO v4 糅合方法记录_第2张图片

CSPNet

论文地址:
https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1911.11929.pdf
只看它的结构图,完全不能get到这个算法哪里牛逼了,就是把第一层劈成两半了…
YOLO v4 糅合方法记录_第3张图片
该网络提出的优点有二:

  1. 减少计算量
  2. 降低梯度冗余,提高检测效果
    为啥能减少计算量呢,因为基于DenseNet特征图深度的增长方式:
    在这里插入图片描述
    这里第一层的深度远大于总的层数和新增的卷积深度,因此可以第一次减半,可以降低大量计算,还能保持DenseNet的结构,灰常的机智了。
    但第二点减少梯度冗余确实还不理解,其解释过程如下,望各路大神指点一二:
    YOLO v4 糅合方法记录_第4张图片
    上图描述的是DenseNet的前项和反向计算流程,符号解释在文中。
    问题一:这个反向更新权重的公式是不是有点奇怪啊,如果loss对 w k w_k wk求偏导,应该是 ∂ l o s s ∂ w k = ∂ l o s s ∂ x k ∗ ∂ x k ∂ w k = g k ∗ [ x 0 , x 1 , . . . , x k − 1 ] \frac{\partial loss} {\partial w_k}=\frac{\partial loss}{\partial x_k} *\frac{\partial x_k}{\partial w_k}=g_k*[x_0, x_1, ... , x_{k-1}] wkloss=xklosswkxk=gk[x0,x1,...,xk1] 忽略一下转至问题,如果这个推导没错的话,那么更新 w k w_k wk时,为什么会有其他层的梯度参与进来呢?我现在只能说,其它层梯度和k层梯度之间是有关系的,可以互相表示,作者这里只是把k层梯度展开,来说明DenseNet在反向时重复利用了很多梯度信息,造成了所谓的“梯度冗余”。
    但这样就没法解释下面的公式:
    YOLO v4 糅合方法记录_第5张图片
    T层的梯度应该也和其他层的梯度有关系,为什么这里就不造成梯度冗余呢?希望有明白的同学能解答一下。
    另外,文章说减少梯度冗余可以提高效果,但DenseNet就是通过concat各层特征的方式来兼顾不同层的特征,还能增加反向传播的路径防止梯度消失,也就是DenseNet本就是奔着冗余去的。给一个解释的话可能是DenseNet有点太冗余了,所以CSP能降低一些冗余,反而取得更好的效果。不知道这样理解对不对。

未完待续

你可能感兴趣的:(学习笔记)