caffe源代的码解析.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
caffe源代的码解析

caffe源码简单解析——Blob(1)November 26, 2014?caffe,?源码阅读,?blob使用caffe也有一段时间了,但更多是使用Python的接口,使用现有的ImageNet训练好的模型进行图片分类。为了更好的了解caffe这个框架,也为了提高自己的水平,在对卷积神经网络有了一些研究之后,终于开始研读caffe的源码了,今天看了Blob类的一些内容,做个总结。看过caffe官方文档的话,应该会知道,它可以分为三层:Blob、Layer、Net。Blob是一个四维的数组,用于存储数据,包括输入数据、输出数据、权值等等;Layer层则是神经网络中具体的各层结构,主要是计算的作用,在根据配置文件初始化结构后,前向计算结果,反向更新参数,都是它要做的,而它的输入和输出都是Blob数据;Net的话,就是多个Layer组合而成的有向无环图结构,也就是具体的网络了。Layer和Net的代码有待深入,尤其是Layer的代码,caffe实现了差不多40种不同的Layer层,里面有不同的激活函数,这个要好好研究下。Blob源码解析#include caffe/common.hpp#include caffe/proto/caffe.pb.h#include caffe/syncedmem.hpp#include caffe/util/math_functions.hpp从blob.hpp包含的四个头文件入手,其中caffe.pb.h是google protocol buffer根据caffe.proto自动生成的,可以到src/caffe/proto/caffe.proto里看下caffe里面用到的各个数据的定义,比如BlobProto,Datum,NetParameter等。使用这个protocol buffer看起来确实方便,一方面可以用文本文件定义结构化的数据类型,另一方面可以生成查询效率更高、占空间更小的二进制文件,具体的教程可以看看这里。在caffe/common.hpp,主要singleton化Caffe类,并封装了boost和CUDA随机数生成的函数,提供了统一的接口。而在caffe/syncedmem.hpp中,定义了以下的接口:inlinevoid CaffeMallocHost(void** ptr, size_t size)inlinevoid CaffeFreeHost(void* ptr)主要是分配内存和释放内存的。而class SyncedMemory定义了内存分配管理和CPU与GPU之间同步的函数,也没啥特别的。比较重要的是caffe/util/math_functions.hpp,这里面封装了很多cblas矩阵运算,真是密密麻麻,看的我眼花缭乱、如痴如醉。比如:void caffe_cpu_gemmfloat(const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, constint M, constint N, constint K, constfloat alpha, constfloat* A, constfloat* B, constfloat beta, float* C)封装了cblas_sgemm(CblasRowMajor, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, N),这个计算得到的结果为C=alphaAB+beta*C,也即是A和B两个矩阵的乘积。这里有详细的解释。void caffe_cpu_gemvfloat(const CBLAS_TRANSPOSE TransA, constint M, constint N, constfloat alpha, constfloat* A, constfloat* x, constfloat beta, float* y)是对cblas_sgemv的封装,实现的矩阵与向量的乘积,结果为y=alphaAx+beta*y。void caffe_axpyfloat(constint N, constfloat alpha, constfloat* X, float* Y)封装了cblas_saxpy,实现的是Y=alpha*X+Y里面都是诸如此类的函数,基本是些矩阵和向量的一些处理函数。回到blob类,里面定义了data_(),diff_()指针,用于存放数据,而num_,channel_,?height_,?width_则主要用来做定位offset和reshape处理。对于输入(n, c, h, w)位置的数据位置为((n*channels_+c)*height_+h)*width_+w,可以依据

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档