小白经典CNN论文复现系列(一):LeNet1989

小白的经典CNN复现系列(一):LeNet-1989

之前的浙大AI作业的那个系列,因为后面的NLP的东西我最近大概是不会接触到,所以我们先换一个系列开始更新博客,就是现在这个经典的CNN复现啦(。・ω・。)

在开始正式内容之前,还是有些小事情提一下,免得到时候评论区的dalao们对我进行严格的批评教育······

首先呢,我会尽可能地按照论文里面的模型参数进行复现,论文里面说的什么我就写什么。但是由于我本人还是个小白,对于有些算法(比如什么拟牛顿法什么的)实在是有点苦手,而且CNN也基本上就只使用一阶的优化方法,所以有些我感觉没有必要复现的东西我就直接用一些其他的办法替代啦,别介意哈

然后呢,因为我这边硬件设备有限,就只有一张1080Ti的卡,所以如果模型比较复杂并且数据集太大的话,我可能就只是把模型的结构复现一下,具体的训练就爱莫能助了呢,毕竟,穷是原罪┓( ´∀` )┏

另外,由于大部分论文实际上并没有将所有的处理手段全都写在论文里面,所以有的时候复现出来的结果和实际的论文里面说的结果可能会有一些差距,但是这个真的没有办法,除非去找作者把源代码搞过来,而且毕竟权重的初始化是随机的,也就是说即便拿到源代码,也不一定能跑出论文里面的最好结果,所以,大家就看看思路就好了呗

最后呢,因为我知识储备还不是很够,所以有些描述可能会不太正式,甚至有些小错误,所以如果出现这种情况,麻烦各位dalao在评论区温柔地指点一下,反正要是你喷我,我不理你就是了┓( ´∀` )┏

好啦好啦,开始正题吧。一般来说,大家认为的非常经典的打头的神经网络是由LeCun提出来的LeNet-5,而且这个网络在当时的MNIST数据集上的表现也不错。但是实际上这个网络也有他的初始版本,就是这篇博客要讲的LeNet-1989了,虽然实际这个网络并不叫LeNet,这个结构命名是我在看CSDN上的一篇博客的时候那个博主这么写的。在我看来为什么那个博主称这个网络叫LeNet-1989呢?实际上仔细看下这个网络的结构的话,大致的结构和后来的LeNet-5的结构已经十分相似了,只是深度、池化、输出形式、训练方法等小细节不太一样,为了能更好地了解后面的LeNet-5,我选择了这个网络作为一个入门参考(虽然复现的时候才发现全是坑(T▽T))。

具体的论文题目是《Backpropagation Applied to Handwritten Zip Code Recognition》,在网上应该是还能找得到这篇文章的,虽然这篇文章已经很老了(1989年比我老多了,emmmm我应该没有暴露年龄,大概)

这篇文章实际上算是LeCun相当早的关于卷积神经网络形式的论文了,而且在这篇文章中,权重初始化、权重共享理念都有涉及,虽然并没有在理论上给出严格的推导和证明,但是我们可以看出来的是,在这个阶段LeCun对于卷积神经网络的具体结构已经有了一个比较完善的概念了,而且这篇文章中指出的初始化方法、激活函数形式以及卷积核的尺寸等等也和之后的LeNet-5是基本一致的。

数据集部分:

在这篇文章中使用的实际数据集是当时美国的手写邮政编码,但是这个原始的数据集我是找不到了,所以我就使用了基于这个数据集进行调整以及再整理后得到的数据集MNIST了,这个数据集也是后来LeNet-5用的嘛,就当是和论文一样好咯┓( ´∀` )┏

实际上pytorch中是提供了MNIST数据集的下载以及加载,所以这个还是蛮方便的,但是还有一个问题,那就是论文里面提到,实际训练网络使用的图片是16 x 16,并且将灰度值的范围通过变换转换到了[-1, 1]的范围内,而Pytorch提供的MNIST数据集里面是尺寸为28 x 28,像素值为[0, 255]的图片,因此在实际进行网络训练之前,我们要对数据集中的数据进行简单的处理,这部分到后面的代码部分在说吧。

网络结构部分:

这篇文章使用的网络的基本结构和之后的LeNet-5除了深度以及一些小细节之外基本上是一模一样了,具体的结构直接看图啦:

小白经典CNN论文复现系列(一):LeNet1989


下面我们对这个网络结构进行一个简单地分析:

整个网络由H1、H2、H3以及output层构成,每一层的具体结构以及功能我下面会说啦:

H1层:由5 x 5的卷积核以及对应的偏置进行特征图的计算,输入的图片的尺寸如果写成Pytorch的默认的输入数据格式的话(在这里先不考虑batch_size这个维度),应该是[channels, height, width] = [1, 16, 16],卷积核会将这个输入数据输出成[12, 8, 8]的形式。但是这里就有问题了,因为原论文中并没有给出卷积运算时使用的stride以及padding,而根据这个数据并且考虑计算机进行整数运算时候的取整操作,这个是有无穷多的解的······,所以我在复现这里的时候,就选了最简单的参数,stride = (2,2),padding = (2,2),考虑到取整操作,这样是可以得到论文中所说的特征图的尺寸的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpssyw.html