Mic*_*lSB 6 convolution neural-network conv-neural-network
我正在阅读Szegedy等人的起始论文:https://arxiv.org/abs/1512.00567 ,我无法理解他们如何通过用2层3x3过滤器替换单个5x5过滤器来减少计算量(部分3.1).
特别是这段经文:
如果我们在不重用相邻网格块之间的计算的情况下天真地滑动网络,我们就会增加计算成本.滑动该网络可以由两个3×3卷积层表示,这两个层重复使用相邻瓦片之间的激活.
我不明白我们如何重用这些激活.
我也一直在解决这种困惑,似乎每次我都需要重新审视 Inception 文件。
比较的正确设置是考虑形状为 5x5 的玩具示例输入图像。要使用 5x5 卷积生成 5x5 输出图像,您需要在原始图像的顶部、底部和侧面填充 2 个额外的填充像素,然后继续进行通常的 5x5 卷积。卷积滤波器有25个权重参数,输出的每个像素需要输入的25项的加权和。
现在,我们将执行两个阶段,而不是 5x5 过滤器。首先,我们将在原始图像的顶部、底部和侧面填充 1 个额外像素,使其在每个点都符合标准 3x3 卷积。
这会生成一个中间图像,由于填充的原因,其形状与输入相同,但其中每个像素都是 3x3 卷积的结果(因此每个像素控制 9 个项目的加权和)。
现在,我们将从第一个 3x3 卷积的中间图像开始,对最后阶段的 3x3 卷积再次重复此操作。同样,我们在顶部、底部和侧面填充 1 个像素,输出的每一项都是通过输入的 9 项的加权和来实现的。
您在问题中提供的图表演示了如何聚合 5x5 卷积的相同空间信息跨度,但只是通过两个 3x3 卷积的一组不同的两个加权和来计算。需要明确的是,计算并不相同,因为两个 9 维系数滤波器不必学习为与 25 维系数滤波器相同。它们的权重可能不同,但它们可以按顺序跨越原始图像的相同距离,就像 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 操作加权和(总共 81 操作),然后计算最终的 9 操作加权和以获得单个像素的输出。然后回到原来的状态,将卷积增加 1 个点,然后重复。但这是不正确的,并且不会“重新使用”中间卷积层,而是会为最终输出层的每个单元单独重新计算它。
但总的来说,我同意这是非常重要且难以思考的。这篇论文确实掩盖了这一点,并假设读者已经了解了很多上下文。