pycaffe简明文档
pycaffe簡明文檔
by ChrisZZ, imzhuo@foxmail.com
2018年01月18日19:00:56
說明
caffe的python接口沒有官方說明文檔,例如查看一個函數(shù)的用法,pytorch能查到所有的用法,而pycaffe則需要自行去查看源碼。于是手動寫了一個很粗糙的文檔,湊合看了。
1.主要根據(jù)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中眾多函數(shù)的重要的、有代表性的基本封裝和使用,要么就是充當(dāng)(可能)常用的工具。
5.此外,老版本(如caffe-fast-rcnn)和新版本(如caffe-BVLC)的pycaffe支持的東西,肯定是新版本的多一些。本文檔僅僅列出了caffe-fast-rcnn版代碼中的函數(shù),更新版本pycaffe中的函數(shù)需要自行查看_caffe.cpp做對照理解。
也是醉了,其實可以直接查看從代碼和注釋生成的文檔的:
#在ipython環(huán)境下 import caffe help(caffe.Net) help(caffe.proto.caffe_pb2)這里是模板:
className類
className.funcName(param1, param2)
@param1 類型,作用
@param2 類型,作用
@descipion 函數(shù)的作用是,
@return 類型
caffe.Net類
__init__(prototxt, phase)
@param prototxt: 字符串。指定prototxt路徑 @param phase: `caffe.TRAIN`或者`caffe.TEST` @description: 根據(jù)prototxt初始化一個網(wǎng)絡(luò)。相當(dāng)于C++的:shared_ptr<Net<Dtype> > net(new Net<Dtype>(param_file,static_cast<Phase>(phase))); @return `Net`類對象,網(wǎng)絡(luò)實例 @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: 根據(jù)prototxt初始化一個網(wǎng)絡(luò),并從caffemodel復(fù)制同名層的權(quán)值(作為網(wǎng)絡(luò)中該層的權(quán)值)。相當(dāng)于C++的:shared_ptr<Net<Dtype> > net(new Net<Dtype>(param_file,static_cast<Phase>(phase)));net->CopyTrainedLayersFrom(pretrained_param_file); @return `Net`類對象,網(wǎng)絡(luò)實例 @example `net = caffe.Net('test.prototxt', 'resnet50.caffemodel', caffe.TEST)`_forward(start, end)
@param start: int類型 @param end: int類型 @description: 執(zhí)行前向傳播。調(diào)用的是C++的`Dtype Net<Dtype>::ForwardFromTo(int start, int end) ` @return: loss值 @example: 類的私有方法,所以不建議使用_backward(start, end)
@param start: int類型 @param end: int類型 @description: 執(zhí)行前向傳播。調(diào)用的是C++的`void Net<Dtype>::BackwardFromTo(int start, int end) ` @return: 沒有返回值。 @example: 類的私有方法,所以不建議使用reshape()
@param: 不需要參數(shù) @description: 網(wǎng)絡(luò)中的每一層,都執(zhí)行reshape。調(diào)用的C++的`void Net<Dtype>::Reshape() ` @return: 沒有返回值類型copy_from(caffemodel)
@param caffemodel: 字符串類型。指定(pretrained的)caffemodel路徑 @description: 讀取指定的caffemodel(二進(jìn)制protobuf文件),從中讀取和當(dāng)前網(wǎng)絡(luò)同名層的參數(shù)作為替代。調(diào)用的是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中讀取同名網(wǎng)絡(luò)層參數(shù)作為替代。調(diào)用的其實是`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上取同名層,和當(dāng)前網(wǎng)絡(luò)共享參數(shù)。 @description: 和copy_from非常像。區(qū)別在于,被share的兩個Net對象,同名層的數(shù)據(jù)是共享的!也就是內(nèi)存中只有一份!改了一個,另一個也被修改!調(diào)用的是C++`void Net<Dtype>::ShareTrainedLayersWith(const Net* other) ` @return 空_blob_loss_weights
私有屬性。 返回loss函數(shù)中的每個blob的權(quán)值。按照blob_id進(jìn)行索引。_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_`,也就是網(wǎng)絡(luò)輸入們的索引們_outputs
私有屬性。 返回`net_output_blob_indices_`,也就是網(wǎng)絡(luò)輸出們的索引們_set_input_arrays(?)
私有函數(shù)。 設(shè)定網(wǎng)絡(luò)輸入?(不懂)save(pth)
@param pth: 字符串類型。指定保存的路徑。 @description: 保存當(dāng)前網(wǎng)絡(luò)對象到文件(磁盤)。調(diào)用的是C++`void Net_Save(const Net<Dtype>& net, string filename) `caffe.Blob類
一開始我覺得這個類在pycaffe中沒有被暴露出來,因此沒用。
其實不是的。
某個layer的top或者bottom,其實都是Blob的實例。那么這些blob就需要查看相對應(yīng)的屬性、函數(shù)。
shape
公開屬性 返回當(dāng)前blob對象(也就是一個tensor)的各個維度信息 常見的:返回N,C,H,Wnum
公開屬性 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
公開屬性 返回的是當(dāng)前blob的維度數(shù)目,相當(dāng)于len(self.shape) 比如,對于(N,C,H,W)維度的blob,返回的是4reshape(shape_args)
公開函數(shù) 執(zhí)行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_inputdata
公開屬性 本質(zhì)是`Blob<Dtype>::mutable_cpu_data`diff
公開屬性 本質(zhì)是`Blob<Dtype>::mutable_cpu_diff`caffe.Layer類
blobs
公開屬性 返回blobssetup()
reshape()
phase
公開屬性 層的phasetype
公開屬性 層的type(??干什么用的?)caffe.Solver類
這個類沒有被直接暴露出來使用,而是被作為SGDSolver等子類繼承。因此子類中也有這些方法和屬性可用,需要查看。
注意
caffe.Solver類沒有構(gòu)造函數(shù)!
但是caffe.Solver類的子類(例如caffe.SGDSolver)是有構(gòu)造函數(shù)的!
net
公開屬性 Solver所擁有的net對象test_nets
公開屬性 Solver所擁有的所有測試網(wǎng)絡(luò)(因此是一個列表)iter
公開屬性 Solver對象當(dāng)前迭代次數(shù)solve(resume_file=None)
公開函數(shù) 讓當(dāng)前Solver對象執(zhí)行求解,也就是執(zhí)行所有iter。 如果指定`resume_file`那么從該文件繼續(xù)執(zhí)行(而不是從0次iter執(zhí)行)step(iters)
公開函數(shù) @param iters: 需要執(zhí)行的迭代次數(shù) @description: 從Solver的當(dāng)前迭代次數(shù)(self.iter)開始,執(zhí)行iters次迭代。迭代期間可能輸出“平滑過的loss"(smoothed_loss),形如:Iteration 20, loss = 3.66 具體見solver.cpp的`void Solver<Dtype>::UpdateSmoothedLoss(Dtype loss, int start_iter,int average_loss)`函數(shù) @return: 空 @example: solver.step(1) #執(zhí)行一次迭代restore(state_file)
公開函數(shù) @param state_file: 字符串類型。暫存狀態(tài)文件的路徑。 @description: 從指定的暫存文件state_file中讀取(恢復(fù))狀態(tài)。snapshot()
公開函數(shù) @description: 將當(dāng)前solver的網(wǎng)路狀態(tài)寫入暫存文件(solver_state文件) 說明:暫存文件的名字是根據(jù)如下規(guī)則得到(C++):`param_.snapshot_prefix() + "_iter_" + caffe::format_int(iter_) + ".caffemodel";` 可以通過python代碼進(jìn)行查看(甚至修改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()等函數(shù),使用前請參考https://github.com/BVLC/caffe/issues/3336
caffe.SGDSolver類
caffe.Solver類的子類
__init__(filename)
@param filename: 字符串類型,指定SGDSolver的prototxt描述文件 @descrition 從指定的prototxt文件,創(chuàng)建SGDSolver @examplesolver_prototxt = 'resnet-50-test.prototxt'self.solver = caffe.SGDSolver(solver_prototxt)caffe.NesterovSolver類
caffe.Solver類的子類
__init__(filename)
同SGDSolver的構(gòu)造函數(shù)caffe.AdaGradSolver類
caffe.Solver類的子類
__init__(filename)
同SGDSolver的構(gòu)造函數(shù)caffe.RMSPropSolver類
caffe.Solver類的子類
__init__(filename)
同SGDSolver的構(gòu)造函數(shù)caffe.AdaDeltaSolver類
caffe.Solver類的子類
__init__(filename)
同SGDSolver的構(gòu)造函數(shù)caffe.AdamSolver類
caffe.Solver類的子類
__init__(filename)
同SGDSolver的構(gòu)造函數(shù)caffe.get_solver(filename)
公開函數(shù) @param filename: 字符串類型。指定的solver文件 @description: 從指定的solver文件,創(chuàng)建solvercaffe.set_mode_cpu()
caffe.set_mode_gpu()
caffe.set_device(gpu_id)
@param gpu_id: int類型 設(shè)定(gpu)id。從0開始。即:第一塊顯卡是0,第二塊顯卡是1.caffe.set_random_seed()
設(shè)定隨機(jī)數(shù)種子。 好處:在重復(fù)實驗的時候,盡量減少隨機(jī)性。(但其實僅僅是種子一致,無法隨機(jī)數(shù)出現(xiàn)順序是一樣的,因此最后inference結(jié)果還是會不一樣,只不過波動性小了)caffe.layer_type_list()
返回各個Layer的類型caffe.proto.caffe_pb2包
這個包下面有很多類。但是很多(也許是全部?)都是從caffe.proto生成的,感覺很蛋疼啊,一個一個的寫,肯定寫不完的。
大概總結(jié)有這些:
LayerNameParameter型,例如:SliceParameter
其他類:
反正,感覺都是在caffe.proto中通過message聲明的一個個東西,例如:
caffe.proto.caffe_pb2.SolverParameter類
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的包的強(qiáng)大和可怕。
轉(zhuǎn)載于:https://www.cnblogs.com/zjutzz/p/8319112.html
總結(jié)
以上是生活随笔為你收集整理的pycaffe简明文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫框架:scrapy
- 下一篇: bzoj1049[HAOI2006]数字