caffe 的架构设计及其依赖包的解析
caffe(全称,Convolution Architecture For Feature Extraction) 的安装之所以困难,在于其依赖了大量的第三方开源库:
- 为了读取图像,以及简单的图像处理(拉伸,颜色变化),链接很重的 OpenCV 库
- boost(未来会成为 C++ 的标准,就像STL) 来实现一些 C++11 的特征
- HD5/LMDB/LEVELDB 用来做数据 IO(训练集)
- 避免大量的碎片文件,ImageNet有几百万张图像,(128k的小文件)
- 仅仅是 DB,还不是关系型
- ProtoBuffer(google) 的使用随处可见
- 引入 Protocol buffer 技术,省去编写大量描述性(描述的性质,并不代表可编程性)的 C++ 代码,比如配置参数,属性变量等;
- 这些可以被 protobuffer 的编译器自动地生成 .h 文件和 .cc 文件(在同一个文件夹下)
- 方便序列化,用户可以直接阅读 prototxt 文件,来了解网络结构;
- 引入 Protocol buffer 技术,省去编写大量描述性(描述的性质,并不代表可编程性)的 C++ 代码,比如配置参数,属性变量等;
当然这些如果是放在 Linux 平台下进行安转的话,安装是十分简单的。
1. Caffe 的基本架构
caffe(torch) 是基于层(前向和后向)的设计思路:
Blob 模块,实现了 Tensor(张量,可以通俗地理解为多维矩阵的意思) 的功能,保存数量和梯度值,其具有 4 个维度,分别是:
- number,chanel,height,width
Layer 模块,根据输入(bottom)blob 计算输出 (top)blob,同时保存权重/梯度(神经网络,从图的观点其实代表着DAG,有向无环图),
Net 模块:由多个 layer 组成,实现 forward/backward 计算;
- 从 UML 的关系考虑 Layer 类和 Net 的关系,应当类似于:汽车(Net)与轮胎(Layer),是一种聚合的关系(aggregation)
- C++基础——用C++实例理解UML类图
Solver 模块, 最优化模块,利用梯度值更新权重,
2. caffe 的训练方式
- 需要提前准备数据,保存为 LMDB/LevelDB 等格式(编写脚本);
- 不需编写 C++ 代码,直接编写 .prototxt 定义 Net 对象;
- 直接编写 .prototxt 定义 solver 对象;(用于训练)
- 通过参数直接执行 caffe 命令进行训练;
3. 依赖包
ProtoBuffer:由 caffe 定义的模型,都需要有一个
solver.prototxt文件,其中记录了模型训练所需要的超参,用 caffe 训练时会首先读取该文件,获得其中特定字段的数值,并据此设置内存中模型训练时的超参数变量值;using google::protobuf::io::FileInputStream; const char* filename = "solver.prototxt";
int fid = open(filename, O_RDONLY);
FileInputStream* input = new FileInputStream(fid); caffe::SolverParam solver_param; google::protobuf::TextFormat::Parse(input, &solver_param);
BLAS:卷积神经网络中用到的数学计算主要是矩阵向量的运算,caffe 中调用了 BLAS(Basic Linear Algebra Subprograms,基本线性代数子程序)中的相应方法,最常用的 BLAS 实现主要有以下几种:
- Intel MKL
- ATLAS
- OpenBLAS
caffe 可以选择其中其中任意一种,通过对 Makefile.config 编译文件的配置。Makefile.config 配置文件关于 BLAS 的设置如下所示:
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
caffe 的架构设计及其依赖包的解析的更多相关文章
- Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...
- Caffe实战三(依赖包解析及环境配置)
前面的文章使用的软件环境是开始时通过apt-get命令所安装的,本文将通过编译源码的方式重新配置一个可迁移的软件环境.(参考:<深度学习 21天实战Caffe> 第五天 Caffe依赖包解 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- VICA 架构设计(1)
本文记录最近完成的一个通用实时通信客户端的架构. 背景 我们公司是做税务相关的软件,有针对大客户 MIS 系统,也有针对中小客户的 SaaS 平台.这些系统虽然都是 B/S 的,但是也需要使用 A ...
- [转]Android App整体架构设计的思考
1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...
- iOS应用架构谈(一):架构设计的方法论
当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: 简单来说就是调API,展示页面,然后跳转到别的地方再调API,再展示页面. 那这有什么好 ...
- iOS应用架构谈:架构设计的方法论
缘由 之前安居客iOS app的第二版架构大部分内容是我做的,期间有总结了一些经验.在将近一年之后,前同事zzz在微信朋友圈上发了一个问题:假如问你一个iOS or Android app的架构,你会 ...
- mysql性能调优与架构设计笔记
1.mysql基本介绍 mysql支持多线程高并发的关系型数据库; 数据库存储引擎InnoDB.MyISAM; mysql快速崛起的原因就是他是开源的; 性能一直是mysql自豪的一大特点; 2.my ...
- VICA 架构设计
本文记录最近完成的一个通用实时通信客户端的架构. 背景 我们公司是做税务相关的软件,有针对大客户 MIS 系统,也有针对中小客户的 SaaS 平台.这些系统虽然都是 B/S 的,但是也需要使用 Act ...
随机推荐
- Vmware P2V 清除被隱藏網卡佔用的的IP
修改註冊表也可以讓非正常卸載的網卡釋放捆綁的固定的IP地址,註冊表中定位於中:HKEY_LOCAL_MACHINE \SYSTEM\ CurrentControlSet\Services\Tcpip\ ...
- Unreal Enginer4特性介绍-牛B闪闪的UE4
声明:转载说明出处! unreal4特性介 原文地址: https://www.unrealengine.com/products/unreal-engine-4 unreal engin ...
- Ubuntu下成功安装QQ2013
阳光小强最近用Win8系统感觉特别不爽,中午果断换了一个win7系统,又想着能不能搞个双系统(最近在看一些linux东西),于是就开始整起来.结果并不好,linux虽然整好了,但是硬盘全部格式化了,当 ...
- angular自定义指令相关知识及代码
原文地址 https://www.jianshu.com/p/0c015862156d 大纲 1.自定义指令之——属性指令 2.自定义属性指令的运行原理 3.自定义属性指令代码实践 4.自定义结构指令 ...
- 简要分析武汉一起好P2P平台的核心功能
写作背景 加入武汉一起好,正式工作40天了,对公司的核心业务有了更多的了解,想梳理下自己对于P2P平台的认识. 武汉一起好,自己运营的yiqihao.com,是用PHP实现的,同时也帮助若干P2P平台 ...
- 【Solr专题之九】SolrJ教程 分类: H4_SOLR/LUCENCE 2014-07-28 14:31 2351人阅读 评论(0) 收藏
一.SolrJ基础 1.相关资料 API:http://lucene.apache.org/solr/4_9_0/solr-solrj/ apache_solr_ref_guide_4.9.pdf:C ...
- CMakeListx.txt 编辑语法学习
已hello.cpp为源文件,构建一个CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(hello) add_executable( ...
- ### Hibernate中的事务与并发 ###
**事务相关的概念** 1. 什么是事务 * 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全都成功,要么全都失败. * 转账的例子:冠希给美美转钱,扣钱,加钱.两个操作组成了一个事情! ...
- 编辑器vim简介
vi简介 vi是"Visual interface"的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样.它可以执行输出.删除.查找.替换.块操作等众多文本操作,而且用户 ...
- CF 559B(Equivalent Strings-构造法)
B. Equivalent Strings time limit per test 2 seconds memory limit per test 256 megabytes input standa ...