caffe 学习笔记(一)

来源:互联网 发布:中国狙击步枪 知乎 编辑:程序博客网 时间:2024/05/18 01:08

caffe是一个深度学习的开源框架,是贾扬清在伯克利大学读博时开发的,现在由伯克利大学的视觉学习中心BVLC(the Berkeley Vision and Learning Center)负责维护。
—————————————————————
在介绍caffe前,先简单介绍下贾扬清。http://daggerfs.com/
这里写图片描述
贾扬清目前在google从事计算机视觉方面的工作,在UC Berkeley读的博,在清华大学读的本科和硕士。在读研期间,曾在新加坡国立大学,微软亚洲研究院,美国NEC实验室和google研究所工作过。
————————————————————
Caffe的核心程序是用C++实现的,并提供了Python和Matlab的接口,也就是说你可以在python和matlab中调用caffe训练好的模型。并且,caffe支持cpu和gpu的无缝切换,这一点在现在的大数据时代显得尤为重要。目前搞深度学习的人大部分都是在gpu上跑程序的,一个ImageNet数据集有上千万张图片,加上深度学习使用的模型层数又比较多,跑一个程序所花费的时间都是以天为单位计算的,若在cpu上跑,可能需要一周的时间,但在gpu上可能只需两三天就好了。但是对于我们这些正常人来说,如果让我们在gpu上进行编程,恐怕都要傻眼了,这时caffe就提供了一个便捷的方式,可以让你忽略cpu和gpu的差别,仅仅一个参数就可以让你的模型在cpu和gpu之间自由切换,大大提升了各位童鞋‘发论文’的速度。(还有一个python工具包也可以让你方便的在cpu和gpu之间进行切换,那就是Theano了,本人最初正是因为只有python工具包才有支持gpu编程的功能,所以才弃matlab从python的)
据个人了解,目前,深度学习领域做图像的基本上用的都是caffe,caffe以其开源高效易上手的特点而著称。caffe的具体优势有以下几点:
1.上手快:模型与相应优化都是以文本形式而非代码形式给出。
Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
2.速度快:能够运行最棒的模型与海量的数据。
Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms.
3.模块化:方便扩展到新的任务和设置上。
可以使用Caffe提供的各层类型来定义自己的模型。
4.开放性:公开的代码和参考模型用于再现。
5.社区好:可以通过BSD-2参与开发与讨论。
6.GPU和CPU之间无缝切换
由以上介绍可知,caffe的重要特色有两点,一是可以在gpu上运行,二是运行速度快。那么是什么原因促使caffe的运行速度比其它深度学习框架的运行速度快呢?个人认为有以下几点:
1.数据存储:
Caffe生成的数据分为2种格式:Lmdb和Leveldb
它们都是键/值对嵌入式数据库管理系统编程库。
虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集。
因此lmdb取代了leveldb成为Caffe默认的数据集生成格式。(这点得吐槽下了,没空的自行跳过此段。之前用的是实验室服务器上安装的老版本的caffe,在运行MNIST和CIFAR-10的例子时,caffe官网教程上的还是生成*_leveldb格式的数据,但当我几天后跑ImageNet实例时,提示我找不到$CAFFE_ROOT/build/tools/目录下的caffe文件,后来还是通过和网友的tools目录下的文件对比才发现,编译后生成的老版本的caffe比新版的少了一堆东西,只好重新编译新版本,编译过程中发现缺少lmdb,查资料才发现,caffe已经用lmdb取代了leveldb,而返回去看之前的MNIST和CIFAR-10实例教程,发现教程上也已经将leveldb的部分改成lmdb了。唉~,这更新速度也忒快了吧,还是提醒各位及时升级,有问题多看几遍官网教程)
2.数据传输
当数据在前向后向传输时,caffe采用blobs的形式对数据进行传递或处理,它是该框架采用的标准的存储接口。下面是百度百科上对blob的一段解释:BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库,caffe中的lmdb或leveldb)
在caffe中,blob是一个四位数组,不过在不同的场合,各维表示的意义不同
对于数据:Number*Channel*Height*Width
对于卷积权重:Output*Input*Height*Width
对于卷积偏置:Output*1*1*1
3.其它
c++的运行效率就不用多说了,暂时这些吧,如有新内容再补充了,也欢迎大家来补充……

介绍完caffe了,接下来就该安装caffe跑跑实例看看效果了
不过先说明下,本系列caffe学习笔记中,不涉及caffe的安装部分,如有此需求请移步他处。我用的是实验室的服务器,caffe是别人装的,本人没有root权限没有实际安装过,所以安装部分就无从奉告了~

上文介绍了些关于caffe的边缘知识,接下来就要跑跑实例,改改参数,理解下caffe的运行机制了,另外会顺便提一下怎么在LeNet和CIFAR-10例程中加入Hinton的dropout(ImageNet实例中自带有dropout层)……

参考文献:
http://www.lupaworld.com/article-250356-1.html

1 0
原创粉丝点击