悟已往之不谏,知来者之可追。
实迷途其未远,觉今是而昨非。
–<晋>陶渊明
0. 前(fei)言(hua)
我曾经以为我是天下第一倒霉蛋,既不是富二代,也谈不到恋爱,脑子也是笨蛋,又是高度近视,直到考上研才发现我其实一直都很走运,尤其是在这种重要的人生节点,我总是能走运,获得我的努力配不上的成绩。虽然我不信命运,但是既受此天恩,又岂能不抚壮而弃秽兮?
大二的时候用C++写过全连接的网络,很简单,现在有个网络需要部署在开发板上,内存1M,除了用cpp写我想不出别的办法了;往年竟然有人在这板子上面跑python,我只能说是我孤陋寡闻了。奈何笨鸟先飞,虽然用cpp重构费事了些,但是也不妨为一个很好的练手程序。我听说同校有的社团大一招新就是手写卷积层,确实是我菜了。我一直以为卷积层这玩意谁不会啊,对应位置相乘,一个块移来移去的,小学生理解起来也没有什么问题。但是当输入图像是多通道、feature map产生多个的时候呢?你还是能完全清楚的说出计算过程吗?恐怕未必很多人能够完整说出。网上类似的文章虽然有很多,但我总感觉读起来隔靴搔痒,太过学术,不得其中门道,故斗胆撰文,谨抛砖引玉,若能启读者之思,则诚为我之幸甚。若有疏漏,恳请诸位读者斧正。
1. 卷积层的性质
我们都知道,卷积层在keras中是这样定义的:
layers.Conv2D(
input_shape=(pic_width, pic_height