caffe源码 卷积层】的更多相关文章

通俗易懂理解卷积 图示理解神经网络的卷积 input: 3 * 5 * 5 (c * h * w) pading: 1 步长: 2 卷积核: 2 * 3 * 3 * 3 ( n * c * k * k ) output: 2 * 3 * 3 ( c * h * w ) 如下图所示:  深入理解卷积 首先需要理解caffe里面的im2col和col2im 然后 卷积层 其实和 全连接层 差不多了 理解im2col 图示理解im2col input: 3 * 4 * 4 ( c * h * w )…
Caffe源码阅读(1) 全连接层 发表于 2014-09-15   |   今天看全连接层的实现.主要看的是https://github.com/BVLC/caffe/blob/master/src/caffe/layers/inner_product_layer.cpp 主要是三个方法,setup,forward,backward setup 初始化网络参数,包括了w和b forward 前向传播的实现 backward 后向传播的实现 setup 主体的思路,作者的注释给的很清晰.主要是要…
参考网址:https://www.cnblogs.com/louyihang-loves-baiyan/p/5149628.html 1.caffe代码层次熟悉blob,layer,net,solver几类,blob:作为数据输出的媒介,无论是网络权重参数,还是输入数据,都是转化为blob数据结构来存储.layer:作为网络的基础单元,神经网络中层与层间的数据节点.前后传递都在数据结构中被实现,net:作为网络的整体骨架,决定了网络中的层次数目以及各个层的类别solver:作为网络的求解策略,涉…
本文转载自:https://buptldy.github.io/2016/10/09/2016-10-09-Caffe_Code/ Caffe简介 Caffe作为一个优秀的深度学习框架网上已经有很多内容介绍了,这里就不在多说.作为一个C++新手,断断续续看Caffe源码一个月以来发现越看不懂的东西越多,因此在博客里记录和分享一下学习的过程.其中我把自己看源码的一些注释结合了网上一些同学的注释以及在学习源码过程中查到到的一些资源(包括怎么使用IDE单步调试以及一些Caffe中使用的第三方库的介绍)…
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个caffe.proto文件.proto目录下除了caffe.proto文件外,还有caffe.pb.h和caffe.pb.cc两个文件,此两个文件是根据caffe.proto文件内容自动生成的. caffe.proto文件是一个消息格式文件,后缀名为proto. proto文件即消息协议原型定义文件…
Caffe源码 Blob protected: shared_ptr<SyncedMemory> data_; shared_ptr<SyncedMemory> diff_; shared_ptr<SyncedMemory> shape_data_; vector<int> shape_; int count_; int capacity_; Blob的构造函数 Blob<Dtype>::Blob(const int num, const int…
前言: 由于业务需要,接触caffe已经有接近半年,一直忙着阅读各种论文,重现大大小小的模型. 期间也总结过一些caffe源码学习笔记,断断续续,这次打算系统的记录一下caffe源码学习笔记,巩固一下C++,同时也梳理一下自己之前的理解. 正文: 我们先不看caffe的框架结构,先介绍一下caffe.proto,是google开源的一种数据交互格式--Google Protobuf,这种数据的格式,我们可以看到caffe.proto中内容: syntax = "proto2"; pac…
目录 写在前面 成员变量的含义及作用 构造与析构 内存同步管理 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 在Caffe源码理解1中介绍了Blob类,其中的数据成员有 shared_ptr<SyncedMemory> data_; shared_ptr<SyncedMemory> diff_; std::shared_ptr 是共享对象所有权的智能指针,当最后一个占有对象的shared_ptr被销毁或再赋值时,对象会被自动销毁并释放内存,见cp…
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下syncedmem文件. 1.      include文件: (1).<caffe/common.hpp>:此文件的介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/54955236  : (2).<caffe/util/math_functions.hpp>:此文件的介绍可以参考: http…
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下math_functions文件. 1.      include文件: (1).<glog/logging.h>:GLog库,它是google的一个开源的日志库,其使用可以参考:http://blog.csdn.net/fengbingchun/article/details/48768039: (2).<caffe/common.hpp>.<caf…
caffe目录: ├── build -> .build_release // make生成目录,生成各种可执行bin文件,直接调用入口: ├── cmake ├── CMakeLists.txt ├── CONTRIBUTING.md ├── CONTRIBUTORS.md ├── data ├── distribute ├── docker ├── docs ├── examples //很多demo可以尝试使用: ├── include ├── INSTALL.md ├── LICENSE…
Caffe源码(caffe version:09868ac , date: 2015.08.15)中的一些重要头文件如caffe.hpp.blob.hpp等或者外部调用Caffe库使用时,一般都会include<caffe/common.hpp>文件,下面分析此文件的内容: 1.      include的文件: boost中的智能指针头文件<boost/shared_ptr.hpp>,作用类似于C++11中的模板类shared_ptr,通过引用计数方式自动释放所指的对象,不用显示…
SyncedMemory类简介 最近在阅读caffe源码,代码来自BVLC/caffe,基本是参照网络上比较推荐的 Blob-->Layer-->Net-->Solver 的顺序来分析.其中SyncedMemory类是caffe中底层的结构,负责操作(申请.拷贝等)内存或显存中的数据. syncedmem.cpp源码 SyncedMemory::SyncedMemory() //构造函数,初始化内部的变量,size为0,指针为空等 : cpu_ptr_(NULL), gpu_ptr_(N…
SGD简介 caffe中的SGDSolver类中实现了带动量的梯度下降法,其原理如下,\(lr\)为学习率,\(m\)为动量参数. 计算新的动量:history_data = local_rate * param_diff + momentum * history_data \(\nu_{t+1}=lr*\nabla_{\theta_{t}}+m*\nu_{t}\) 计算更新时使用的梯度:param_diff = history_data \(\Delta\theta_{t+1}=\nu_{t+…
图示池化层(前向传播) 池化层其实和卷积层有点相似,有个类似卷积核的窗口按照固定的步长在移动,每个窗口做一定的操作,按照这个操作的类型可以分为两种池化层: 输入参数如下: 输入: 1 * 3 * 4 * 4 池化核: 4 * 4 pad: 0 步长:2 输出参数如下: 输出:1 * 3 * 2 * 2 MAC (max pooling)在窗口中取最大值当做结果 AVG (average pooling)在窗口中取平均值当做结果 池化层的反向传播 按照前向传播的分类,反向传播也需要分成两类 MAC…
Layer类简介 Layer是caffe中搭建网络的基本单元,caffe代码中包含大量Layer基类派生出来的各种各样的层,各自通过虚函数 Forward() 和 Backward() 实现自己的功能. Forward() 函数用于前向计算过程,由 bottom blob 计算 top blob 和 loss ,实现数据由浅至深的传递.而 Backward() 函数用于反向传播过程,由 top blob 的计算 bottom blob 的梯度,将网络的预测误差向浅层网络传递,以便更新网络的参数.…
Blob类简介 Blob是caffe中的数据传递的一个基本类,网络各层的输入输出数据以及网络层中的可学习参数(learnable parameters,如卷积层的权重和偏置参数)都是Blob类型.Blob内部包含SyncedMemory类型的 data_ (数据,用于前向计算)和 diff_ (梯度,用于反向传播),以及表示数据形状的 shape_data_ (旧版本)和 shape_ (新版本).Blob中还有表示有效数据的个数的变量 count_ 和表示当前数据的最大容量的变量 capaci…
net.cpp部分源码 // 接着上一篇博客的介绍,此部分为Net类中前向反向计算函数,以及一些与HDF5文件或proto文件相互转换的函数. template <typename Dtype> Dtype Net<Dtype>::ForwardFromTo(int start, int end) { //执行第start层到第end层的前向计算过程 CHECK_GE(start, 0); //检查start >= 0, end < 总层数 CHECK_LT(end,…
Net类简介 Net类主要处理各个Layer之间的输入输出数据和参数数据共享等的关系.由于Net类的代码较多,本次主要介绍网络初始化部分的代码.Net类在初始化的时候将各个Layer的输出blob都统一保存在变量blobs_中,利用各个层的输入输出数据在blobs_的位置,可以方便地确定层之间数据传递的关系.Net中还利用类似的方法来存储各个层之间的学习参数,管理层之间的参数共享关系. net.cpp部分源码 template <typename Dtype> Net<Dtype>…
InsertSplits()函数 在Net初始化的过程中,存在一个特殊的修改网络结构的操作,那就是当某层的输出blob对应多个其他层的输入blob时,会在输出blob所在层的后面插入一个新的Split类型的层.大致方式如下图所示,左侧为原始网络的结构,右侧为修改之后的网络结构.个人理解这样做的目的应该是为了在梯度反传时,方便多个分支的梯度能够累加到同一个blob上.左侧图,分别计算出layer1和layer2的blob0的梯度后,在计算layer0的blob0的梯度时,Net类中需要额外增加一些…
转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ Pooling 层一般在网络中是跟在Conv卷积层之后,做采样操作,其实是为了进一步缩小feature map,同时也能增大神经元的视野.在Caffe中,pooling层属于vision_layer的一部分,其相关的定义也在vision_layer.hpp的头文件中.Pooling层的相关操作比较少,在Caffe的自带模式下只有Max pooling和Aver…
转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ Vision_layer里面主要是包括了一些关于一些视觉上的操作,比如卷积.反卷积.池化等等.这里的类跟data layer一样好很多种继承关系.主要包括了这几个类,其中CuDNN分别是CUDA版本,这里先不讨论,在这里先讨论ConvolutionLayer BaseConvolutionLayer ConvolutionLaye DeconvolutionL…
Blob是Caffe中层之间数据流通的单位,各个layer之间的数据通过Blob传递.在看Blob源码之前,先看一下CPU和GPU内存之间的数据同步类SyncedMemory:使用GPU运算时,数据要在GPU显存中,但是一开始数据是通过CPU读到内存,通过类SyncedMemory来实现显存和内存之间的数据的同步. SyncedMemory 先看一下成员变量 //数据在cpu或gpu,指向数据的指针 void* cpu_ptr_; void* gpu_ptr_; size_t size_;//数…
神经网络是由层组成的,深度神经网络就是层数多了.layer对应神经网络的层.数据以Blob的形式,在不同的layer之间流动.caffe定义的神经网络已protobuf形式定义.例如: layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" ...... } 就是定义了一个卷积层,bottom是其前一层,而top是其后一层.前向传播计算过程就是…
目录 写在前面 template method设计模式 Layer 基类 Layer成员变量 构造与析构 SetUp成员函数 前向传播与反向传播 其他成员函数 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 层的概念在深度神经网络中占据核心位置,给定输入,数据在层间运算流动,最终输出结果.层定义了对数据如何操作,根据操作的不同,可以对层进行划分(具体参见Caffe Layers): Data Layers:跟据文件类型和格式读取和处理数据,给网络输入 Visio…
博客:blog.shinelee.me | 博客园 | CSDN Blob作用 据Caffe官方描述: A Blob is a wrapper over the actual data being processed and passed along by Caffe, and also under the hood provides synchronization capability between the CPU and the GPU. Mathematically, a blob is…
原文链接:https://www.zhihu.com/question/27982282 1.Caffe代码层次.回答里面有人说熟悉Blob,Layer,Net,Solver这样的几大类,我比较赞同.我基本是从这个顺序开始学习的,这四个类复杂性从低到高,贯穿了整个Caffe.把他们分为三个层次介绍. Blob:作为数据传输的媒介,无论是网络权重参数,还是输入数据,都是转化为Blob数据结构来存储 Layer:作为网络的基础单元,神经网络中层与层间的数据节点.前后传递都在该数据结构中被实现,层类种…
GPU和CPU实现的不一样,这里贴的是CPU中的drop out 直接看caffe里面的源码吧:(产生满足伯努利分布的随机数mask,train的时候,data除以p,...... scale_ = 1. / (1. - threshold_); template <typename Dtype> void DropoutLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, con…
1.计算的均值和方差是channel的 2.test/predict 或者use_global_stats的时候,直接使用moving average use_global_stats 表示是否使用全部数据的统计值(该数据实在train 阶段通过moving average 方法计算得到)训练阶段设置为 fasle, 表示通过当前的minibatch 数据计算得到, test/predict 阶段使用 通过全部数据计算得到的统计值 那什么是 moving average 呢: 反向传播: 源码:…
Solver类简介 Net类中实现了网络的前向/反向计算和参数更新,而Solver类中则是对此进行进一步封装,包含可用于逐次训练网络的Step()函数,和用于求解网络的优化解的Solve()函数,同时还实现了一些存储.读取网络模型快照的接口函数. solver.cpp源码 template<typename Dtype> void Solver<Dtype>::SetActionFunction(ActionCallback func) { action_request_funct…