前几天 facebook 开源的 caffe2,让我们在深度学习框架上又多了一个选择。caffe2 宣称是轻量级、模块化和可扩展的一个框架,code once,run anywhere。作为一个老 caffe 玩家,自是要好好研究一番。

依赖处理

第一版 caffe 的依赖是个让人头疼的事,尤其是在公司旧版的服务器上安装时,需要花费大量的时间折腾。服务器的系统旧,python的版本低(2.4),直接升级可能会影响现有服务,所以只能源码编译安装各种依赖。当时比较头疼的问题有两个:

  • 依赖里面套着依赖:glog需要gflags,gflags需要cmake(版本低了,好像也会有问题),numpy依赖python的版本和Cython,等等。
  • 解决完一台的问题,下一台还会出现新问题。

当然,现在有了docker,这些都不再是问题了。但当时前前后后安装了好多遍,又是改代码,又是改Makefile,每次都挺麻烦。

现在新版的 caffe2 通过简化依赖,按需配置,完美的解决了这些问题。在 caffe2 的文件夹中,只有core和proto两个文件夹是必须的,其他都是可配置的。而所谓的code once,run everywhere,核心就在于此。

Deep_Learning/caffe2/caffe2(master⚡)» tree -d .
.
├── binaries
├── contrib
│   ├── docker-ubuntu-14.04
│   ├── gloo
│   ├── mpscnn-fb
│   ├── nccl
│   ├── nervana
│   ├── nnpack
│   ├── prof
│   ├── snpe-fb
│   ├── torch
│   └── warpctc
├── core
├── cuda_rtc
├── db
├── distributed
├── experiments
│   ├── operators
│   └── python
├── image
├── mkl
│   └── operators
├── mpi
├── operators
├── proto
├── python
│   ├── docs
│   ├── examples
│   ├── helpers
│   ├── layers
│   ├── mint
│   │   ├── static
│   │   │   └── css
│   │   └── templates
│   ├── models
│   ├── operator_test
│   ├── predictor
│   ├── tutorial
│   └── tutorials
│       ├── experimental
│       └── images
├── queue
├── sgd
├── test
│   └── assets
└── utils├── mkl└── threadpool48 directories
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

这样,就可以针对不同的需求做不同的选择,灵活性更大。

Net 组成方式

第一版的 caffe 的 Net 由粒度较粗的layer组成,即每个layer的 weight 和 bias 都以layer级别存储,这样做虽然简单直观,但有以下几个问题:

  • 针对具体平台做优化时,就会比较繁琐,现有的代码只有GPU和CPU的版本,即forward_cpu,forward_gpu,如果针对arm优化,则不仅仅添加该layer的arm实现,还要修改其他地方的代码。
  • 添加新的layer实现,需要修改caffe.proto文件,重新编译,而且当新的layer是已有几个layer的组合时,比如LRN layer,就由split layer、power layer和pooling layer组成,复用起来稍有复杂。
  • weight 和 bias 参数和 layer 绑定在一起,finetune 也会稍显复杂,修改Net的prototext文件,指定哪些layer的参数保持不变,哪些layer的参数需要重新学习。

其实最后一个问题是我经常所遇到的问题,感谢开源,有很多现成的模型可以直接使用,我一般会挑选合适的模型进行finetune,很少会从零开始训练(只有个家用级别的GPU,也训不起来,哈哈)。做的多了,就会想,如果可方便的方式进行finetune就好了,比如我基本都在搞分类识别,基本都会保留前几层的卷积参数不动,用来提取中级特征,如果Net的组成方式更加灵活,不同的训练可以载入使用相同的layer,类似与数据并行,就可以同时训练出好几组模型了。

新版 caffe2 的Net组成,也采用了 tensorflow、mxnet 等这些框架使用 operator 方式,由更细粒度的 operator 组合而成。当粒度变小时,可以做的优化就更多了:

  • 多平台的支持变得更加容易了,operator 仅仅是处理数据的逻辑,这就可以有针对性的优化。这个优化不仅包括单个 operator 在新平台的支持,还包括多个 operator 组合的优化。
  • layer 变成了 operator 的组合,剥离了 weight 和 bias 的参数,一方面生成新的 layer 更加方便,另一方面也可对 weight 和 bias 控制。就像 output=f(wx+b)” role=”presentation” style=”position: relative;”>output=f(wx+b)output=f(wx+b),当把w和b都当成了参数,就可以把一个函数变成一类函数了。
  • 最大的好处,我觉得还是可以声明式的编写神经网络了,这个和第一版 caffe 相比,就类似使用所见即所得的方式 vs 使用latex 编写文档一样。

在源码的scripts文件夹中,可以看到iOS、Android、Raspberry PI、windows等平台的编译脚本,而仅仅改动几行,就可以支持watchOS,很好很强大,具体可以看看这个Pull Request。

基础数据 Blob

caffe2 中把 caffe 中的 Blob 进行扩展,支持了更多的类型,这就让 Binary Net 和模型的量化压缩变得可行。这两个在工业界应该关注更多一些,毕竟关乎成本,它们可以让模型在现有的 CPU 机器上可实用,进一步可以应用到手机端。目前动辄几十、几百MB的模型,怎么嵌入到手机端,确实是个大问题啊(怪不得 facebook 的 iOS 端的安装包越来越大,会不会和这个有关?哈哈)。

总结

caffe2 可以看作是 caffe 更细粒度的重构,在实用的基础上,增加了扩展性和灵活性。作为 caffe 的重度用户,caffe2 解决了我的好几个痛点,后续我会从源码角度进行深入学习,会在树莓派上进行测试,同时我业余也在使用 golang 进行第一版 caffe 模型的量化压缩和可视化的研究,即 gocaffe,对这方面感兴趣的朋友可以关注微博或者微信公众号:hackcv,一起交流学习。

原贴:http://www.hackcv.com/index.php/archives/110/?utm_source=tuicool&utm_medium=referral

caffe和caffe2的区别相关推荐

  1. Caffe和caffe2漫谈

    根据网上博客和自己理解部分进行备注说明,文字内容会有部分重复 1.来源: Caffe是一套最早起源于Berkeley的深度学习框架,被广泛应用于神经网络的任务当中,大量paper的实验都是用它完成的, ...

  2. caffe转caffe2

    这个需要同时又caffe和caffe2 https://github.com/Qidian213/mtcnn_caffe2/blob/e1a596d69fd48b4e7063205a2b63ed431 ...

  3. Caffe 与 Caffe2

    Caffe 与 Caffe2 Caffe: - 适用于large-scale product - unparalleled performance - well tested C++ codebase ...

  4. 认识Caffe与Caffe2

    原文链接:https://www.cnblogs.com/carle-09/p/9033608.html 目录: 一.Caffe的作者-贾扬清 二.Caffe简介--Caffe.Caffe2.Caff ...

  5. caffe 以及caffe2 安装时portobuf库相关的编译问题

    安装caffe出现protobuf版本问题,是由于anaconda安装了不同的protobuf版本 pip show protoc protoc –version sudo apt-get insta ...

  6. caffe,caffe2 and pytorch

    1 Difference caffe and caffe2 Caffe2 improves Caffe 1.0 in a series of directions: 支持大规模分布式训练 移动平台的部 ...

  7. pycharm中import caffe/caffe2

    在terminal中import caffe/caffe2都是没问题的,但是在pycharm中如果直接import caffe/caffe2,会报错ImportError: No module nam ...

  8. 【Python】Caffe 模型转换 Caffe2 模型 (支持多输入 / 多输出)

    Model Translator from Caffe to Caffe2 用于将 Caffe 模型转换为对应 Caffe2 模型的 Python 脚本 官方提供了一个基础版本,经修改和优化后,已支持 ...

  9. caffe2 教程入门(python版)

    学习思路 1.先看官方文档,学习如何使用python调用caffe2包,包括 Basics of Caffe2 - Workspaces, Operators, and Nets Toy Regres ...

最新文章

  1. 关于JS中的constructor与prototype
  2. group plot simplest approach in matlab
  3. 阶跃函数卷积自己_如何看待大神/老师说“阶跃响应曲线调参并不准确”的观点?...
  4. linux安装openssl
  5. 【bzoj2406】矩阵 二分+有上下界可行流
  6. Thinkpad官方推荐的驱动安装顺序
  7. 智能控制在计算机领域的应用,智能控制的主要应用领域
  8. python+django+mysql多用户B2C商城系统毕业设计毕设开题报告
  9. clickhouse索引原理介绍
  10. 第17章 文字和字体
  11. 徐静蕾2008十大青春语录
  12. 详解交换机端口级联连接方式
  13. 【总结】从0到1的项目经历
  14. 微信公众号排查“该公众号提供的服务出现故障,请稍后再试”问题
  15. STM32f1之L298N电机驱动+PWM调速(附主代码)
  16. 机器学习(算法篇)——K-近邻算法
  17. 【Linux】查看linux是centos还是ubuntu的方法
  18. Gherkin语法详解之Transforming Data Tables(六)
  19. Oracle数据库PL SQL开发、Oracle-SQL开发习题答案
  20. matlab里trim函数,matlab 中trim函数总出现Index exceeds matrix dimensions,求大神帮忙解决...

热门文章

  1. C++读取CSV, CSVReader类
  2. 三维坐标旋转矩阵推导过程(包看懂)
  3. 关于windows开机进入自启动程序非资源管理器的问题
  4. vue vant上拉加载 下拉刷新
  5. 面向对象思想设计简单动物乐园Java程序
  6. 生物信息之独孤九剑——sed
  7. App_Code里的类引用问题
  8. EduCoder实践课程——Python零基础到精通 参考答案(二)
  9. 机械师F-117 Ubuntu 安装显卡驱动以及CUDA
  10. 软件赋能 数智转型 GBASE南大通用亮相南京软博会