pycaffe简明文档

by ChrisZZ, imzhuo@foxmail.com
2018年01月18日19:00:56

说明
caffe的python接口没有官方说明文档,例如查看一个函数的用法,pytorch能查到所有的用法,而pycaffe则需要自行去查看源码。于是手动写了一个很粗糙的文档,凑合看了。

1.主要根据caffe_root/python/caffe目录下的__init__.py_caffe.cpp来手动生成。

2.以及caffe_root/python/proto/caffe_pb2.py文件(这个文件是从caffe.proto来的,特别大)。

3.还有就是caffe_root/python/caffe/test目录下的这些单元测试文件。

4.其他文件,如io.py, net_spec.py, pycaffe.py, draw.py, classifier.py, detector.py,要么是caffe_pb2.py中众多函数的重要的、有代表性的基本封装和使用,要么就是充当(可能)常用的工具。

5.此外,老版本(如caffe-fast-rcnn)和新版本(如caffe-BVLC)的pycaffe支持的东西,肯定是新版本的多一些。本文档仅仅列出了caffe-fast-rcnn版代码中的函数,更新版本pycaffe中的函数需要自行查看_caffe.cpp做对照理解。

也是醉了,其实可以直接查看从代码和注释生成的文档的:

#在ipython环境下
import caffe
help(caffe.Net)
help(caffe.proto.caffe_pb2)

这里是模板:

className

className.funcName(param1, param2)
@param1 类型,作用
@param2 类型,作用
@descipion 函数的作用是,
@return 类型

caffe.Net

__init__(prototxt, phase)

@param prototxt: 字符串。指定prototxt路径
@param phase: `caffe.TRAIN`或者`caffe.TEST`
@description: 根据prototxt初始化一个网络。相当于C++的:shared_ptr<Net<Dtype> > net(new Net<Dtype>(param_file,static_cast<Phase>(phase)));
@return `Net`类对象,网络实例
@example `net = caffe.Net('test.prototxt', caffe.TEST)`

__init__(prototxt, caffemodel, phase)

@param prototxt: 字符串。指定prototxt路径
@param caffemodel: 字符串,指定caffemodel路径
@param phase: `caffe.TRAIN`或者`caffe.TEST`
@description: 根据prototxt初始化一个网络,并从caffemodel复制同名层的权值(作为网络中该层的权值)。相当于C++的:shared_ptr<Net<Dtype> > net(new Net<Dtype>(param_file,static_cast<Phase>(phase)));net->CopyTrainedLayersFrom(pretrained_param_file);
@return `Net`类对象,网络实例
@example `net = caffe.Net('test.prototxt', 'resnet50.caffemodel', caffe.TEST)`

_forward(start, end)

@param start: int类型
@param end: int类型
@description: 执行前向传播。调用的是C++的`Dtype Net<Dtype>::ForwardFromTo(int start, int end) `
@return: loss值
@example: 类的私有方法,所以不建议使用

_backward(start, end)

@param start: int类型
@param end: int类型
@description: 执行前向传播。调用的是C++的`void Net<Dtype>::BackwardFromTo(int start, int end) `
@return: 没有返回值。
@example: 类的私有方法,所以不建议使用

reshape()

@param: 不需要参数
@description: 网络中的每一层,都执行reshape。调用的C++的`void Net<Dtype>::Reshape() `
@return: 没有返回值类型

copy_from(caffemodel)

@param caffemodel: 字符串类型。指定(pretrained的)caffemodel路径
@description: 读取指定的caffemodel(二进制protobuf文件),从中读取和当前网络同名层的参数作为替代。调用的是C++`void Net<Dtype>::CopyTrainedLayersFrom(const string trained_filename)`
@return: 空
@examplepretrained_caffemodel = 'abc.caffemodel'net = caffe.Net(prototxt, caffe.TEST)net.copy_from(pretrained_caffemodel)(来源:py-faster-rcnn)

copy_from(net)

@param net: (另一个)Net对象
@description: 从Net中读取同名网络层参数作为替代。调用的其实是`void Net<Dtype>::CopyTrainedLayersFrom(const NetParameter& param)`
@return 空
@examplenet = caffe.Net(prototxt, caffe.TEST)resnet = caffe.Net(prototxt_resnet, caffemodel, caffe.TEST)net.copy_from(resnet)

share_with(net)

@param net: Net类型。打算从net上取同名层,和当前网络共享参数。
@description: 和copy_from非常像。区别在于,被share的两个Net对象,同名层的数据是共享的!也就是内存中只有一份!改了一个,另一个也被修改!调用的是C++`void Net<Dtype>::ShareTrainedLayersWith(const Net* other) `
@return 空

_blob_loss_weights

私有属性。
返回loss函数中的每个blob的权值。按照blob_id进行索引。

_bottom_ids(i)

@param i: 层(layer)序号
@return 第i层的bottom们的id列表,`bottom_id_vecs_[i]`

_top_ids(i)

@param i: 层(layer)序号
@return 第i层的top们的id列表,`top_id_vecs_[i]`

_blobs

私有属性
返回blobs(不是很懂!)

layers

公共属性
返回layers

_blob_names

私有属性
返回blob们的名字

_layer_names

私有属性
返回layer们的名字

_inputs

私有属性。
返回`net_input_blob_indices_`,也就是网络输入们的索引们

_outputs

私有属性。
返回`net_output_blob_indices_`,也就是网络输出们的索引们

_set_input_arrays(?)

私有函数。
设定网络输入?(不懂)

save(pth)

@param pth: 字符串类型。指定保存的路径。
@description: 保存当前网络对象到文件(磁盘)。调用的是C++`void Net_Save(const Net<Dtype>& net, string filename) `

caffe.Blob

一开始我觉得这个类在pycaffe中没有被暴露出来,因此没用。
其实不是的。
某个layer的top或者bottom,其实都是Blob的实例。那么这些blob就需要查看相对应的属性、函数。

shape

公开属性
返回当前blob对象(也就是一个tensor)的各个维度信息
常见的:返回N,C,H,W

num

公开属性
Deprecated legacy shape accessor num: use shape(0) instead.

channels

公开属性
Deprecated legacy shape accessor channels: use shape(1) instead.

height

公开属性
Deprecated legacy shape accessor height: use shape(2) instead.

width

公开属性
Deprecated legacy shape accessor width: use shape(3) instead.

count

公开属性
返回的是当前blob的维度数目,相当于len(self.shape)
比如,对于(N,C,H,W)维度的blob,返回的是4

reshape(shape_args)

公开函数
执行reshape操作
例子:im = np.array(caffe.io.load_image('catGray.jpg', color=False)).squeeze()im_input = im[np.newaxis, np.newaxis, :, :]net.blobs['data'].reshape(*im_input.shape)net.blobs['data'].data[...] = im_input

data

公开属性
本质是`Blob<Dtype>::mutable_cpu_data`

diff

公开属性
本质是`Blob<Dtype>::mutable_cpu_diff`

caffe.Layer

blobs

公开属性
返回blobs

setup()

reshape()

phase

公开属性
层的phase

type

公开属性
层的type(??干什么用的?)

caffe.Solver

这个类没有被直接暴露出来使用,而是被作为SGDSolver等子类继承。因此子类中也有这些方法和属性可用,需要查看。

注意
caffe.Solver类没有构造函数!
但是caffe.Solver类的子类(例如caffe.SGDSolver)是有构造函数的!

net

公开属性
Solver所拥有的net对象

test_nets

公开属性
Solver所拥有的所有测试网络(因此是一个列表)

iter

公开属性
Solver对象当前迭代次数

solve(resume_file=None)

公开函数
让当前Solver对象执行求解,也就是执行所有iter。
如果指定`resume_file`那么从该文件继续执行(而不是从0次iter执行)

step(iters)

公开函数
@param iters: 需要执行的迭代次数
@description: 从Solver的当前迭代次数(self.iter)开始,执行iters次迭代。迭代期间可能输出“平滑过的loss"(smoothed_loss),形如:Iteration 20, loss = 3.66
具体见solver.cpp的`void Solver<Dtype>::UpdateSmoothedLoss(Dtype loss, int start_iter,int average_loss)`函数
@return: 空
@example: solver.step(1) #执行一次迭代

restore(state_file)

公开函数
@param state_file: 字符串类型。暂存状态文件的路径。
@description: 从指定的暂存文件state_file中读取(恢复)状态。

snapshot()

公开函数
@description: 将当前solver的网路状态写入暂存文件(solver_state文件)
说明:暂存文件的名字是根据如下规则得到(C++):`param_.snapshot_prefix() + "_iter_" + caffe::format_int(iter_) + ".caffemodel";`
可以通过python代码进行查看(甚至修改snapshot的前缀??):from caffe.proto import caffe_pb2solver_param = caffe_pb2.SolverParameter()print(solver_param.snapshot_prefix)

注意2(TODO):

caffe.SGDSolver.restore(), caffe.Net.copy_from(), caffe.SGDSolver.copy_from(), caffe.SGDSolver.step()等函数,使用前请参考https://github.com/BVLC/caffe/issues/3336

caffe.SGDSolver

caffe.Solver类的子类

__init__(filename)

@param filename: 字符串类型,指定SGDSolver的prototxt描述文件
@descrition 从指定的prototxt文件,创建SGDSolver
@examplesolver_prototxt = 'resnet-50-test.prototxt'self.solver = caffe.SGDSolver(solver_prototxt)

caffe.NesterovSolver

caffe.Solver类的子类

__init__(filename)

同SGDSolver的构造函数

caffe.AdaGradSolver

caffe.Solver类的子类

__init__(filename)

同SGDSolver的构造函数

caffe.RMSPropSolver

caffe.Solver类的子类

__init__(filename)

同SGDSolver的构造函数

caffe.AdaDeltaSolver

caffe.Solver类的子类

__init__(filename)

同SGDSolver的构造函数

caffe.AdamSolver

caffe.Solver类的子类

__init__(filename)

同SGDSolver的构造函数

caffe.get_solver(filename)

公开函数
@param filename: 字符串类型。指定的solver文件
@description: 从指定的solver文件,创建solver

caffe.set_mode_cpu()

caffe.set_mode_gpu()

caffe.set_device(gpu_id)

@param gpu_id: int类型
设定(gpu)id。从0开始。即:第一块显卡是0,第二块显卡是1.

caffe.set_random_seed()

设定随机数种子。
好处:在重复实验的时候,尽量减少随机性。(但其实仅仅是种子一致,无法随机数出现顺序是一样的,因此最后inference结果还是会不一样,只不过波动性小了)

caffe.layer_type_list()

返回各个Layer的类型

caffe.proto.caffe_pb2

这个包下面有很多类。但是很多(也许是全部?)都是从caffe.proto生成的,感觉很蛋疼啊,一个一个的写,肯定写不完的。

大概总结有这些:
LayerNameParameter型,例如:SliceParameter

其他类:

反正,感觉都是在caffe.proto中通过message声明的一个个东西,例如:
caffe.proto.caffe_pb2.SolverParameter类

message SolverParameter {//// Specifying the train and test networks//// Exactly one train net must be specified using one of the following fields://     train_net_param, train_net, net_param, net// One or more test nets may be specified using any of the following fields://     test_net_param, test_net, net_param, net// If more than one test net field is specified (e.g., both net and// test_net are specified), they will be evaluated in the field order given// above: (1) test_net_param, (2) test_net, (3) net_param/net.// A test_iter must be specified for each test_net.// A test_level and/or a test_stage may also be specified for each test_net.//// Proto filename for the train net, possibly combined with one or more// test nets.optional string net = 24;// Inline train net param, possibly combined with one or more test nets.optional NetParameter net_param = 25;optional string train_net = 1; // Proto filename for the train net.repeated string test_net = 2; // Proto filenames for the test nets.optional NetParameter train_net_param = 21; // Inline train net params.repeated NetParameter test_net_param = 22; // Inline test net params.// The states for the train/test nets. Must be unspecified or// specified once per net.//// By default, all states will have solver = true;// train_state will have phase = TRAIN,// and all test_state's will have phase = TEST.// Other defaults are set according to the NetState defaults.optional NetState train_state = 26;repeated NetState test_state = 27;// The number of iterations for each test net.repeated int32 test_iter = 3;// The number of iterations between two testing phases.optional int32 test_interval = 4 [default = 0];optional bool test_compute_loss = 19 [default = false];// If true, run an initial test pass before the first iteration,// ensuring memory availability and printing the starting value of the loss.optional bool test_initialization = 32 [default = true];optional float base_lr = 5; // The base learning rate// the number of iterations between displaying info. If display = 0, no info// will be displayed.optional int32 display = 6;// Display the loss averaged over the last average_loss iterationsoptional int32 average_loss = 33 [default = 1];optional int32 max_iter = 7; // the maximum number of iterations// accumulate gradients over `iter_size` x `batch_size` instancesoptional int32 iter_size = 36 [default = 1];// The learning rate decay policy. The currently implemented learning rate// policies are as follows://    - fixed: always return base_lr.//    - step: return base_lr * gamma ^ (floor(iter / step))//    - exp: return base_lr * gamma ^ iter//    - inv: return base_lr * (1 + gamma * iter) ^ (- power)//    - multistep: similar to step but it allows non uniform steps defined by//      stepvalue//    - poly: the effective learning rate follows a polynomial decay, to be//      zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)//    - sigmoid: the effective learning rate follows a sigmod decay//      return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))//// where base_lr, max_iter, gamma, step, stepvalue and power are defined// in the solver parameter protocol buffer, and iter is the current iteration.optional string lr_policy = 8;optional float gamma = 9; // The parameter to compute the learning rate.optional float power = 10; // The parameter to compute the learning rate.optional float momentum = 11; // The momentum value.optional float weight_decay = 12; // The weight decay.// regularization types supported: L1 and L2// controlled by weight_decayoptional string regularization_type = 29 [default = "L2"];// the stepsize for learning rate policy "step"optional int32 stepsize = 13;// the stepsize for learning rate policy "multistep"repeated int32 stepvalue = 34;// Set clip_gradients to >= 0 to clip parameter gradients to that L2 norm,// whenever their actual L2 norm is larger.optional float clip_gradients = 35 [default = -1];optional int32 snapshot = 14 [default = 0]; // The snapshot intervaloptional string snapshot_prefix = 15; // The prefix for the snapshot.// whether to snapshot diff in the results or not. Snapshotting diff will help// debugging but the final protocol buffer size will be much larger.optional bool snapshot_diff = 16 [default = false];enum SnapshotFormat {HDF5 = 0;BINARYPROTO = 1;}optional SnapshotFormat snapshot_format = 37 [default = BINARYPROTO];// the mode solver will use: 0 for CPU and 1 for GPU. Use GPU in default.enum SolverMode {CPU = 0;GPU = 1;}optional SolverMode solver_mode = 17 [default = GPU];// the device_id will that be used in GPU mode. Use device_id = 0 in default.optional int32 device_id = 18 [default = 0];// If non-negative, the seed with which the Solver will initialize the Caffe// random number generator -- useful for reproducible results. Otherwise,// (and by default) initialize using a seed derived from the system clock.optional int64 random_seed = 20 [default = -1];// type of the solveroptional string type = 40 [default = "SGD"];// numerical stability for RMSProp, AdaGrad and AdaDelta and Adamoptional float delta = 31 [default = 1e-8];// parameters for the Adam solveroptional float momentum2 = 39 [default = 0.999];// RMSProp decay value// MeanSquare(t) = rms_decay*MeanSquare(t-1) + (1-rms_decay)*SquareGradient(t)optional float rms_decay = 38;// If true, print information about the state of the net that may help with// debugging learning problems.optional bool debug_info = 23 [default = false];// If false, don't save a snapshot after training finishes.optional bool snapshot_after_train = 28 [default = true];// DEPRECATED: old solver enum types, use string insteadenum SolverType {SGD = 0;NESTEROV = 1;ADAGRAD = 2;RMSPROP = 3;ADADELTA = 4;ADAM = 5;}// DEPRECATED: use type instead of solver_typeoptional SolverType solver_type = 30 [default = SGD];
}

caffe.proto.caffe_pb2.SolverState类

  244 // A message that stores the solver snapshots245 message SolverState {246   optional int32 iter = 1; // The current iteration247   optional string learned_net = 2; // The file that stores the learned net.248   repeated BlobProto history = 3; // The history for sgd solvers249   optional int32 current_step = 4 [default = 0]; // The current step for learning rate250 }

总之,感受到了protobuf这个出自google的包的强大和可怕。

转载于:https://www.cnblogs.com/zjutzz/p/8319112.html

pycaffe简明文档相关推荐

  1. python读awx文件_Ansible AWX 安装使用简明文档

    Ansible AWX 是 Anisble Tower 的开源版本.和 Tower 一样,提供了运行 Ansible 的 Web 视图和 REST API 接口,展示任务调度和运行的 Dashboar ...

  2. 由设置body线性背景色引发的问题-----当声明文档类型时,对body设置线性背景色,页面背景色无法整体线性过渡...

    问题:当声明文档类型时,对body设置线性背景色,页面背景色无法整体线性过渡 不声明文档类型时,对body设置线性背景色 <HTML> <head> <meta char ...

  3. Caysn打印机安卓平台开发包接口说明文档及打印示例程序_20170609

    Caysn打印机打印开发包接口说明文档中文版:PrinterLibs_For_Android_zh_CN_20170630 Caysn打印机打印开发包接口说明文档英文版:PrinterLibs_For ...

  4. CaysnPrinter安卓平台开发包接口说明文档及打印示例程序 - 20160926

    接口说明文档下载地址: CaysnPrinter安卓平台开发包接口说明文档 - PrinterLibs For Android_20160926 打印示例程序下载地址: Caysn打印机安卓打印示例代 ...

  5. CaysnPrinter开发包接口说明文档及打印示例程序 - 20160715

    接口说明文档下载地址:CaysnPrinter开发包接口说明文档 - PrinterLibs For Android_20160715 打印示例程序下载地址:Caysn打印机安卓打印示例代码 - Sa ...

  6. HTML声明文档类型后样式出错,doctype如何声明

    如何doctype声明,新增的结构元素和功能元素 HTML5已形成了最终的标准,概括来讲,它主要是关于图像,位置,存储,多任务等功能的增加. 新增的元素有绘画 canvas ,用于媒介回放的 vide ...

  7. poscms-说明文档

    1.比那里首页头部的关键字 <meta name="keywords" content="{$meta_keywords}" /> <meta ...

  8. Google 2020 应用与游戏出海 12 月刊: 年终盘点特辑

    又 到岁末时,首先预祝大家圣诞和新年快乐! 感谢在这不平凡的一年中对 Google 和 App campaigns 应用广告系列的大力支持,陪伴我们披荆斩棘,在出海的道路相互扶持,奋勇前行. 2020 ...

  9. php contract的作用,契约(Contracts)

    契约(Contracts) 由 学院君 创建于4年前, 最后更新于 11个月前 版本号 #2 12214 views 7 likes 0 collects 1.简介 Laravel中的契约是指框架提供 ...

最新文章

  1. 介绍下JSP如何进行自动刷新
  2. 反置页表(1__操作系统)
  3. PLSQL Developer中数值字段由科学计数法改为普通数值显示
  4. vue --- [全家桶]vue-router
  5. idea2019配置gradle详解_Constraint Layout 2.0 用法详解
  6. InfoComm China 2019,揭秘“NVIDIA风格”数据科学!
  7. IntelliJ IDEA给Serializable类加上自动的serialVersionUID
  8. android gpu linux,Arm发布针对Mali GPU的Android Linux Vulkan用户空间驱动(HiKey 960,Firefly-RK3288主板)...
  9. java 原子量_JAVA线程10 - 新特性:原子量
  10. ReadOnlyDictionary之应用场景
  11. CentOS7下安装配置Tomcat环境
  12. 群晖服务器自动同步到本地电脑,安装群晖Drive,实现多台电脑文件同步
  13. 思科模拟器Cisco Packet Tracer 7.3 for Mac 安装和汉化(带安装包和汉化包)
  14. 【HarmonyOS HiSpark IPC DIY Camera试用连载2 】一天内极速完成从开箱编译烧写到跑通hello world
  15. pop3接收网易163邮件及下载超大附件
  16. 计算机基础及photoshop的应用,计算机基础及Photoshop应用
  17. 在MAC上如何隐藏文件夹以及查看隐藏文件
  18. 算法设计技巧与分析(六):图遍历(Graph Traversal)
  19. 深度学习--采用ReLU解决消失的梯度问题(vanishing gradient problem)
  20. squid配置透明代理并支持Https及http、https拦截

热门文章

  1. ThinkPHP5 封装邮件发送服务(可发附件)
  2. linux 文件的压缩和打包
  3. Java 压缩解压字符串(支持中文)
  4. 向其他进程注入代码的三种方法
  5. Python2.6 Cx_Oracle Linux下编译安装
  6. mysql使用方法_Mysql的常用用法
  7. 电脑内存占用莫名很高_CPU占用高,电脑莫名卡顿?万能的重启拯救不了就用这3招,妥了!...
  8. 怎么用python画饼状图_Python入门进阶:Python绘制饼图到Microsoft Excel
  9. ※※Java调用Runtime.exec()要注意的问题
  10. linux嵌入式面试题合集,嵌入式linux面试题解析(一)——ARM部分二