引言

最近正在自学caffee,发现很多地方需要反复地揣摩与回顾,于是决定写这篇文章,一来是方便自己回顾,加深记忆,另一方面也希望能够与他人多交流,为后来者行个方便(caffee的中文文档是在是太少了)。

概述

总的来说呢,caffe的语言相当简洁,实现的细节都被封装起来了,所以学起来很快,但也正是因为封装得太厉害,所以细节性,基础性的东西很难弄懂,属于易学难精的类型(这个和Java有点像)caffee的模型包含了如下五个方面,blob,Layers,Nets,Loss,Slover,其中Layer和Nets是caffee的物理组成部分,blob是层与层之间所传输的数据流,slover则时net在计算后的求解,而Loss是每一次训练(原文是iteration:迭代)之后于预期目标的差度测量,下面我们将分不同的方面来共同学习caffee的组成与运行机理。

Blob

Blob的一些综述

1.blob的思想则类似与计算机网络中的帧,每一帧都是信息的封装,但在blob中不包含控制信息,其本身是一个标准向量,只起到了通过标准化来存储和传输数据的作用例如:一组图片,一些训练参数等,同时blob还可以在CPU和GPU之间来进行同步操作(我觉得这是使用Blob的最大优点)。(说实话我觉得如果可以在blob中封装控制信息的话也许会大大增加blob的灵活性)
2.blob的物理储存方式,blob的存储是行优先的,所以对于一个矩阵中索引为(n,k,h,w)的数据:如它在物理内存中的存储位置就应该是((n * K + k) * H + h) * W + w.(注:4维的向量在做图片的深度学习时还是很有用的,例如对于一组256张图片进行处理,每个图像为RGB三通道,那么就可以设n为第n张图像,k=3,h,w为图像上的像素)
3.使用blob时所需的时blob格式因人而异的,比如我们要设定一个有96个大小为11*11,输入通道为3的滤波器的卷积层时,就需要设定96*3*11*11的blob,而对于一个有1000个输入通道和1024个输出通道的全链接层进行设置时,就需要设定blob为1000*1024.
4.对于不同的data,我们要设定不同的blob,但只要blob设定完成,Layer就会自动调整为合适的模式,这也是caffee比较简洁,较易上手的原因之一。

Blob的实现细节

1.Blob中通常存储两种类型的数据:value和diff,前着时实际输入的数据,而后者时通过网络计算出的梯度,有两种方法来获取blob中的值:常量法和变量法,实现语句如下:

const Dtype* cpu_data() const;//Dtype 的用法待查
Dtype* mutable_cpu_data;

(注:在phyon中Dtype是用来表示数组属性的一种数据类型,我们可以根据Dtype来自行生成数组,猜测Dtype在caffee中也有着类似的应用,还希望大家能给予指点)
这个函数里面有一些实现细节用来增加存取速率并在cpu与GPU之间做同步,那一部分先挖个坑,暂时不写,总之只要记住,在不需要改变blob值的时候不要用mutable_cpu_data(),同时,也不要自行操作指针,只要使用caffee提供的函数即可。
2.在实际操作的时候如果电脑有GPU,那么每一次从硬盘读取数据到Blob中时,都会调用GPU运算,并且只要层中有GPU执行步骤,那么所有的中间数据都会存储在GPU中。下面是你想查看Blob复制数据时间的代码:

//Assumaing that the data in the CPU initially,and we have the blob
const *Dtype foo;
Dtype* bar;
foo=blob.gpu_data(); // data copied cpu->gpu.
foo=blob.cpu_data();//no data copied since both have the up-to-date contents
bar=blob.mutable_gpu_data()//no data copied
/*......some operations*/
bar=blob.mutable_gpu_data()//no data copied since we are still on the GPU
foo=blob.cpu_data;//data copied gpu->cpu,since the gpu side has modified the data
bar=blob.mutable_gpu_data();//data copied cpu->gpu
bar=blob.mutable_cpu_data();//data copied gpu->cpu

Layer

Layer是构成caffe的存在基础,一般会在filter层和pooling之间进行切换,但也不是一定的,例如在Computing the Stereo Matching Cost with a Convolutional Neural Network这篇文章中,作者使用了八个全链接层来进行matching cost(也就时caffee中的loss)的计算,并没有使用pooling层。不同的layer有着不同的功能,例如读入数据,数据归一化,计算loss等。
对于每一个Layer,在设定时都有着setup,forward和backward三个部分,下面将分别来介绍
1.set:在建立层的时候初始化其各个参数以及连接
2.forward:由input端从底层接收数据,通过计算后向顶层发送数据
3.backword:将顶层计算出的梯度图发送到底部,然后根据输出来重新调整自己的参数(这个我理解的不太好,如果有误的话还请大神们指出)
需要明确的是,一般每层会有两个forward和两个backword,一个是用于GPU,另一个是CPU,如果只使用一个的话caffe内部也有机制能够解决,但可能会牺牲效率。

Net

1.功能

net的功能是通过把每一层联立起来定义一个计算梯度向量的函数,在这个联立的过程中,每一层的forward都被用于我们的目标,如分类,检索,匹配等,而每一层的backword部分则用于计算我们在实现这个过程中的loss(也有文章中叫cost)

2.结构

net的结构是由一系列的layer组成的DAG(direct acyclic graph有向无环图,下同),一般来说一个net是由一个data layer开始从磁盘读取数据最终有一个losslayer结束来计算本次iteration的loss。下图就是一个简单的例子,从纯文本中读取数据并进行分类loss的计算。

代码结构如下

name:"LogReg"
layer
{name:"mnist";typer:"Data";top:"data";top"label";data_param{source:"input_leveldb";batch_size:64;}
}

3.初始化

net的初始化是由Net::Init来进行,初始化主要是做两件事,1.通过创建相应的blob和layer来创建相应的DAG.
2.呼叫layer的setup()函数
在建立完成后,我们可以通过Caffee::mode()来调用gpu或cpu的切换

caffee学习中文指南(1)(1)相关推荐

  1. 伪官宣:Envoy 中文指南新鲜出炉

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前言 Envoy 是专为大型现代 SOA(面向服务架构) ...

  2. TensorFlow 深度学习中文第二版·翻译完成

    原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...

  3. Git和Github介绍,294页『Git与Github学习使用指南』分享

    1 前言 相信大家写代码的时候,心里肯定想找一个别人写好的,可以直接上手的代码,再做相应的修改和改进.那哪里有这些代码呢? 答案自然是Github了,那GitHub又是啥? GitHub是世界上最大的 ...

  4. 2023年的深度学习入门指南(14) - 不能只关注模型代码

    2023年的深度学习入门指南(14) - 不能只关注模型代码 最近,有一张大模型的发展树非常流行: 这个图是相当不错的,对于加深对于Transformer模型编码器.解码器作用的理解,模型的开源和闭源 ...

  5. MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南

    MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库. 有关 MySQL 远程管理软件,你可以选择 ...

  6. HTML5视频教程,HTML5项目实战,HTML5中文指南,HTML5使用手册

    HTML5视频教程,HTML5项目实战,HTML5中文指南,HTML5使用手册. 超过2G 的 HTML5 视频教程免费分享,免费下载! 尚硅谷前端HTML5视频_HTML & CSS 核心基 ...

  7. Google Guava 中文指南

    温馨提示:Guava 中文指南的 GitHub 地址为「guava-guide」,欢迎大家Star.Fork,纠错. Guava 中文指南 Guava 项目包含若干被 Google 的 Java 项目 ...

  8. 太绝了!大佬总结的《PyCharm中文指南》开放下载

    最近由云计算大佬明哥原创的 <PyCharm 中文指南>一书,开始火爆整个 Python 圈,发布仅一个月的时间,下载量就突破了 12000,如今在 Github 上收获了 800 的 s ...

  9. Unity学习资源指南[精心整理]

    前言 进入一个领域,最直接有效的方法就是寻找相关综述性文章,首先你需要对你入门的领域有个概括性的了解,这些包括: 1.主流的学习社区与网站. 2.该领域的知名大牛与热心分享的从业者. 3.如何有效的激 ...

  10. biopython中文指南_Biopython新手指南-第1部分

    biopython中文指南 When you hear the word Biopython what is the first thing that came to your mind? A pyt ...

最新文章

  1. 杀进程和取文件最近使用时间
  2. pandas 替换 某列大于_pandas数据分析总结大全(入门加进阶)
  3. 前端工程师系列,TCP复习及浓缩总结(全干货,支持面试)
  4. python if条件判断和while循环 练习题
  5. 【BZOJ-2938】病毒 Trie图 + 拓扑排序
  6. Windows10系统Python2.7通过Swig调用C++过程
  7. 如何给100亿个数字排序
  8. 从CSDN用户密码泄露谈一些非技术安全对策
  9. k-means算法概述
  10. comon lisp标准_Common Lisp 的一些函数
  11. Delphi开发Web的MVC框架
  12. 计算机模拟求解流体力学方程,计算流体力学模拟(CFD模拟)FLUENT中的湍流模型(一)...
  13. excel 图表 保持矢量图格式 粘贴进word
  14. 4、【办公自动化】Python实现Word转PDF
  15. mysql的性能瓶颈_Mysql性能优化(一) - 性能检测与瓶颈分析
  16. 我的工作必装软件清单
  17. POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”
  18. Aspose.Words 复制表格并将复制的表格插入原有表格后面
  19. Python Web简介
  20. 如何区分光接入网OLT, ONU, ODN,ONT?

热门文章

  1. FP-growth算法原理解析
  2. 中国数控机床行业市场竞争态势及投资战略规划报告2022-2028年版
  3. headfirstjava 学习笔记(chapter1-5)
  4. Windows内核学习------双机调试的安装(物理机win10,虚拟机win7,虚拟机软件vmware)
  5. 【新书推荐】【2020】卫星通信(第三版)
  6. Flash MX游戏制作常用代码解析
  7. Appium+python自动化(二十六)- 烟花一瞬,昙花一现 -Toast提示(超详解)
  8. android 自定义View【2】对话框取色色盘取色的实现
  9. Linux串口调试工具
  10. javaMD5加密生成key方法