深度学习_21天实战Caffe.pdf

 

深度学习_21天实战Caffe.pdf

 


 


第五章

 

 

 

 

 

 


 

 

 

第六章

为什么使用 LMDB、LEVELDB —— 1)统一格式,简化数据读取层的实现;2)提高磁盘IO利用率;

 

熟悉模型描述文件中的参数;

 

 

 

caffe.bin 参数:

usage:caffe<command><args>

# 这个是告诉你使用格式, caffe 后接上 一个command命令,后面再接其他参数

 

commands: #你能选择的命令有一下这么几种

train #训练或者微调一个模型

test  #对一个模型打分

device—query #显示GPU诊断信息

time #评估模型执行时间

 

Flags form tools/caffe.cpp   #其他一些参数的总览

-gpu         (可选;给定时运行GPU模式,用’ , ’分隔开不同的gpu,

                     ‘-gpu all’表示运行在所有可用的gpu设备上,此时有效训练批量大小就是gpu设备数乘以batch_size)

-iterations (循环迭代次数,默认为50)

-level          (可选;定义网络水平,也是NetState中的一个,但我也还不清楚这个的作用)

-model        (指定模型定义文本文件名,xxx.prototxt)

-phase        (可选;网络是处于TEST还是TRAIN阶段,当你使用command中time命令时,再指定phase就可以选择计算TEST或者TRAIN的耗时)

-sighup_effect (可选;当收到SIGHUP信号时要采取的动作,可选项:snapshot、stop、none,默认为snapshot,即打印快照)

-sigint_effect (可选;当收到当收到SIGINT信号时要采取的动作,可选项同上,默认stop)

-snapshot (可选,恢复训练时指定上次中止的快照,就是比如训练到一般按Ctrl+C终止训练(Linux中这个Ctrl+C不是copy,而是终止当前操作),就会得到一个solverstate                        文件,下次恢复训练时就可以指定这个)

-solver       ( 指定sovler.prototxt文件,在train的时候需要这个参数)

-stage        (可选;也是NetState中的一个,但我也还不清楚这个的作用)

-weights    ( 指定用于微调的预训练权值,也即 训练后得到的**.caffemodel文件,不可与snapshot同时出现)
--------------------- 
版权声明:本文为CSDN博主「Teeyohuang」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/teeyohuang/article/details/76778593

 

第七章

 

需要有 LK 个卷积核实现通道数目的转换;

 

 

 

data 指针(只读)
diff 指针(读写)——求导迭代用?

 

 

第八章

Caffe 数据结构

 

    caffe中数据结构主要包括caffe::Net,caffe::Layer,caffe::Solver三个主要大类。下面就这三个主要的数据结构做一下总结。

    1,caffe:Net:这个数据结构用来表示整个网络,这个数据结构里包含了很多重要的变量。

vector< shared_ptr< Layer< Dtype > > > layers_变量存储的是每层layer结构体的指针。
vector< shared_ptr< Blob< Dtype > > > blobs_变量存放的是网络中层与层之间传递的数据,即每层的输入和输出。从这我们可以看出,每层的输入输出并不是存储在对应的层的结构体中的,而是统一存储在Net中。
vector< vector< Blob< Dtype > * > > bottom_vecs_变量存储的是每一层的输入的内存首地址,注意这只是存放的指针,真正的数据还是存放在blobs_中
vector< vector< Blob< Dtype > * > > top_vecs_变量存储的是每一层的输出的内存的首地址,注意这也只是存放指针,真正的数据也是在blobs_中。
vector< shared_ptr< Blob< Dtype > > > params_存放是网络中每一层的参数。
    2,caffe::Layer:这个是存放网络中和每一层有关的数据。

vector< shared_ptr< Blob< Dtype > > > blobs_变量存储每层网络的训练参数,通常有blobs_[0]存储该层网络的weight,blobs_[1]存储该层网络的bias。不管是weight还是bias都是具有blob结构,关于blob结构的数据存储具体是什么样的,以后会有总结。
vector< bool > param_propagate_down_变量是网络另外一个重要变量,这个变量的作用是标记该层网络做不做反向传播。
ector< Dtype > loss_变量是存储每层网络的loss,但是除了loss layer外,基本上其他类型的层的loss都是0。
    基于caffe::Layer类衍生出的类有很多中,这里我们具体介绍几个重要的:

    (1)caffe::BaseConvolutionLayer:这个存储的是convlution层的所需要的参数

int bottom_dim_变量存储的是输入数据的宽度。
int top_dim_变量存储的是输出数据的宽度。
int num_是卷积层的batch size。
int out_spatial_dim_表示一张图片经过一个卷积核后的数据宽度。

int output_offset_这是一个私有成员。
int conv_out_channels_表示这层卷积层有多少个卷积核,这个变量是私有变量。
    (2)caffe::PoolingLayer:这个是pooling层的数据结构,存储和pooling相关的参数

int height_,int width_表示pooling层输入的图像的尺寸。
int pooled_height_,int pooled_width_表示pooling层输出的图像的尺寸。
int kernel_h_,int kernel_w_表示pooling的下采样的核的尺寸。
int channels_表示卷积核的数目。
    (3)caffe::InnerProductLayer:这个内积层,存储内积层有关的参数。内积就是对数据数据进行加权求和:output=input*weight+bias

int M_表示一个batch中的样本数目,即input矩阵的行数目。
int K_表示输入数据的宽度,即input矩阵的列数目和weight矩阵的行数目。
int N_表示输出数据的宽度,即weight矩阵的列数目和output矩阵的列数目。
Blob< Dtype > bias_multiplier_表示对bias进行scale的系数,通常为1,即表示不进行scale。
    (4)caffe::SoftmaxWithLossLayer:这是代价函数层,在经过两层InnerProductLayer之后,输出的数据宽度就是10,这10个数据每一个数据代表输入数据属于某一个标签的分数。在经过caffe:SoftmaxWithLossLayer之后,输出是一个batch中的所有样本的代价函数cost的平均值。

vector< Blob< Dtype > * > softmax_bottom_vec_表示该层的输入,数据宽度为10。
vector< Blob< Dtype > * > softmax_top_vec_表示该层的输出,数据宽度为10。
Blob< Dtype > prob_表示该层输出的概率值(输入相对于各个标签的概率值)。
int outer_num_对应一个batch中的样本数量。
nt inner_num_
    (5)caffe::SoftmaxLayer:这一层是softmax函数层,作用就是把InnerProductLayer的输出转换成概率。

int outer_num_对应一个batch中的样本数量。
    上面就是caffe中layer的主要数据结构,其他数据结构以后回补充。
 ———————————————— 
版权声明:本文为CSDN博主「Buyi_Shizi」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Buyi_Shizi/article/details/51499869

 

Caffe学习系列(16):caffe的整体流程

     在某社区看到的回答,觉得不错就转过来了:http://caffecn.cn/?/question/123

Caffe从四个层次来理解:Blob,Layer,Net,Solver。

1、Blob

    Caffe的基本数据结构,用四维矩阵Batch*Channel*Height*Width表示,存储了包括神经元的

激活值、参数、以及相应的梯度(dW,db)。其中包含有cpu_data、gpu_data、cpu_diff、gpu_diff、

mutable_cpu_data、mutable_gpu_data、mutable_cpu_diff、mutable_gpu_diff这一堆很像的东西,

分别表示存储在CPU和GPU上的数据(印象中二者的值好像是会自动同步成一致的)。其中带data的里面存

储的是激活值和W、b,diff中存储的是残差和dW、db。另外带mutable和不带mutable的一对指针所指

的位置是相同的,只是不带mutable的只读,而带mutable的可写。

2、Layer

     代表神经网络的层,由各种各样的层来构成整个网络。一般一个图像或样本会从数据层中读进来,

然后一层一层的往后传。除了数据层比较特殊之外,其余大部分层都包含4个函数:LayerSetUp、Reshape、

Forward、Backward。其中LayerSetup用于初始化层,开辟空间,填充初始值什么的。Reshape是对输入

值进行维度变换,比如pooling接全连接层的时候要先拉成一个向量再计算。Forward是前向传播,Backward是

后向传播。

    那么数据是如何在层之间传递的呢?每一层都会有一个(或多个)Bottom和top,分别存储输入和输出,

比如bottom[0]->cpu_data()存输入的神经元激活值,换成top存输出的,换成cpu_diff()存的是激活值的残差,

换成gpu是存在GPU上的数据,再带上mutable就可写了,这些是神经元激活值相关的,如果这个层前后有多个输入输出层,

就会有bottom[1],比如accuracy_layer就有两个输入,fc8和label。而每层的参数会存在this->blobs_里,一般this->blobs_[0]

存W,this->blobs_[1]存b,this->blobs_[0]->cpu_data()存的是W的值,this->blobs_[0]->cpu_diff()存的梯度dW,b和db也

类似,然后换成gpu是存在GPU上的数据,再带上mutable就可写了。

3、Net

     Net就是把各种层按train_val.prototxt的定义堆叠在一起,首先进行每个层的初始化,然后不断进行Update,每更新一次就

进行一次整体的前向传播和反向传播,然后把每层计算得到的梯度计算进去,完成一次更新,这里注意每层在Backward中只是计

算dW和db,而W和b的更新是在Net的Update里最后一起更新的。而且在caffe里训练模型的时候一般会有两个Net,一个train一

个test。刚开始训练网络时前面的一大堆输出,网络的结构什么的也都是这里输出的。

4、Solver

     Solver是按solver.prototxt的参数定义对Net进行训练,首先会初始化一个TrainNet和一个TestNet,然后其中的Step函数会

对网络不断进行迭代,主要就是两个步骤反复迭代:①不断利用ComputeUpdateValue计算迭代相关参数,比如计算learning rate,

把weight decay②调用Net的Update函数对整个网络进行更新。迭代中的一大堆输出也是在这里输出的,比如当前的loss

和learning rate。

 

随笔分类 - Caffe

caffe服务器搭建血泪记录

摘要:装过很多次caffe了,但这个还是遇到了很多奇葩问题,不过以前都是在ubuntu上,这次是在centos上。 1、import error _caffe.so: undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDef 阅读全文

posted @ 2019-03-28 10:01 牧马人夏峥 阅读 (265) |  评论 (0) 编辑

caffe:fine-tuning

摘要:http://blog.csdn.net/u010402786/article/details/70141261 https://zhuanlan.zhihu.com/p/22624331 

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值