我所写的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的更多相关文章

  1. 一图看懂深度学习框架对比----Caffe Torch Theano TensorFlow

      Caffe Torch Theano TensorFlow Language C++, Python Lua Python Python Pretrained Yes ++ Yes ++ Yes ...

  2. linger博客原创性博文导航

    linger博客原创性博文导航 http://blog.csdn.net/lingerlanlan 大学研究游戏外挂技术開始了此博客.断断续续写了些博文. 后来,開始机器学习和深度学习的研究工作,因为 ...

  3. Caffe(卷积神经网络框架)介绍

    Caffe(卷积神经网络框架)Caffe,全称Convolution Architecture For Feature Extraction caffe是一个清晰,可读性高,快速的深度学习框架.作者是 ...

  4. 卷积神经网络CNN与深度学习常用框架的介绍与使用

    一.神经网络为什么比传统的分类器好 1.传统的分类器有 LR(逻辑斯特回归) 或者 linear SVM ,多用来做线性分割,假如所有的样本可以看做一个个点,如下图,有蓝色的点和绿色的点,传统的分类器 ...

  5. 转:TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比

    http://geek.csdn.net/news/detail/138968 Google近日发布了TensorFlow 1.0候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步.自Tens ...

  6. CNN:Windows下编译使用Caffe和Caffe2

    用于检测的CNN分为基于回归网络的方法和基于区域+CNN网络的方法,其中基于回归网络的方法典型为YOLO9000,可以兼容使用VGG-Net框架.其中基于区域+CNN网络方法,大量使用了Caffe作为 ...

  7. 来杯Caffe——在ubuntu下安装Caffe框架并测试

    Caffe是一种深度学习框架...blablabla...... Caffe要在ubuntu下安装 1. 安装依赖 sudo apt-get install libatlas-base-dev sud ...

  8. 深度学习框架caffe/CNTK/Tensorflow/Theano/Torch的对比

    在单GPU下,所有这些工具集都调用cuDNN,因此只要外层的计算或者内存分配差异不大其性能表现都差不多. Caffe: 1)主流工业级深度学习工具,具有出色的卷积神经网络实现.在计算机视觉领域Caff ...

  9. ubuntu之路——day19.2 开源框架与迁移、CNN中的数据扩充

    开源框架与迁移 上面介绍了一些已经取得很好成绩的CNN框架,我们可以直接从GitHub上下载这些神经网络的结构和已经在ImageNet等数据集上训练好的权重超参数. 在应用于我们自己的数据时. 1.如 ...

随机推荐

  1. js中数组删除 splice和delete的区别,以及delete的使用

    var test=[];test[1]={name:'1',age:1};test[2]={name:'2',age:2};test[4]={name:'3',age:3}; console.log( ...

  2. Android开发中JavaBean类和序列化知识的理解

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/6296121.html Android开发中,我们经常用到JavaBean类以及序列化的知识,但经 ...

  3. Shell读取一个表达式并计算其结果

    #!/bin/bash # 读取一个算数表达式并计算出结果 # 如果输入 # 5+50*3/20 + (19*2)/7 # 则结果为 # 17.929 read x printf "%.3f ...

  4. c++的if语句中的110为什么不等于110?

    从上图可以看出,当表达式1.1*x被直接放进if的判断括号中时1.1*x不等于y,但是将1.1*x赋值给z时,z与y相等,这是为什么?(以下为不等价时的代码) #include<stdio.h& ...

  5. ffmpeg mp4 mp3 wav flac webm aac ac3 ogg格式转换

    版权声明:本文为博主原创文章,未经允许不得转载. ffmpeg是Linux中转换音频视频文件的常用工具. mp4 to mp3: ffmpeg -i $ID.mp4 -acodec libmp3lam ...

  6. C语言程序内存分布

     一个进程的数据在内存中的布局如下图: bss段(bss segment):可读可写不可执行,通常用来存放程序中未初始化的全局变量.bss是英文Block Started by Symbol的简称.b ...

  7. fit in gnuplot

    Table of Contents 1. fit-gnuplot 1 fit-gnuplot syntax >> fit [xrange][yrange] function 'datafi ...

  8. SolrCloud架构

    原文链接 https://blog.csdn.net/dingzfang/article/details/42804489 1 核心概念 Collection Shard 均为逻辑上的概念 Core为 ...

  9. POJ 1414 Life Line(搜索)

    题意: 给定一块正三角形棋盘,然后给定一些棋子和空位,棋子序号为a(1<=a<=9),group的定义是相邻序号一样的棋子. 然后到C(1<=N<=9)棋手在空位放上自己序号C ...

  10. jQuery中attr和prop方法的区别

    jQuery中attr和prop方法的区别。 http://my.oschina.net/bosscheng/blog/125833 http://www.javascript100.com/?p=8 ...