Caffe学习笔记2-Caffe的三级结构(Blobs,Layers,Nets)
2015-09-07 15:27
405 查看
根据Caffe官方文档介绍,caffe大致可以分为三层结构blob,layer,net。数据的保存,交换以及操作都是以blob的形式进行的,layer是模型和计算的基础,net整和并连接layer。
设Blob数据维度为 number N x channel K x height H x width W,Blob是row-major保存的,因此在(n, k, h, w)位置的值物理位置为((n * K + k) * H + h) * W + w,其中Number/N是batch size。
Blob同时保存了
Blob会使用SyncedMem自动决定什么时候去copy data以提高运行效率,通常情况是仅当gnu或cpu修改后有copy操作,文档里面给了一个例子:
(顺便查了下一直有疑问foo是什么意思。。)
Blobs
Blob是Caffe的基本数据结构,具有CPU和GPU之间同步的能力,它是4维的数组(Num, Channels, Height, Width)。设Blob数据维度为 number N x channel K x height H x width W,Blob是row-major保存的,因此在(n, k, h, w)位置的值物理位置为((n * K + k) * H + h) * W + w,其中Number/N是batch size。
Blob同时保存了
data和
diff(梯度),访问
data或
diff有两种方法:
1 const Dtype* cpu_data() const; //不修改值 [code]2 Dtype* mutable_cpu_data(); //修改值
Blob会使用SyncedMem自动决定什么时候去copy data以提高运行效率,通常情况是仅当gnu或cpu修改后有copy操作,文档里面给了一个例子:
1 // Assuming that data are on the CPU initially, and we have a blob. [code]2 const Dtype* foo;
3 Dtype* bar; 4 foo = blob.gpu_data(); // data copied cpu->gpu. 5 foo = blob.cpu_data(); // no data copied since both have up-to-date contents. 6 bar = blob.mutable_gpu_data(); // no data copied. 7 // ... some operations ... 8 bar = blob.mutable_gpu_data(); // no data copied when we are still on GPU. 9 foo = blob.cpu_data(); // data copied gpu->cpu, since the gpu side has modified the data 10 foo = blob.gpu_data(); // no data copied since both have up-to-date contents 11 bar = blob.mutable_cpu_data(); // still no data copied. 12 bar = blob.mutable_gpu_data(); // data copied cpu->gpu. 13 bar = blob.mutable_cpu_data(); // data copied gpu->cpu.
(顺便查了下一直有疑问foo是什么意思。。)
Layer
所有的Pooling,Convolve,apply nonlinearities等操作都在这里实现。在Layer中input data用bottom表示,output data用
top表示。每一层定义了三种操作
setup(Layer初始化),
forward(正向传导,根据input计算output),
backward(反向传导计算,根据output计算input的梯度)。
forward和
backward有GPU和CPU两个版本的实现。
Net
Net由一系列的Layer组成(无回路有向图DAG),Layer之间的连接由一个文本文件描述。模型初始化Net::Init()会产生blob和layer并调用
Layer::SetUp。在此过程中
Net会报告初始化进程。这里的初始化与设备无关,在初始化之后通过
Caffe::set_mode()设置
Caffe::mode()来选择运行平台CPU或GPU,结果是相同的。
模型的格式
模型定义在.prototxt文件中,训练好的模型在
model目录下
.binaryproto格式的文件中。模型的格式由
caffe.proto定义。采用Google Protocol Buffer可以节省空间还有它对C++和Pyhton的支持也很好。
相关文章推荐
- 滚动视差插件skrollr.js
- JavaScript简单下拉菜单实例代码
- jquery 淡入淡出
- js操作cookie
- JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例
- Caffe学习笔记1-安装以及代码结构
- leetcode-25 Reverse Nodes in k-Group
- js fs read json 文件json字符串无法解析
- JavaScript中getBoundingClientRect()方法详解
- css3 阴影处理及兼容
- JavaScript(js)设置默认输入焦点(focus)
- JS实现倒计时(时、分,秒)
- JS 事件学习笔记(一)
- jquery的幻灯片图片切换效果代码分享
- js 格式化时间日期函数小结
- Axure样式编辑器与变量管理
- json和jsonp的传输方式
- Ember.js 入门指南——扩展(reopen)
- Ember.js 入门指南——扩展(reopen)
- 慕课网上学习JS的笔记