减少卷积神经网络中的滤波器尺寸

时间:2017-04-13 02:19:18

标签: neural-network conv-neural-network convolution

我正在阅读Szegedy等的初始论文:https://arxiv.org/abs/1512.00567 并且我无法通过用2层3x3过滤器替换单个5x5过滤器来理解它们如何减少计算量(第3.1节)。

enter image description here

特别是这段话:

  

如果我们在没有重复使用计算的情况下天真地滑动网络   在相邻的网格图块之间,我们会增加计算量   成本。滑动这个网络可以用两个3x3卷积表示   重复使用相邻图块之间激活的图层。

我不明白我们如何重复使用这些激活措施。

2 个答案:

答案 0 :(得分:3)

首先,作者说明了这一点:

  

这样,我们   最终用网(9 + 9)/   计算减少25倍,结果   通过这种因子分解,相对增益为28%。

他是对的:对于5x5过滤器,你必须使用25(5*5)个人权重。对于两个3x3过滤器,您必须使用9 + 9(3*3 + 3*3)个别权重。 因此使用两个3x3过滤器需要更少的参数。但是,你说得对,这并不意味着它需要更少的计算:乍一看,使用两个3x3过滤器需要更多的操作。

让我们比较给定n*n输入的两个选项的操作量。演练:

  1. 计算给定输入((n - filtersize + 1)^2)上5x5过滤器的输出尺寸及其相应的操作
  2. 计算第一个3x3过滤器的输出尺寸(与上面相同的公式)及其相应的操作
  3. 计算第二个3x3过滤器的输出尺寸,以及相应的操作
  4. 让我们从5x5输入开始:

    1. (5 - 5 + 1)^2 = 1x1. So 1*1*25 operations = 25 operations
    2. (5 - 3 + 1)^2 = 3x3. So 3*3*9  operations = 81 operations
    3. (3 - 3 + 1)^2 = 1x1. So 1*1*9  operations = 9  operations
    So 25 vs 90 operations. Using a single 5x5 filter is best for a 5x5 input.
    

    接下来,6x6输入:

    1. (6 - 5 + 1)^2 = 2x2. So 2*2*25 operations = 100 operations
    2. (6 - 3 + 1)^2 = 4x4. So 4*4*9  operations = 144 operations
    3. (4 - 3 + 1)^2 = 2x2. So 2*2*9  operations = 36  operations
    So 100 vs 180 operations. Using a single 5x5 filter is best for a 6x6 input.
    

    让我们先前跳,8x8输入:

    1. (8 - 5 + 1)^2 = 4x4. So 4*4*25 operations = 400 operations
    2. (8 - 3 + 1)^2 = 6x6. So 6*6*9  operations = 324 operations
    3. (4 - 3 + 1)^2 = 4x4. So 4*4*9  operations = 144 operations
    So 400 vs 468 operations. Using a single 5x5 filter is best for a 8x8 input.
    

    注意模式?如果输入大小为n*n,则5x5过滤器的操作具有以下公式:

    (n - 4)*(n - 4) * 25
    

    对于3x3过滤器:

    (n - 2)*(n - 2) * 9 + (n - 4) * (n - 4) * 9
    

    让我们绘制这些:

    enter image description here

    它们似乎相交!正如您可以从上图中看到的那样,n=10及之后的两个3x3过滤器的操作次数似乎更少!

    结论:n=10之后使用两个3x3过滤器似乎很有效。此外,无论n如何,与单个5x5滤波器相比,需要针对两个3x3滤波器调整较少的参数。

    这篇文章有点奇怪,它让人感觉就像使用两个3x3过滤器而不是5x5过滤器'显而易见'出于某种原因:

      

    此设置明确通过共享减少参数计数   相邻瓷砖之间的重量。

         

    看起来很自然   再次利用翻译不变性并完全替换   通过两层卷积架构连接组件

         

    如果我们 naivly 幻灯片

答案 1 :(得分:1)

我也一直在解决这种混乱,似乎每次我都需要重新审视初始论文。

比较的正确设置是考虑形状为5x5的玩具示例输入图像。要使用5x5卷积生成5x5输出图像,您需要在顶部,底部和侧面填充2个额外填充像素的原始图像,然后继续进行常规的5x5卷积。卷积滤波器有25个权重参数,输出的每个像素都需要25个输入项的加权和。

现在,我们将完成两个阶段,而不是5x5过滤器。首先,我们将在顶部,底部和侧面用1个额外的像素填充原始图像,使其在每个点都符合标准的3x3卷积。

由于填充,这产生了一个中间图像,与输入相同的形状,但每个像素是3x3卷积的结果(因此每个像素命令9个项目的加权和)。

现在我们将再次重复这一步骤,进行最终阶段3x3卷积,从我们从第一个3x3卷积的中间图像开始。再次,我们在顶部,底部和侧面填充1个像素,输出的每个项目通过9个输入项的加权和来实现。

您在问题中提供的图表演示了如何允许聚合5x5卷积的相同跨度空间信息,但只是通过两个3x3卷积的两个加权和的不同集合计算得出。需要明确的是,计算结果并不相同,因为系数的两个9-d滤波器不必学习与25-d系数滤波器相同。它们可能具有不同的权重,但它们可以按原始图像的顺序跨越5x5卷积的相同距离。

最后,我们可以看到5x5情况下输出的每个单元都需要25个乘法加法运算。顺序3x3情况下的最终输出的每个单位需要先加9次乘法,然后将第一个3x3卷积的单位加上9乘以相加,以得到最终输出的单位。

关于“激活共享”的具体注释是指您只计算一次中间3x3卷积的值。你为这些单位花费了9个操作,但是一旦创建它们,你只需花费9个以上的操作来获得最终的输出单元格。您不会重复为最终输出的每个单元反复创建第一个3x3卷积的工作。

这就是为什么不计算每个输出单元需要81次操作的原因。当你碰到最终 3x3卷积输出的下一个(i,j)位置时,你正在重新使用中间 3x3卷积的一堆像素,所以你每次只做9次操作才能达到最终输出。

5x5输入的5x5填充卷积的操作数为25 * 25.

第一个3x3填充卷积的操作数是25 * 9,从那里你添加另一个填充的3x3卷积的成本,所以整体它变成25 * 9 + 25 * 9 = 25 * 18。

这是他们如何得到(25 * 25)/(25 * 18)= 25/18的比率。

实际上,这也与参数总数的减少相同。

我认为关键是原始图表(来自论文和你的问题)表明你要首先支付标准的3x3卷积成本来创建整个原始5x5的中间像素集是非常糟糕的工作输入,包括填充。 然后你会在中间结果上运行第二个3x3卷积(这是他们重新使用激活的意思)。

图片看起来像是单独的,对于每个最终输出像素,您可以在整个3x3中间层的所有正确位置周围滑动原始3x3卷积,每次计算9-ops加权和(总共81个操作) ,然后计算最终的9-ops加权和以获得单个输出像素。然后回到原点,将褶皱撞到1点,然后重复。但这不正确,并且不会“重复使用”中间卷积层,而是会为最终输出层的每个单元单独重新计算它。

总的来说,我同意这是非常重要的,很难想到。这篇论文真的掩盖了它,并且已经在读者的脑海中占据了很多背景。