pycaffe简明文档
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,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
公開屬性 返回的是當前blob的維度數目,相當于len(self.shape) 比如,對于(N,C,H,W)維度的blob,返回的是4reshape(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_inputdata
公開屬性 本質是`Blob<Dtype>::mutable_cpu_data`diff
公開屬性 本質是`Blob<Dtype>::mutable_cpu_diff`caffe.Layer類
blobs
公開屬性 返回blobssetup()
reshape()
phase
公開屬性 層的phasetype
公開屬性 層的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文件,創建solvercaffe.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類
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简明文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫框架:scrapy
- 下一篇: bzoj1049[HAOI2006]数字