conv 算法和 bn 算法都介绍过了,这里来看一个属于两者优化方面的知识:
为什么在一些情况下,我们需要将 conv 和 bn 融合起来呢,为什么他们可以融合以及怎么融合呢?
首先神经网络的性能很重要这是老生常谈的话题了。将两个算法融合成一个算法,目的肯定就是为了提高神经网络的性能。
这里引入一点计算机中计算的知识:
传统的冯诺依曼架构的计算机,是将数据的存储和计算分离开的。
也就是说,要计算的数据是放在存储器上,而负责计算的硬件是另一个单独的计算单元。在计算时需要将数据从存储器上搬运到计算单元上,完成计算后再搬运回存储器上。
就像是在厨房做饭,数据就是菜,如果做饭需要先将菜从冰箱里拿出来,放在锅里炒,炒完再放回餐盘中。
这其中,冰箱就是存储器,锅就是计算单元,而餐盘是另一个存储器。
这是典型的冯诺依曼架构,现在大部分电脑和计算芯片依旧采用的还是这个架构。
在我们的笔记本电脑中,存储器一般指的是内存或者硬盘,计算单元就是CPU。
将数据从内存搬运到 CPU 中是需要时间的,虽然时间很短。
假设 conv 计算的输出数据是 [1, ho, wo, co],然后给到下一层 BN 来计算。如果将这个输出数据 [ho, wo, co] 存回存储器,下一层 BN 再去存储器上搬过来,这一来一回的时间就浪费了。
于是,我们就想到了一个方法,将 conv 和 bn 融合成一个算法,这样只需要在锅里做一道 conv+bn 的菜,做完后直接放回餐盘中即可,而conv 的输