我所写的CNN框架 VS caffe

一个月前,自己模仿caffe实现了一个卷积神经网络的框架。

相同点

1无缝支持CPU和GPU模式,GPU模式使用cuda实现。

不同点

1我的CNN不依赖与任何第三方的函数库,caffe用到了第三方的数学函数库(cublas和mkl)来做矩阵操作。

其实区别就在于,caffe采用了矢量化编程的方法,如ufldl教程所说http://deeplearning.stanford.edu/wiki/index.php/%E7%9F%A2%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B。

---------------------------------------------------------------------------------------------------------------

矢量化编程是提高算法速度的一种有效方法。为了提升特定数值运算操作(如矩阵相乘、矩阵相加、矩阵-向量乘法等)的速度,数值计算和并行计算的研究人员已经努力了几十年。矢量化编程的思想就是尽量使用这些被高度优化的数值运算操作来实现我们的学习算法。

---------------------------------------------------------------------------------------------------------------

这也解释了caffe比我的快的原因。

对于cpu模式,我只是简单的用for循环了实现一些矩阵操作。

对于gpu模式,虽然用到了cuda的线程模型,有一定的并行度。但是并没有人家的数学函数库那么快。

要想超过caffe的速度,这里也是切入点之一。

方法1:找到比cublas更快的数学库。

方法2:精通GPU编程,研究cublas等源码,提高数据的利用率。其实用cublas等函数库也是有一个致命缺点的,函数只能给你返回最终结果,中间结果不会保存。但是很可能存在这么一种情况,这些中间结果可能下次操作会用到,如果能用到,速度必然更加,否则得重新计算,浪费时间。所以,如果对cublas源码精通,或者能设计出比她更高性能的数值运算操作,我们就可以保存一些中间结果,提高数据的利用率,达到性能上的提高。

当然,这里还有指出,并不是所有操作都能转换为矢量化编程。gpu模式下,caffe里面有一些操作也是自己写核函数实现的,不能用现有的函数实现,比如pool层的正向传播和反向传播。

2 类设计和内存设计

我的CNN类设计比caffe清晰,每一层的特征值,权重值,都有一个类,而caffe都用blob。

从代码的清晰度来看,我的比caffe好。

但是从性能上来讲,就不行了。

caffe的blob内存设计是数据密集型的,我的CNN特征值,权重值等数据在不同的对象中,因此从内存上来看也是分开的。

这恰好是caffe的巧妙指出,只有数据在连续的内存空间,才可以方便的用到第三方的函数库的矩阵操作来实现矢量化编程。

而我,只能用多个循环来操作。

3 迭代方法

虽然用的都是随机梯度下降法来求最优解,

但是我的是每次一张图片,

而caffe每次一批图片。

除了上面提到的一些提高性能的方法,

还想到一点。就是实现内存池,优化内存的使用。肯定有些操作,会申请临时空间,然后用完了就丢弃。

这时就可以用内存池来优化了。

唉,现实是残酷的。可惜我现在还是没有能力写出比caffe更快的,因为对GPU编程和矢量化编程不够精通。这个我所写CNN暂且就被丢弃了。先用caffe玩,毕竟研究人家代码有很多可取之处。

本文作者:   linger

本文链接:http://blog.csdn.net/lingerlanlan/article/details/38121443

我所写的CNN框架 VS caffe

时间: 2024-10-11 01:33:34

我所写的CNN框架 VS caffe的相关文章

CNN Tomography With Caffe - Full Connected Layer

AlexNet Diagram Deduction 全连接结构中的符号定义如下图: Forward Propagation Backward Propagation Follow Chain Rule, define loss function, so we have: Here we define,下面分别介绍这两个偏导项如何计算. 计算 Now we firstly get output layer. As an example, we take cross entropy as loss

linger博客原创性博文导航

http://blog.csdn.net/lingerlanlan 大学研究游戏外挂技术开始了此博客,断断续续写了些博文.后来,开始机器学习和深度学习的研究工作,由于喜欢和热爱,业余时间也经常性学习,并写博文总结.因此,博文越来越多,由于博文是根据时间排序的,看起来有点乱,所以在此处写个导航. UFLDL学习笔记和编程 ufldl学习笔记与编程作业:Linear Regression(线性回归) ufldl学习笔记与编程作业:Logistic Regression(逻辑回归) ufldl学习笔记

Tensorflow 与Caffe(转)

TensorFlow TensorFlow 是相对高阶的机器学习库,用户可以方便地用它设计神经网络结构,而不必为了追求高效率的实现亲自写 C++或 CUDA 代码.它和 Theano 一样都支持自动求导,用户不需要再通过反向传播求解梯度.其核心代码和 Caffe 一样是用 C++编写的,使用 C++简化了线上部署的复杂度,并让手机这种内存和CPU资源都紧张的设备可以运行复杂模型(Python 则会比较消耗资源,并且执行效率不高).除了核心代码的 C++接口,TensorFlow 还有官方的 Py

主流深度学习框架对比

深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow.Caffe.Keras.CNTK.Torch7.MXNet.Leaf.Theano.DeepLearning4.Lasagne.Neon,等等.然而TensorFlow却杀出重围,在关注度和用户数上都占据绝对优势,大有一统江湖之势.表2-1所示为各个开源框架在GitHub上的数据统计(数据统计于2017年1月3日),可以看到TensorFlow在star数量.fork数量.contributor数量这三个数

卷积神经网络(CNN)在语音识别中的应用

卷积神经网络(CNN)在语音识别中的应用 作者:侯艺馨 前言 总结目前语音识别的发展现状,dnn.rnn/lstm和cnn算是语音识别中几个比较主流的方向.2012年,微软邓力和俞栋老师将前馈神经网络FFDNN(Feed Forward Deep Neural Network)引入到声学模型建模中,将FFDNN的输出层概率用于替换之前GMM-HMM中使用GMM计算的输出概率,引领了DNN-HMM混合系统的风潮.长短时记忆网络(LSTM,LongShort Term Memory)可以说是目前语音

人工智能之卷积神经网络(CNN)

前言:人工智能机器学习有关算法内容,请参见公众号“科技优化生活”之前相关文章.人工智能之机器学习主要有三大类:1)分类;2)回归;3)聚类.今天我们重点探讨一下卷积神经网络(CNN)算法. ^_^ 20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络CNN(Convolutional Neural Networks). 1980年,K.Fukushima提出的新识别机是卷积神经网络

Tensorflow的CNN教程解析

之前的博客我们已经对RNN模型有了个粗略的了解.作为一个时序性模型,RNN的强大不需要我在这里重复了.今天,让我们来看看除了RNN外另一个特殊的,同时也是广为人知的强大的神经网络模型,即CNN模型.今天的讨论主要是基于Tensorflow的CIFAR10教程,不过作为对比,我们也会对Tensorflow的MINST教程作解析以及对比.很快大家就会发现,逻辑上考虑,其实内容都是大同小异的.由于所对应的目标不一样,在数据处理方面可能存在着些许差异,这里我们以CIFAR10的为基准,有兴趣的朋友欢迎去

DeepLearning (五) 基于Keras的CNN 训练cifar-10 数据库

数据库介绍 开发工具 网络框架 训练结果 训练要点 激活函数 Dropout 的作用 训练代码 [原创]Liu_LongPo 转载请注明出处[CSDN]http://blog.csdn.net/llp1992 数据库介绍 Cifar-10是由Hinton的两个大弟子Alex Krizhevsky.Ilya Sutskever收集的一个用于普适物体识别的数据集. Cifar-10由60000张32*32的RGB彩色图片构成,共10个分类.50000张训练,10000张测试(交叉验证).这个数据集最

该如何选择框架?

现在开源世界已经越来越流行,软件的开发也越来越简单. 一般来说,只需要选择几款开源框架,然后结合自己业务的特色,整合起来,就可以快速成为一个平台. 那么,如何选择一款好的技术框架呢? 大家都知道,选择一款技术框架,大多数都是作为平台底层运行,一旦使用,基本上没有替换的可能. 如果选择的框架有一些未预见的缺陷性,越到后期,越是如鲠在喉,吐不出,咽不下. 很多同学可能觉得这样说有些过分,我却觉得当一个有追求的程序员,在遇到这种境地时,恰恰就是这种感觉.... 接下来,我们就聊聊如何选择一款好的框架.