使用numpy实现caffe/LeNet模型的前向检测

本文记录了笔者探究caffe基于MNIST数据集训练出的LeNet的前向检测的计算,并使用numpy重新实现了这一计算过程,以加深从运算层面对卷积神经网络的理解。笔者实现的简单Python代码可以在https://github.com/LinkYe/LearnDeep获得。

首先需要caffe训练生成的模型文件,lenet_iter_10000.caffemodel,这可以按照caffe官方的文档基于MNIST数据集训练得到。将该模型文件复制到caffe-weights.py所在的目录,并执行该脚本,可读取caffemodel中的权重参数并存储为NPZ文件。在创建mnistLeNet对象时,会读取这个NPZ文件LeNet-Caffe.npz:

 如上图,在读取权重时,会将第一层和第二层卷积核进行翻转(图中红色框),这是因为caffe中的卷积核已经是翻转过的;但scipy库提供的convolve2d的接口在进行二维卷积运算时,会再次进行翻转。随后,为mnistLeNet类增加了卷积的接口及池化的接口,最后就是前向检测的运算过程:

 

由上图可以较为清晰地看到输入的图片经过的四层的计算,最终返回一个有10个元素的向量。为了测试mnistLeNet的检测功能,需要进行以下操作:

 我们通过Python Machine Learning一书中的Load_mnist()来读取MNIST测试数据(图中第4行),之后对预测的结果调用softmax来得到一个0到9的可信度列表,retv(图中第7行)。可以看到,预测结果最大可信度的对应值为9,这与图像对应的标签是相同的,那么可以在一定程度上认为我们实现的可LeNet前向检测计算结果是正确的。

接下来我们调用caffe的接口,对该图像进行前向检测运算:

可见,其预测的可信度列表与我们用mnistLeNet得到的可信度列表差别微小,因此可以认为为LeNet/caffe实现的前向检测运算是没有问题的。最后,可以执行predictImage.py对MNIST的一万个测试图进行预测,笔者得到的正确率达到99%以上。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章