caffe原始碼學習記錄(一)
caffe是由伯克利視覺和學習中心(BVLC)開發的基於C++/CUDA/python實現的深度學習框架。
一. 特點:
- 實現卷積神經網路架構(CNN)
- 速度快,採用google的ProtoBuffer資料格式,提高效率
- 完全開源,由C++語言編寫
- caffe提供了一整套工具集,可用於訓練、預測、資料預處理等。
- caffe自帶一系列參考模型和快速教程
二. 程式碼結構:
如上圖為caffe的資料結構,一個CNN模型由Net表示,Net由多個Layer組成,Layer輸入輸出資料由Blob資料結構儲存。
Blob,Layer,Net,Solver這幾個大類,自下而上,環環相扣,貫穿了整個caffe的結構。
- Blob:是基礎的資料結構、儲存單元,是用來儲存學習到的引數以及網路傳輸過程中產生資料的類。
- Layer:是網路的基本計算單元,由此派生出了各種層類。修改這部分的人主要是研究特徵表達方向的。
- Net:是網路的搭建,代表一個完整CNN,將Layer所派生出層類組合成網路。Solver:是Net的求解,修改這部分人主要會是研究DL求解方向的。
三. 具體程式碼結構
- Blob
- Blob型別描述
Caffe內部採用的資料型別主要是對protocol buffer所定義的資料結構的繼承,因此可以在儘可能小的記憶體佔用下獲得很高的效率,雖然追求效能的同時Caffe也會犧牲了一些程式碼可讀性。
Blob在記憶體中表示4維陣列,維度從低到高為(width_,height_,channels_,num_),可分別表示影象的寬和高、顏色通道、影象為第幾幀。Blob儲存資料或權值(data)和權值增量(diff)。
Blob為模板類。宣告在 include/caffe/blob.hpp,使用時需包含該標頭檔案 #include<caffe/blob.hpp> 並使用名稱空間caffe。類的實現在 src/caffe/proto/caffe.proto。
BlobProto物件可以進行磁碟與記憶體中資料的互動。
- Blob重要成員函式和變數
shared_ptr<SyncedMemory> data_; //資料
shared_ptr<SyncedMemory> diff_;//梯度
void Blob<Dtype>::Reshape(const int num, const int channels, const int height,const int width); //重新修改Blob形狀,根據形狀申請動態記憶體資料和梯度
inline int count(int start_axis, int end_axis) const; //計算Blob需要的基本資料單元的數量
- Layer
- Layer型別描述
Layer至少有一個輸入Blob(Bottom Blob)和一個輸出Blob(Top Blob),部分Layer帶有權值(weight)和偏執項(Bias),有兩個運算方向:前向傳播(Forward)和反向傳播(Backward)。其中前向傳播對輸入Blob進行處理得到輸出Blob,反向傳播計算則對輸出Blob的diff進行某種處理,得到輸入Blob的diff。
Layer為抽象類,不能直接建立Layer物件,其大部分函式都只有虛擬函式,函式的真正實現在其派生類中。
標頭檔案 include/caffe/layer.hpp 原始檔src/caffe/layer.cppBlob重要成員函式和變數
- Layer重要成員函式和變數
vector<Dtype> loss_ //每一層都會有一個loss值,但只有LossLayer才會產生非0的loss
vector<shared_ptr<Blob<Dtype> > > blobs_ ;//Layer所學習的引數,包括權值和偏差
virtual void Forward(const vector<Blob<Dtype>*> &bottom,vector<Blob<Dtype>*> *top) = 0;// Layer內部資料正向傳播,從bottom到top方向
virtual void Backward(const vector<Blob<Dtype>*> &top,const vector<bool> &propagate_down,vector<Blob<Dtype>*> *bottom) = 0;
//Layer內部梯度反向傳播,從top到bottom方向
在Layer內部,資料主要有兩種傳遞方式,Forward和Backward,分別有CPU和GPU(部分有)兩種實現。
Layer函式:
layers {
bottom: "decode1neuron" // 該層底下連線的第一個Layer
bottom: "flatdata" // 該層底下連線的第二個Layer
top: "l2_error" // 該層頂上連線的一個Layer
name: "loss" // 該層的名字
type: EUCLIDEAN_LOSS // 該層的型別
loss_weight: 0
}
- Net
- Net型別描述
Net用容器的形式將多個Layer有序地放在一起,其自身實現的功能主要是對逐層Layer進行初始化,以及提供Update( )的介面(更新網路引數),本身不能對引數進行有效地學習過程。
- Net的重要成員函式和變數
vector<shared_ptr<Layer<Dtype> > > layers_ ;//構成該net的layers
void Init(const NetParameter& param);
//根據NetParameter進行net初始化,簡單的來說就是先把網路中所有層的bottom Blobs&top Blobs(無重複)例項化,並從輸入層開始,逐層地進行Setup的工作,從而完成了整個網路的搭建,為後面的資料前後傳輸打下基礎。
vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom,Dtype* loss = NULL);
void Net<Dtype>::Backward();
//是對整個網路的前向和反向傳導,各呼叫一次就可以計算出網路的loss了。
- Solver
- Solver的型別描述
Solver類中包含一個Net的指標,主要是實現了訓練模型引數所採用的優化演算法,根據優化演算法的不同會派生不同的類,而基於這些子類就可以對網路進行正常的訓練過程。
- Solver的重要成員函式和變數
shared_ptr<Net<Dtype> > net_ ;//net物件
virtual void ComputeUpdateValue() = 0;//不同的模型訓練方法通過過載函式ComputeUpdateValue( )實現計算update引數的核心功能
最後當進行整個網路訓練過程(也就是你執行Caffe訓練某個模型)的時候,實際上是在執行caffe.cpp中的train( )函式,而這個函式實際上是例項化一個Solver物件,初始化後呼叫了Solver中的Solve( )方法。而這個Solve( )函式主要就是在迭代執行下面這兩個函式。ComputeUpdateValue();
net_->Update();
caffemodel為訓練好的模型,權重檔案。
solverstate為求解器狀態檔案,存放訓練的中間過程,可暫停後繼續訓練
相關推薦
caffe原始碼學習記錄(一)
caffe是由伯克利視覺和學習中心(BVLC)開發的基於C++/CUDA/python實現的深度學習框架。一. 特點:實現卷積神經網路架構(CNN)速度快,採用google的ProtoBuffer資料格式,提高效率完全開源,由C++語言編寫caffe提供了一整套工具集,可用於
python 學習記錄一
python 每天學習筆記#!/usr/bin/pytholn# -*- coding: UTF-8 -*-import mathimport sysdef print_13(): #for i in range(10): man_age = int(raw_input(‘enter input age:\
學習記錄一
提示 相對 name 獲取 比較 div 就是 其中 dem 今天的話主要的精力都集中在郵件系統demo的實現,因為自己個人技術有限,所以做出來的相當簡陋,在其中碰到的問題其實也是比較多的,對於基於django的郵件相對來說比較容易,然後就是在提交數據,獲取post數據並加
WebService學習記錄(一)
接受 語言 www. info sdl htm 容易 span 數據 1.1 什麽是WebService Web service是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發布、發現、協調
Quartz學習記錄(一)
記錄 lib jobdetail 遞增 引入 指定 sim 其中 基於 1.quartz介紹和下載 官網:http://www.quartz-scheduler.org/ Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以
Linux學習記錄(一)
應用服務 切換目錄 lin 平板電腦 路由器 成熟 區別 領導 計算機硬件 1.Linux的簡介 1.1.Linux的概述 Linux是基於Unix的開源免費的操作系統,由於系統的穩定性和安全性幾乎成為程序代碼運行的最佳系統環境。Linux是由Linus Torvalds(
Nginx學習記錄(一)
under 3.3 學習 color dex 穩定 靜態 inf 推薦 1. 什麽是nginx Nginx是一款高性能的http 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。由俄羅斯的程序設計師Igor Sysoev所開發,官方測試nginx能夠支支撐
MongoDB學習記錄一
users 泰安 系統設置 2.3 默認端口 erp nec acl 負責 本博客說明:最開始部分是一個運維部署案例模板,給開發安裝MongoDB都可以按照這個模板來進行基本部署,中間部分是自己研究其他博客記錄部署和授權相關內容,最後部分是網上視頻學習相關內容;www.mo
Nodejs學習記錄(一)--安裝設置篇
窗口切換 ati strong 直接 32位 回車 oot 目錄 release 安裝Node window window上安裝node可選擇以下兩種方式: 方式一:直接進入官網下載安裝 進入node.js官網點擊windows,選擇.msi後綴的,根據自己的電腦選擇對應的
windbg學習記錄(一)
1、安裝 如果你安裝了WDK或vs的相關版本,你都可以從安裝目錄中找到它們(一般在Debuggers目錄中)。如果沒有,你可以從下面的連結去下載安裝: Install Debugging Tools for Windows 32-bit Version http://www.mi
lua原始碼學習(一)lua的c api外圍實現
工作後,整個人已經比較鬆懈了。儘管一直在看lua的原始碼。可是一直是比較零碎的時間,沒有系統的整理,所以還是收穫不多。由於近期工作也不是非常忙了,就想整理下lua的原始碼學習的筆記。加深下印象,並分享給大家。 先說下這系列bolg我會每週更新2-3篇,沒有順序的 這些文章
jQuery學習記錄一
jQuery:就是JavaScript庫中的一種,jQuery,很多優點 * JavaScript庫也可以叫JavaScript函式庫 * JavaScript庫:把一些瀏覽器相容性的程式碼或者是常用的函式封裝在一個js
Java學習記錄一
計算機基礎知識 ①計算機(Computer)全稱:電子計算機,俗稱電腦。是一種能夠按照程式執行,自動、高速處理海量資料的現代化智慧電子裝置。由硬體和軟體所組成,沒有安裝任何軟體的計算機稱為裸機。常見的形式有臺式計算機、筆記本計算機、大型計算機等。 &nb
caffe 原始碼分析【一】: Blob類
Blob類的: //標頭檔案: include\caffe\blob.hpp //cpp檔案: src\caffe\blob.cpp //cu檔案: src/caffe/blob.cu //定義某layer的輸入blobs const ve
View的學習記錄(一)
View的學習記錄 本篇目的 View的呼叫 View檢視樹 Activity中檢視的結構 View的測量 onMeasure() MeasurSpec類 重寫onMeasure()
git學習記錄一
一.git 安裝。 1.Linux安裝。可以試著輸入git,看系統中是否安裝git,如果沒有安裝會提示: $ git The program 'git' is currently not installed. You can install it by typin
python學習記錄一
一、目的 由於專案釋出點多,更新迭代耗時,想搞一個自動釋出的任務,以前也沒有用python寫過,這個任務當做練手了。 二、步驟 1、安裝python,pip。我安裝的是python3.6,只要在安裝過程中選擇安裝pip即可。 2、首先考慮的是弄一個定時鐘跑,check_
View的工作原理之Measure過程原始碼學習(一)
在Android開發過程中,View控制元件的使用是最基本的技能,而自定義View技能的掌握也是非常重要的。這篇博文講記錄一下在讀任玉剛老師的《Android開發藝術探索》一書中學習到的相關知識以及自己的一些收穫。這裡說明一點,在"View的
FriendlyARM-2440-Mini2440_學習記錄一
部分資訊來自《mini2440使用者手冊》pdf檔案 賬號資訊: user: root (預設設定) password: fa(預設設定) FTP: user:plg password:plg 可以連SSH去控制板子
eos 原始碼學習筆記一
eos 原始碼學習筆記 1、eos 中的常見合約型別 newaccount setcode setabi updateauth deleteauth linkauth unlinkauth canc