1. 程式人生 > >caffe原始碼學習記錄(一)

caffe原始碼學習記錄(一)

caffe是由伯克利視覺和學習中心(BVLC)開發的基於C++/CUDA/python實現的深度學習框架。

一. 特點

  1. 實現卷積神經網路架構(CNN)
  2. 速度快,採用google的ProtoBuffer資料格式,提高效率
  3. 完全開源,由C++語言編寫
  4. caffe提供了一整套工具集,可用於訓練、預測、資料預處理等。
  5. caffe自帶一系列參考模型和快速教程

二. 程式碼結構


如上圖為caffe的資料結構,一個CNN模型由Net表示,Net由多個Layer組成,Layer輸入輸出資料由Blob資料結構儲存。

Blob,Layer,Net,Solver這幾個大類,自下而上,環環相扣,貫穿了整個caffe的結構。

  1. Blob是基礎的資料結構、儲存單元,是用來儲存學習到的引數以及網路傳輸過程中產生資料的類。

  2. Layer是網路的基本計算單元,由此派生出了各種層類。修改這部分的人主要是研究特徵表達方向的。
  3. 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