caffe2 和 caffe 有何不同
前几天 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
这样,就可以针对不同的需求做不同的选择,灵活性更大。
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)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
caffe2 和 caffe 有何不同相关推荐
- caffe,caffe2 and pytorch
1 Difference caffe and caffe2 Caffe2 improves Caffe 1.0 in a series of directions: 支持大规模分布式训练 移动平台的部 ...
- Caffe和caffe2漫谈
根据网上博客和自己理解部分进行备注说明,文字内容会有部分重复 1.来源: Caffe是一套最早起源于Berkeley的深度学习框架,被广泛应用于神经网络的任务当中,大量paper的实验都是用它完成的, ...
- 认识Caffe与Caffe2
原文链接:https://www.cnblogs.com/carle-09/p/9033608.html 目录: 一.Caffe的作者-贾扬清 二.Caffe简介--Caffe.Caffe2.Caff ...
- 深度学习-服务端训练+android客户端物体识别实战(caffe入门教程+mobilenet+ncnn+android)
文章目录 背景 物体识别简介 自动驾驶 淘宝京东使用物体识别技术 公司业务需求 深度学习简介 深度学习的位置 深度学习概念 深度学习优势 深度学习基础知识 感知机 激活函数 多层感知机 卷积神经网络 ...
- 【Python从零开始】caffe2的安装过程(在win10+Python+VS2015的环境下,改成caffe2的安装)(2)
前言: { 上次中断是因为C:\Program Files (x86)\中没有Windows Kits,这次是添加了Windows Kits后的过程. } 正文: { 在搞定Windows Kits之 ...
- Caffe的深度学习训练全过程
转载自:http://www.infoq.com/cn/articles/whole-process-of-caffe-depth-learning-training 今天的目标是使用Caffe完成深 ...
- 深度学习-服务端训练+android客户端物体识别实战(caffe+mobilenet+ncnn+android)
文章目录 背景 物体识别简介 自动驾驶 淘宝京东使用物体识别技术 公司业务需求 深度学习简介 深度学习的位置 深度学习概念 深度学习优势 深度学习基础知识 感知机 激活函数 多层感知机 卷积神经网络 ...
- caffe2学习笔记一:图像预处理
Facebook的caffe2是caffe的升级版,相较于caffe的主要不同是将layer替换成了更为强大灵活的operator以及添加了类似matlab中的工作区概念的workspace,基本数据 ...
- caffe2 教程入门(python版)
学习思路 1.先看官方文档,学习如何使用python调用caffe2包,包括 Basics of Caffe2 - Workspaces, Operators, and Nets Toy Regres ...
最新文章
- Java 高并发面试题
- 87岁的老奶奶喜欢用windows画图程序作画,而且画得还贼好!
- PCA中transform等scikit-learn中系列API用法
- Java中的关于static的解释和应用
- english learning websites
- mysql的高阶用法_MySQL的经典用法(十四)-高级优化
- (王道408考研数据结构)第八章排序-第三节1:简单选择排序
- ubuntu下打开matlab_ubuntu下matlab安装,添加中文支持与启动
- Java创建对象小结
- 欧洲最大云服务公司 OVH 法国机房着火:1个数据中心被完全烧毁、部分客户数据完全丢失且无法恢复
- 使用jQuery在AJAX请求中添加标头
- c语言根据元素位置读取元素,jquery1.5.1中根据元素ID获取元素对象的代码
- 流畅接口(Fluent Interface)
- Ubuntu Desktop LTS - 开机数字小键盘
- git commit 提交信息写错,怎么更改?
- 大雪坪剑来 Spring Cloud 教程(二):Spring Boot 集成 mybatis 实现增删改查
- 中图杯获奖作品计算机组,中图杯大赛试卷
- 从零开始学视觉里程计——一个初学者教程
- docker制作镜像的两种方法
- matlab实验结果图片保存
热门文章
- 如何在 Linux 中减少/缩小 LVM 大小(逻辑卷调整)
- Jenkins入门之设置定时任务
- 【学习笔记】FTP创建用户并指定用户主目录
- Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error cre
- 浅析http协议、cookies和session机制、浏览器缓存
- ​LeetCode刷题实战568:最大休假天数
- C++获取程序当前目录
- 实验室计算机主机应关闭显示器一般不用关,学生晚上回宿舍时,其在实验室的计算机主机应关闭,显示器一般不用关闭。...
- 详解缓存穿透、缓存雪崩、缓存击穿
- 嵌入式Qt-简易网络监控摄像头