使用NumPy实现GoogLeNet的前向检测功能

2014年GoogLeNet的出现,再次刷新了图像分类检测的准确率。在《Going Deeper with Convolutions》论文中,提出了Inception神经网络架构,随后又出现了Inception-v2、Inception-v3等优化的架构。与AlexNet相比,Inception架构更为复杂,不过使用Numpy实现其前向检测的运算,也是可行的。本文记录了笔者实现的这一过程。相关代码可在https://github.com/LinkYe/LearnDeep/tree/master/Inception-caffe获得。

首先,需要下载Caffe官网提供的GoogLeNet训练的权重文件,URL为http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel;该文件的大小有52MB,约为AlexNet的权重文件大小的四分之一,Inception网络结构的优越性可见一斑。
然后,可以通过执行what.py脚本,查看GoogLeNet的各层权重的Tensor形状,和输出Tensor的形状。执行命令:python3 what.py > what.txt,并查看what.txt,如下图:

 

由上图可知,GoogLeNet的权重数量很多,结构很复杂。Blob为每层输出的Tensor的形状,BlobVec则为每一层的卷积核。论文中提出了Inception模块,并在整个前向计算中重复了多次,下面就是Inception模块计算的实现:

 

在方法incept(...)中,输入的pImg被多次使用到,最后将4个计算过程的输出叠加成为一个Tensor,这样看来,输出的结果是复合的,这不是一纯粹的feed-forward过程。之后,就是前向的计算过程了:

 最后,可以执行python3 -i run-inception.py运行实现的GoogLeNet的检测功能了,它全自动加载cat.jpg:

 见上图,我们也将caffe的结果输出了,对比可知我们的计算过程是正确的。不过由于置信度忘记乘以100,所以上面的结果差了100倍。也可以手动执行detect_img('XXX.jpg'),对图片进行检测:

 至此,我们又见到了一种架构较为复杂的分类器的前向计算过程,这样以后探究其他一些更为复杂的网络了。

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