深度学习开源框架众多,基于C++的训练框架唯有Caffe一个,尽管Caffe在做一些比较新的任务时成本极高,但它依旧有它存在的价值,今天在这里给出几个推荐理由。
作者&编辑 | 言有三
1 Caffe的功绩
笔者从2015年开始从事深度学习相关的工作,彼时不管是学术界还是工业界,Caffe是主流。哪怕随着几年后Tensorflow,MxNet,以及近两年Pytorch的崛起,在移动端部署,各家公司在很长一段时间内都是将Caffe的核心代码移植到手机上。
随着腾讯的NCNN,小米MACE等移动端开源框架的流行,这个比例才慢慢降低。但是如果你认识一些在移动端上做视觉算法的朋友,可以问问他们的产品线上还有Caffe还有多大的比例,我相信或多或少都有,甚至是主流。
接口稳定,推理速度快,这是它流行的最重要的原因,这两点对于工业界应用来说是真正的刚需。
2 Caffe安装真的很难吗
很多同学害怕Caffe,首先是因为害怕它的环境配置。诚然,Caffe需要自己编译,但是这个编译真的难吗?
以Ubuntu为例,高于17.04的版本,安装就一条命令:
sudo apt install caffe-cuda
低于17.04的版本,也就是要做几件事情:
(1) 安装Nvidia驱动和CUDA。
(2) 安装依赖库。
(3) 在Caffe源代码中配置好库路径然后编译。
第一条,或许是有一些坑,但这不是做深度学习算法工程师必备的技能吗?公司和实验室有了新的机器让你配置难道也说不会。
第二条,无脑apt-get命令。
第三条,配置一下库的路径而已,Makefile都没让你写,只是无脑敲一下make命令。
新手在环境安装上卡住,其实并不是Caffe难,而是使用者对Linux系统非常不熟悉,这个锅Caffe不背。还从未听过哪家做深度学习算法开发的公司不基于Linux环境,你今天不学会到了公司更痛苦。
3 Caffe其实是最简单的
很多人觉得Caffe好难啊,其实我想说,Caffe有可能是最简单的了。它的使用流程如下:
以图像分类任务为例:
(1) 准备数据就是将数据按照Caffe分类任务的输入格式准备如下,这很简单吧,一个Python遍历脚本。
../../../../datas/mouth/1/182smile.jpg 1
../../../../datas/mouth/1/435smile.jpg 1
../../../../datas/mouth/0/40neutral.jpg 0
../../../../datas/mouth/1/206smile.jpg 1
(2) 定义网络,就是去改改网络配置文件train.prototxt,复杂点的写个脚本,卷积层的格式如下:
layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 12 pad: 1 kernel_size: 3 stride: 2 weight_filler { type: "xavier" std: 0.01 } bias_filler { type: "constant" value: 0.2 } } }
一边改一边在Netscope中实时可视化,网络拓扑结构有没有问题一点就能看出来。
(3) 配置训练参数,就是改改下面的文件。
net: "./train.prototxt"
test_iter: 100
test_interval: 10
base_lr: 0.00001
momentum: 0.9
type: "Adam"
lr_policy: "fixed"
display: 100
max_iter: 10000
snapshot: 2000
snapshot_prefix: "./snaps/conv3_finetune"
solver_mode: GPU
(4) 训练,跟大部分框架一样,甚至更加简单。下面是一个finetune模型的例子。
SOLVER=./solver.prototxt
WEIGHTS=./init.caffemodel
../../../../libs/Caffe_Long/build/tools/caffe train -solver $SOLVER -weights $WEIGHTS -gpu 0 2>&1 | tee log.txt
纵观以上任务,你做了啥?不就是写个脚本处理了一下数据,把网络模块化的搭建一下,把优化参数配置一下,整体下来,可能20行Python代码都没有。
恐怕只有像Darknet这样类似的框架才有如此清晰而又简单的过程。
只要把你任务需要的网络层准备好了,用Caffe训练和测试都非常简单,至于网络层不会写,各路大神开源的代码在GitHub上多的很,至少一些基本的视觉任务都是有的。GitHub拿来主义,人人皆会。
4 如何用Caffe学习C++和CUDA
使用Caffe可以非常方便的锻炼自己的C++和CUDA水平,有三步曲。
(1) 阅读学习Caffe的源代码和设计模式。
Caffe的所有源代码都是C++/CUDA写的,使用工厂设计模式,代码结构清晰,可读性和拓展性强,效率高。
(2) 自己添加新的网络层,包括数据层,损失层等。
把C++类的设计,各种数据结构和标准库熟悉并且用起来,把CUDA代码也写一写。这些都是以后去公司从事模型部署和优化框架工作所必须准备好的技能。
(3) 学会用Caffe部署和分析模型。
学会用Caffe去分析每一个网络层的计算量和计算时间,找到性能瓶颈。学会用它把模型进行封装和加密,在嵌入式平台中使用。
Caffe确实没有像Pytorch等框架那么学术而更偏工程,但工程能力正是现在大多数想进入这一行的同学所欠缺的。
你会的,别人不会,才体现出你的价值。
对公司来说重要的,不是你会什么,而是它需要什么。
脱离了工程实践能力的算法工程师,满大街都是,但他们找不到工作。
5 Caffe的稳和缺点
Caffe最大的特点是稳,不像Tensorflow等框架一样更新一次版本后原来的代码就不能用了,库又得重新装了等等,只需要专注于自己的任务即可。
当然版本稳定就带来了一些缺点,比如不支持自动求导,不支持模型级并行,只支持数据级并行,不适合于非图像任务等。
但还是那句话,对于基于卷积神经网络的成熟而通用的任务来说,Caffe是很不错的选择,它的学习价值,也永不褪色。
相关学习资料,可以参考我们的往期文章和GitHub开源框架。
原文发布于微信公众号 - 有三AI(yanyousan_ai)
原文发表时间:2019-09-05
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
发表于 2019-09-062019-09-06 10:11:23
分享
分享文章到朋友圈
分享文章到 QQ
分享文章到微博
复制文章链接到剪贴板
扫描二维码
扫码关注云+社区
领取腾讯云代金券
Original url: Access
Created at: 2019-10-07 12:41:01
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论