YOLO v4 糅合方法记录
YOLO v4 糅合方法记录
记录YOLO v4中使用的各种网络技术,用最简短的话(就是懒)进行总结,并记录思考。
ResNeXt
论文地址:
https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1611.05431
没错,很久不看论文,连这种基础的网络都不知道了。
但看最后的实现其实非常的简单,就是在以前的卷积方式上,增加了分组,pytorch上就直接加一个参数而已。但其推导过程很有意思,说明inception差不多就是group conv,推理过程如下图演示:
不过,它说这三个过程完全等价,但看实现代码的时候,发现c每一次卷积之后都接一个BN,而这个BN是所有通道一起的,如果a、b的BN是分开的,那么他们之间还是有不同的。
还有一句挺重要的话
CSPNet
论文地址:
https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1911.11929.pdf
只看它的结构图,完全不能get到这个算法哪里牛逼了,就是把第一层劈成两半了…
该网络提出的优点有二:
- 减少计算量
- 降低梯度冗余,提高检测效果
为啥能减少计算量呢,因为基于DenseNet特征图深度的增长方式:
这里第一层的深度远大于总的层数和新增的卷积深度,因此可以第一次减半,可以降低大量计算,还能保持DenseNet的结构,灰常的机智了。
但第二点减少梯度冗余确实还不理解,其解释过程如下,望各路大神指点一二:
上图描述的是DenseNet的前项和反向计算流程,符号解释在文中。
问题一:这个反向更新权重的公式是不是有点奇怪啊,如果loss对求偏导,应该是 忽略一下转至问题,如果这个推导没错的话,那么更新时,为什么会有其他层的梯度参与进来呢?我现在只能说,其它层梯度和k层梯度之间是有关系的,可以互相表示,作者这里只是把k层梯度展开,来说明DenseNet在反向时重复利用了很多梯度信息,造成了所谓的“梯度冗余”。
但这样就没法解释下面的公式:
T层的梯度应该也和其他层的梯度有关系,为什么这里就不造成梯度冗余呢?希望有明白的同学能解答一下。
另外,文章说减少梯度冗余可以提高效果,但DenseNet就是通过concat各层特征的方式来兼顾不同层的特征,还能增加反向传播的路径防止梯度消失,也就是DenseNet本就是奔着冗余去的。给一个解释的话可能是DenseNet有点太冗余了,所以CSP能降低一些冗余,反而取得更好的效果。不知道这样理解对不对。