卷积的反向传播理论与代码实现

  早期对深度学习框架有些兴趣。21年开始学习反向传播,做一做总结。最早在学习卷积反向传播是从 Caffe 代码看起。但如果不懂理论,其实也根本看不懂。也参看过一些网上的讲解,如知乎、csdn 等等,基本也看不明白,而且有的讲解也是错误的,有的完全照抄 Caffe 代码再加了点注释,也没写明白。索性后面就不再参照他人,自己推导。这里讲的卷积的反向传播是本人理解推导的,并且推导后对比了 Caffe 中的代码,和我推导的过程一样。因此可以通过理论加代码做讲解。希望能对自学底层的同学有一些帮助。

  为何要回顾前向传播的计算过程,因为计算梯度需要依赖前向传播的过程来推导,其中就要利用 im2col。

  先忽略 group 参数,后面再讲此参数,这里认为 group 是 1,既代表普通卷积。

  图 5 其实是 im2col 的反向赋值,代码与 im2col 几乎一样,只不过是反向赋值。但与 im2col 不同的是第249行,可以看出,和上面问题2描述的一样,这里就是同位置的梯度叠加而不是覆盖。238 行与 246 行都表示对 bottom data 的 pad 位置不求梯度,直接掠过。本来也是伪 padding,也无需求梯度。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注