比如yolov5,模型剪枝后保存的权重为什么会变小呢,剪枝掉的权重不应该保存成0么,0也占用内存啊,难道直接删掉么?
在yolov5源码解析(10)--损失计算与anchor_扫地僧1234的博客-CSDN博客
的末尾抛出了一个问题,具体可以去看一下那一期的内容(强烈建议去看一下!),简单的说,就是标注的物体a、b有重叠,在训练的时候有可能同一个格子即负责预测物体a,也负责预测物体b。你可能会说这不是很正常吗。
但是如果物体a、b的尺度相差比较大,比如物体a大,物体b小,而物体a、b的中心点比较接近,此时也会发生这种情况,比如下图:
耳塞基本在平板的中间,这样它们的中心点就能归到同一个格子上,那么这个格子就有可能会既负责预测平板,也负责预测耳塞。
注意:
(1)这里说的是有可能,因为除了中心点与格子的关系之外,物体的宽高与anchor的宽高比例不能超过4(超参anchor_t)
(2)也不一定中心点非得落在这个格子, 比如中心点落在格子c里,位置偏左上,那么格子c的左侧格子,上侧格子都会负责预测该物体。
如下图,详见yolov5源码解析(10)--损失计算与anchor_扫地僧1234的博客-CSDN博客
那么如果一个格子既要预测平板,又要预测耳塞会有什么问题呢:
(1)显然在非多标签分类的情况下,这个格子不管是预测平板还是预测耳塞的分类得分都会被抑制,所以两个得分都会比较低,sigmoid之后会接近0.5。这好像问题不是太大,0.5咱就不要它呗,咱要得分高的。
(2)这个格子还得预测物体的宽高啊,平板和耳塞的尺寸差距比较大,一会儿用平板的宽高真值给他计算损失,一会儿用耳塞的宽高直值给他计算损失,那最终得出的宽高可能不靠谱。
(3)问题(1)里面说0.5的就不要,但是如果我们训练出来的东西里面,有些东西的效果不太好,置信度比较低,跟0.5很接近,而我们又想要预测出这些东西,那置信度就有点难设了。
对于yolov5模型剪
你说得对,剪枝后模型权重文件会变小的原因是:
在模型剪枝过程中,通常会将一些权重值较小的神经元或连接删除,这些被删除的权重值通常会被设置为0。所以,剪枝后的模型权重矩阵中会存在大量的0值,这些0值可以被有效地压缩,从而减小模型的大小。
在保存剪枝后的模型权重时,通常会使用稀疏矩阵的方式来存储,只保存非零权重值及其对应的索引,而将0值直接舍弃。这样可以大大减小模型的大小,同时也不会对模型的精度造成影响。
因此,剪枝后保存的权重会变小,这是正常的现象。