GithubHelp home page GithubHelp logo

Comments (10)

YeLL0W avatar YeLL0W commented on July 30, 2024 3

对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,保证输出近似不变

from yolov3-channel-and-layer-pruning.

tanluren avatar tanluren commented on July 30, 2024

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

from yolov3-channel-and-layer-pruning.

zihaozhang9 avatar zihaozhang9 commented on July 30, 2024

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

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

from yolov3-channel-and-layer-pruning.

mozpp avatar mozpp commented on July 30, 2024

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

for next_idx in next_idx_list:
next_conv = pruned_model.module_list[next_idx][0]
conv_sum = next_conv.weight.data.sum(dim=(2, 3))
offset = conv_sum.matmul(activation.reshape(-1, 1)).reshape(-1)
if next_idx in CBL_idx:
next_bn = pruned_model.module_list[next_idx][1]
next_bn.running_mean.data.sub_(offset)
else:
next_conv.bias.data.add_(offset)

请问你指的是这里吗?

from yolov3-channel-and-layer-pruning.

zihaozhang9 avatar zihaozhang9 commented on July 30, 2024

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

for next_idx in next_idx_list:
next_conv = pruned_model.module_list[next_idx][0]
conv_sum = next_conv.weight.data.sum(dim=(2, 3))
offset = conv_sum.matmul(activation.reshape(-1, 1)).reshape(-1)
if next_idx in CBL_idx:
next_bn = pruned_model.module_list[next_idx][1]
next_bn.running_mean.data.sub_(offset)
else:
next_conv.bias.data.add_(offset)

请问你指的是这里吗?

对的,是这里

from yolov3-channel-and-layer-pruning.

zhaoxin111 avatar zhaoxin111 commented on July 30, 2024

对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里去

from yolov3-channel-and-layer-pruning.

linklist2 avatar linklist2 commented on July 30, 2024

对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呢?

from yolov3-channel-and-layer-pruning.

linklist2 avatar linklist2 commented on July 30, 2024

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

from yolov3-channel-and-layer-pruning.

linklist2 avatar linklist2 commented on July 30, 2024

对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,上述推理就不成立了....

from yolov3-channel-and-layer-pruning.

zihaozhang9 avatar zihaozhang9 commented on July 30, 2024

from yolov3-channel-and-layer-pruning.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.