yolov3-channel-and-layer-pruning icon indicating copy to clipboard operation
yolov3-channel-and-layer-pruning copied to clipboard

剪枝时bn层的bias不用mask置零吗?

Open zihaozhang9 opened this issue 4 years ago • 10 comments

为什么这里被注释了

为什么不使用bn_module.bias.data.mul_(mask)

剪枝时bn层的bias不用mask置零吗?

zihaozhang9 avatar Dec 22 '19 13:12 zihaozhang9

这一步只是把bn weight置零了,结构还是原来的,bias的激活值也还没转移,只是先测试下初步效果;bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

tanluren avatar Dec 22 '19 16:12 tanluren

这一步只是把bn weight置零了,结构还是原来的,bias的激活值也还没转移,只是先测试下初步效果;bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

恩是的。我看到了,here。非常感谢

zihaozhang9 avatar Dec 23 '19 03:12 zihaozhang9

这一步只是把bn weight置零了,结构还是原来的,bias的激活值也还没转移,只是先测试下初步效果;bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

https://github.com/tanluren/yolov3-channel-and-layer-pruning/blob/79a94eeb8b55c0158b371424d54effe82da14795/utils/prune_utils.py#L255-L263

请问你指的是这里吗?

mozpp avatar Dec 23 '19 08:12 mozpp

bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

https://github.com/tanluren/yolov3-channel-and-layer-pruning/blob/79a94eeb8b55c0158b371424d54effe82da14795/utils/prune_utils.py#L255-L263

请问你指的是这里吗?

对的,是这里

zihaozhang9 avatar Dec 23 '19 08:12 zihaozhang9

对prune_model_keep_size2和update_activation的理解

block: conv1-bn1-leaky1-conv2-bn2-leaky2

在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。 但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响 为什么说是减少呢? 回顾BN层计算:w*x+b,这儿w即γ,bias即b w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。

prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算 怎么转移? 先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛 好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias 因此,每一层卷积计算可简化一下: (b1w11+b1w12+b1w13+...)->b1sum(kernel),也就是下面offset求取的方式 由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果

3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了 (这一步的前提是conv2的bias为False) 如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

zhaoxin111 avatar Apr 23 '21 09:04 zhaoxin111

对prune_model_keep_size2和update_activation的理解

block: conv1-bn1-leaky1-conv2-bn2-leaky2

在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。 但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响 为什么说是减少呢? 回顾BN层计算:w*x+b,这儿w即γ,bias即b w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。

prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算 怎么转移? 先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛 好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias 因此,每一层卷积计算可简化一下: (b1_w11+b1_w12+b1_w13+...)->b1_sum(kernel),也就是下面offset求取的方式 由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果

3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了 (这一步的前提是conv2的bias为False) 如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

请问第3条该如何理解呢?第一个convolutional的leaky(bias)传递给第二个convolutional后,为什么需要BN的均值减去offset呢?而传递到没有BN的卷积中,需要bias加上offset呢?

linklist2 avatar Nov 15 '21 06:11 linklist2

对prune_model_keep_size2和update_activation的理解 block: conv1-bn1-leaky1-conv2-bn2-leaky2 在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。 但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响 为什么说是减少呢? 回顾BN层计算:w*x+b,这儿w即γ,bias即b w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。 prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算 怎么转移? 先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛 好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias 因此,每一层卷积计算可简化一下: (b1_w11+b1_w12+b1_w13+...)->b1_sum(kernel),也就是下面offset求取的方式 由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果 3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了 (这一步的前提是conv2的bias为False) 如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

请问第3条该如何理解呢?第一个convolutional的leaky(bias)传递给第二个convolutional后,为什么需要BN的均值减去offset呢?而传递到没有BN的卷积中,需要bias加上offset呢?

bn均值减去offset(用k表示)是因为bn输入的x此时也减少了offset, ((x-k)-(mean-k))= x-k 。卷积加上是因为 令k = wk',w(x-k') + b + k = wx + b,保证输出近似不变

YeLL0W avatar Apr 22 '22 15:04 YeLL0W

@YeLL0W 非常感谢,我想我明白了

linklist2 avatar Apr 22 '22 15:04 linklist2

对prune_model_keep_size2和update_activation的理解 block: conv1-bn1-leaky1-conv2-bn2-leaky2 在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。 但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响 为什么说是减少呢? 回顾BN层计算:w*x+b,这儿w即γ,bias即b w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。 prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算 怎么转移? 先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛 好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias 因此,每一层卷积计算可简化一下: (b1_w11+b1_w12+b1_w13+...)->b1_sum(kernel),也就是下面offset求取的方式 由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果 3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了 (这一步的前提是conv2的bias为False) 如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

请问第3条该如何理解呢?第一个convolutional的leaky(bias)传递给第二个convolutional后,为什么需要BN的均值减去offset呢?而传递到没有BN的卷积中,需要bias加上offset呢?

bn均值减去offset(用k表示)是因为bn输入的x此时也减少了offset, ((x-k)-(mean-k))= x-k 。卷积加上是因为 令k = wk',w(x-k') + b + k = wx + b,保证输出近似不变

@YeLL0W 请问若BN层的weight不趋向于0,是否仍旧有办法将该BN的bias移动到下一个BN的running_mean中呢? 因为relu(A+B)不等于relu(A) + relu(B),若BN层的weight不趋向于0,上述推理就不成立了....

linklist2 avatar Apr 23 '22 15:04 linklist2

我已收到您发送的邮件。我会及时查看。

zihaozhang9 avatar Oct 11 '22 08:10 zihaozhang9