深度学习_21天实战Caffe.pdf
?
深度學習_21天實戰Caffe.pdf
?
- 原
深度學習21天實戰caffe學習筆記《1:深度學習的過往》
1. 深度學習DL: 1.1、有監督學習、無監督學習、過擬合、訓練樣本、泛化、訓練集、驗證集、測試集這些和深度學習有關的知識需要實現明白,這里有一個深度學習的資料你們可以去下載; http://download.csdn.net/detail/julialove102123/9840329 1.2、相關公司及牛人和技術: Google------->Geoffrey ...
2017-05-12 13:56:32?閱讀數 1246?評論數 0
- 原
深度學習21天實戰實戰caffe學習筆記《5 : Mnist手寫體識別案例》
Mnist手寫體識別案例源碼詳解MNISTMNIST是一個大型手寫體數字識別數據庫,廣泛應用與機器學習領域的訓練和測試。包括60000個訓練集和10000個測試集,每張圖都已經進行尺寸歸一化、數據居中處理,固定大小為28×28像素。?數據集使用Caffe源碼目錄中data/mnist下用get_mnist.sh腳本下載。$ cd data/mnist/ $ ./get_mnist.shmnist數...
2017-11-23 16:10:27?閱讀數 270?評論數 0
- 原
深度學習21天實戰caffe學習筆記《6 : Caffe代碼梳理》
Caffe代碼梳理1、caffe目錄結構2、caffe閱讀路線:src/caffe/proto/caffe.proto ? ? ? ? ?了解基本數據結構內存對象和磁盤文件的一一映射,主要由ProtoBuffer工具完成;include頭文件 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?理解整個框架,從基類向派生類順藤摸瓜;.cpp和.cu文件 ? ? ? ? ? ? ? ? ?...
2018-01-17 19:20:50?閱讀數 260?評論數 0
- 原
深度學習21天實戰caffe學習筆記《7 :Caffe數據結構》
Caffe數據結構一、基本概念二、Blob:Caffe的基本存儲單元blob:四維數組,維度從低到高(width_,height_,channels_,num_);用于存儲和交換數據;存儲數據或者權值(data)和權值增量(diff);提供統一的存儲器接口,持有一批圖像或其他數據、權值、權值更新值;進行網絡計算時,每層的輸入、輸出都需要通過Blob對象緩沖。(1)基本用法可自動同步CPU/GPU上...
2018-01-25 11:41:45?閱讀數 372?評論數 0
- 原
深度學習21天實戰caffe學習筆記《8:Caffe I/O模塊》
運行caffe例程前,詳見原始數據轉換為LMDB格式,訓練網絡時需要由數據讀取層(DataLayer)不斷從LMDB讀取數據,送入后續卷積,下采樣等層。1、數據讀取層DataLayer:DataLayer是Layer的派生類,可以讀取LMDB、LEVELDB,還可以從原始圖像直接讀取ImageDataLayer;(1)數據結構描述(2)數據讀取層實現聲明:include/caffe/data_la...
2018-01-25 16:40:07?閱讀數 184?評論數 0
- 原
深度學習21天實戰caffe學習筆記《9:Caffe 模型》
一個深度學習模型的參數包括三部分:可學習參數:又稱可訓練參數、神經網絡權系數、權重,其數值由模型初始化參數、誤差方向傳播過程控制,一般不可人工干預。在內存中用Blob對象保持,必要時以二級制ProtoBuffer文件(*.caffemodel)形態序列化并存儲于磁盤上,便于進一步微調(finetune, 又稱精調)、共享(例如參數服務器Parameter Server,PS)、性能評估(bench...
2018-01-25 17:39:12?閱讀數 180?評論數 0
- 原
深度學習21天實戰實戰caffe學習筆記<10:Caffe前向傳播>
wait~
2018-01-31 17:47:07?閱讀數 207?評論數 0
- 原
深度學習21天實戰實戰caffe學習筆記<11:Caffe 反向傳播>
wait
2018-01-31 17:47:44?閱讀數 169?評論數 0
- 原
深度學習21天實戰caffe學習筆記《12:Caffe 最優化求解過程》
caffe相關代碼注釋:https://github.com/QueenJuliaZxx/Caffe1、求解器Solver目的:讓損失函數達到全局最小;特性:負責記錄優化過程,創建用于學習的訓練網絡和用于評估學習效果的測試網絡;調用Forward--&gt;調用Backword--&gt;更新權值,反復迭代優化模型;周期性地評估測試網絡;在優化過程中為模型、求解器狀態打快照;為了讓權值從初始化狀態...
2018-01-31 20:15:33?閱讀數 281?評論數 0
- 原
深度學習21天實戰caffe學習筆記《2 :深度學習工具》
深度學習工具匯總 1. Caffe【Convolutional Architecture for Fast Feature Embedding】 —基于C++/CUDA/Python 實現的卷積神經網絡,提供面向命令行、matlab、python的接口; —可以讀源代碼 —Caffe的main class:Blob 、Layer 、Net 、Solver —Protocol B...
2017-05-12 15:22:48?閱讀數 941?評論數 0
- 原
深度學習21天實戰caffe學習筆記《0 : caffe包解析》
caffe包解析(linux)一、目錄圖片①build文件夾,用來存放編譯結果②camke文件夾,使用cmake的時候會用到③data文件夾,用來存放原始數據、和獲取新數據的腳本,里面有cifar10、ilsvrc12、mnist數據④distribute文件夾,編譯后生成發布包的位置⑤docker文件夾,使用Docker工具進行遷移⑥docs文件夾,包含有很多說明性內容的文檔,特別是那個tuto...
2017-11-23 09:53:34?閱讀數 239?評論數 0
- 原
深度學習21天實戰caffe學習筆記《3 :準備Caffe環境》
準備Caffe環境【如果是其他環境下的配置就請繞道嘍,我也沒有專門去試一試各個環境下的配置,請諒解~】官網 http://caffe.berkeleyvision.org/installation.html;首先在這里介紹一下我的硬件環境:Ubuntu 14.04 ---------[ win10遠程連接ssh(putty)+VNC ]:http://www.ubuntu.com/download...
2017-07-14 20:33:40?閱讀數 1170?評論數 1
- 原
深度學習21天實戰caffe學習筆記《4 : Caffe依賴包解析》
Caffe依賴包解析1、ProtoBuffer : 從.prototxt文件讀取到內存【.proto記錄了模型訓練所需要的超參數(eg:solver.prototxt)】caffe中把它當做權值和模型的載體(類似于txt、bin、圖形化等);統一的參數方案都建立在這個參數描述文件.proto中,用.protoc編譯即可,便于模塊集成;跨語言(c++、java、python)安裝路徑不是系統默認路徑...
2017-11-23 09:35:59?閱讀數 274?評論數 0
- 原
Caffe安裝過程中相關問題
一、caffe是主要是C/C++和Python編寫的。首先,得需要將gcc,g++(gcc版本推薦4.4.7)安裝好,通過yum安裝就可以。 二、cuda的安裝,如果機器上配置了NVIDIA系列GPU,則需要安裝該驅動,推薦安裝該驅動至7.0版本,推薦同時安裝cuDNN。安裝可以參考http://blog.csdn.NET/xuanyuansen/article/details/
2018-02-01 12:51:43?閱讀數 164?評論數 0
- 原
caffe中的學習率的衰減機制
根據? caffe/src/caffe/proto/caffe.proto 里的文件,可以看到它有以下幾種學習率的衰減速機制: 1. fixed:?? 在訓練過程中,學習率不變; 2. step:??它的學習率的變化就像臺價一樣;step by step 的; 其中的?gamma?與?stepsize需要設置的; 3.exp :表示指數型的,其中參數?gamma?需要設置; ? ...
2018-01-29 21:50:15?閱讀數 987?評論數 1
- 原
深度學習21天實戰caffe學習筆記《13:Caffe 實用工具》
Caffe框架編譯后會生成動態鏈接庫libcaffe.so,其本身不能獨立運行。寫一個mai()函數,調用Caffe的API,編譯時包含相應的頭文件,鏈接時加入livcaffe.so,構成一個完整的Caffe應用程序。1、訓練和預測通過命令向caffe.bin傳遞不同的參數(train/test),來實現深度神經網絡的訓練、預測。細讀:tools/caffe.cpp(包含caffe訓練選項、caf...
2018-01-31 17:48:08?閱讀數 195?評論數 0
- 原
深度學習21天實戰實戰caffe學習筆記《14:Caffe可視化方法》
1、數據可視化Matlab:數據可視化不依賴Caffe環境,可以在任意位置運行代碼,建議安裝Matlab R2014以上版本;安裝:cd MATHWORKS_R2014A sudo ./install -javadir=/opt/jvm/jdk1.8.0_77 注意:(1).安裝過程中使用破解文件夾Crack內Readme.txt中的序列號;安裝完成后使用破解文件夾Crack內 license_4...
2018-01-31 17:49:03?閱讀數 250?評論數 0
- 原
深度學習21天實戰caffe學習筆記《15:Caffe計算加速》
1、caffe的計時功能??可以對比不同硬件、不同算法、不同模型的處理耗時情況,使得可以有針對性的進行硬件、算法、模型選型和評估;對當前平臺上網絡各層前向/反向進行計時: ? ? ?$./build/tools/caffe.bin time \2、Caffe GPU加速模式顯卡配置高,需要大功率的電源和散熱系統。可以租用GPU云服務器,如阿里云HPC:https://www.aliyun.com/...
2018-01-31 17:48:39?閱讀數 274?評論數 0
- 原
深度學習21天實戰caffe學習筆記《16:Caffe遷移和部署》
Caffe的遷移和部署1、從開發測試到生產部署 : 離線訓練、在線識別開發:離線訓練階段數據專家選擇訓練數據,算法專家設計模型參數,開發專家優化和調試訓練過程,得到滿足發布的模型,在caffe中表現為*.caffemodel文件;部署:在線識別階段利用發布模型到線上或者某個嵌入式平臺生產機器,接入線上其他服務(存儲、數據庫),獲取在線數據并用上述模型處理,將結果返回客戶端。并且將異常結果反饋給開發...
2017-11-23 17:51:40?閱讀數 383?評論數 0
- 原
深度學習21天實戰caffe學習筆記《17:學習資源》
按書上的進程今天應該就是新生了~全然木有學完tensorflow的激動,不過呢~~應該找個項目虐虐自己了~ 以下是資源哦~從書上扒下來的 ~~#~#**
2017-05-12 15:46:58?閱讀數 491?評論數 3
?
-
學習:Ubuntu14.04編譯caffe問題記錄
問題一:libunwind.so.8: undefined reference //usr/lib/x86_64-linux-gnu/libunwind.so.8: undefined reference to `lzma_index_end@XZ_5.0'? //usr/lib/x86_64-linux-gnu/libunwind.so.8: undefined reference
2017-06-27 21:43:21?閱讀數 1298?評論數 0
- 原
Caffe之prototxt
1、可視化工具: http://ethereon.github.io/netscope/quickstart.html 2、常用網絡模型caffe-model之.prototxt: https://github.com/soeaver/caffe-model 3、python生成.prototxt文件工具: http://blog.csdn.net/c406495762/articl
2018-01-24 20:31:35?閱讀數 3378?評論數 0
- 原
深度學習21天實戰實戰caffe學習<查看機器已經安裝的環境>
補充一下安裝吧~因為發現很多人都很頭疼那個這個問題,尤其是這種別人安裝到半路,跑路的!!! 目前我上手的機器以及有了這些個零件,我就只能看看配置了,這個過程很痛苦,因為你不知道,前人對他做了什么,你就像改bug一樣,慢慢來~~~: PART1:查看已經安裝的相關版本 Ubuntu14.04 python:2.7.6 scw4750@scw4750:~$ python --version
2017-11-23 10:23:24?閱讀數 425?評論數 0
- 轉
【Caffe安裝】caffe安裝系列——史上最詳細的安裝步驟
發現一篇蠻詳細的caffe安裝步驟: 轉載 自:http://blog.csdn.net/haoji007/article/details/52081273 說明 網上關于caffe的安裝教程非常多,但是關于每一步是否操作成功,出現了什么樣的錯誤又該如何處理沒有給出說明。因為大家的操作系統的環境千差萬別,按照博客中的教程一步步的安裝,最后可能失敗——這是很常見的哦。有的教程甚
2018-01-08 16:56:15?閱讀數 914?評論數 0
第五章
?
?
?
?
?
?
?
?
?
第六章
為什么使用 LMDB、LEVELDB —— 1)統一格式,簡化數據讀取層的實現;2)提高磁盤IO利用率;
?
熟悉模型描述文件中的參數;
?
?
?
caffe.bin 參數:
| usage:caffe<command><args> # 這個是告訴你使用格式, caffe 后接上 一個command命令,后面再接其他參數 ? commands: #你能選擇的命令有一下這么幾種 train?#訓練或者微調一個模型 test??#對一個模型打分 device—query #顯示GPU診斷信息 time?#評估模型執行時間 ? Flags form tools/caffe.cpp???#其他一些參數的總覽 -gpu ????????(可選;給定時運行GPU模式,用’ , ’分隔開不同的gpu, ?????????????????????‘-gpu all’表示運行在所有可用的gpu設備上,此時有效訓練批量大小就是gpu設備數乘以batch_size) -iterations (循環迭代次數,默認為50) -level ?????????(可選;定義網絡水平,也是NetState中的一個,但我也還不清楚這個的作用) -model ???????(指定模型定義文本文件名,xxx.prototxt) -phase ???????(可選;網絡是處于TEST還是TRAIN階段,當你使用command中time命令時,再指定phase就可以選擇計算TEST或者TRAIN的耗時) -sighup_effect (可選;當收到SIGHUP信號時要采取的動作,可選項:snapshot、stop、none,默認為snapshot,即打印快照) -sigint_effect (可選;當收到當收到SIGINT信號時要采取的動作,可選項同上,默認stop) -snapshot (可選,恢復訓練時指定上次中止的快照,就是比如訓練到一般按Ctrl+C終止訓練(Linux中這個Ctrl+C不是copy,而是終止當前操作),就會得到一個solverstate ???????????????????????文件,下次恢復訓練時就可以指定這個) -solver ??????( 指定sovler.prototxt文件,在train的時候需要這個參數) -stage ???????(可選;也是NetState中的一個,但我也還不清楚這個的作用) -weights????( 指定用于微調的預訓練權值,也即 訓練后得到的**.caffemodel文件,不可與snapshot同時出現) |
?
第七章
?
需要有 LK 個卷積核實現通道數目的轉換;
?
?
?
data 指針(只讀)
diff 指針(讀寫)——求導迭代用?
?
?
第八章
Caffe 數據結構
?
| ????caffe中數據結構主要包括caffe::Net,caffe::Layer,caffe::Solver三個主要大類。下面就這三個主要的數據結構做一下總結。 ????1,caffe:Net:這個數據結構用來表示整個網絡,這個數據結構里包含了很多重要的變量。 vector< shared_ptr< Layer< Dtype > > >?layers_變量存儲的是每層layer結構體的指針。 vector< shared_ptr< Blob< Dtype > > >?blobs_變量存儲每層網絡的訓練參數,通常有blobs_[0]存儲該層網絡的weight,blobs_[1]存儲該層網絡的bias。不管是weight還是bias都是具有blob結構,關于blob結構的數據存儲具體是什么樣的,以后會有總結。 ????(1)caffe::BaseConvolutionLayer:這個存儲的是convlution層的所需要的參數 int?bottom_dim_變量存儲的是輸入數據的寬度。 int?height_,int?width_表示pooling層輸入的圖像的尺寸。 int?M_表示一個batch中的樣本數目,即input矩陣的行數目。 vector< Blob< Dtype > * >?softmax_bottom_vec_表示該層的輸入,數據寬度為10。 int?outer_num_對應一個batch中的樣本數量。 |
| ? |
| Caffe學習系列(16):caffe的整體流程 ? ? ?在某社區看到的回答,覺得不錯就轉過來了:http://caffecn.cn/?/question/123 Caffe從四個層次來理解:Blob,Layer,Net,Solver。 1、Blob ? ? Caffe的基本數據結構,用四維矩陣Batch*Channel*Height*Width表示,存儲了包括神經元的 激活值、參數、以及相應的梯度(dW,db)。其中包含有cpu_data、gpu_data、cpu_diff、gpu_diff、 mutable_cpu_data、mutable_gpu_data、mutable_cpu_diff、mutable_gpu_diff這一堆很像的東西, 分別表示存儲在CPU和GPU上的數據(印象中二者的值好像是會自動同步成一致的)。其中帶data的里面存 儲的是激活值和W、b,diff中存儲的是殘差和dW、db。另外帶mutable和不帶mutable的一對指針所指 的位置是相同的,只是不帶mutable的只讀,而帶mutable的可寫。 2、Layer ? ? ?代表神經網絡的層,由各種各樣的層來構成整個網絡。一般一個圖像或樣本會從數據層中讀進來, 然后一層一層的往后傳。除了數據層比較特殊之外,其余大部分層都包含4個函數:LayerSetUp、Reshape、 Forward、Backward。其中LayerSetup用于初始化層,開辟空間,填充初始值什么的。Reshape是對輸入 值進行維度變換,比如pooling接全連接層的時候要先拉成一個向量再計算。Forward是前向傳播,Backward是 后向傳播。 ? ??那么數據是如何在層之間傳遞的呢?每一層都會有一個(或多個)Bottom和top,分別存儲輸入和輸出, 比如bottom[0]->cpu_data()存輸入的神經元激活值,換成top存輸出的,換成cpu_diff()存的是激活值的殘差, 換成gpu是存在GPU上的數據,再帶上mutable就可寫了,這些是神經元激活值相關的,如果這個層前后有多個輸入輸出層, 就會有bottom[1],比如accuracy_layer就有兩個輸入,fc8和label。而每層的參數會存在this->blobs_里,一般this->blobs_[0] 存W,this->blobs_[1]存b,this->blobs_[0]->cpu_data()存的是W的值,this->blobs_[0]->cpu_diff()存的梯度dW,b和db也 類似,然后換成gpu是存在GPU上的數據,再帶上mutable就可寫了。 3、Net ? ? ?Net就是把各種層按train_val.prototxt的定義堆疊在一起,首先進行每個層的初始化,然后不斷進行Update,每更新一次就 進行一次整體的前向傳播和反向傳播,然后把每層計算得到的梯度計算進去,完成一次更新,這里注意每層在Backward中只是計 算dW和db,而W和b的更新是在Net的Update里最后一起更新的。而且在caffe里訓練模型的時候一般會有兩個Net,一個train一 個test。剛開始訓練網絡時前面的一大堆輸出,網絡的結構什么的也都是這里輸出的。 4、Solver ? ? ?Solver是按solver.prototxt的參數定義對Net進行訓練,首先會初始化一個TrainNet和一個TestNet,然后其中的Step函數會 對網絡不斷進行迭代,主要就是兩個步驟反復迭代:①不斷利用ComputeUpdateValue計算迭代相關參數,比如計算learning rate, 把weight decay②調用Net的Update函數對整個網絡進行更新。迭代中的一大堆輸出也是在這里輸出的,比如當前的loss 和learning rate。 |
| ? |
隨筆分類 - Caffecaffe服務器搭建血淚記錄 摘要:裝過很多次caffe了,但這個還是遇到了很多奇葩問題,不過以前都是在ubuntu上,這次是在centos上。 1、import error _caffe.so: undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDef?閱讀全文 posted @?2019-03-28 10:01?牧馬人夏崢 閱讀 (265) |??評論 (0)?編輯 caffe:fine-tuning 摘要:http://blog.csdn.net/u010402786/article/details/70141261 https://zhuanlan.zhihu.com/p/22624331?閱讀全文 posted @?2017-11-14 11:26?牧馬人夏崢 閱讀 (42) |??評論 (0)?編輯 concat layer 摘要:參考:http://blog.csdn.net/bailufeiyan/article/details/50876728#reply?閱讀全文 posted @?2017-10-11 11:04?牧馬人夏崢 閱讀 (50) |??評論 (0)?編輯 fatal error: google/protobuf/arena.h:沒有那個文件或目錄 摘要:安裝caffe時make all會出現這個錯誤,按照https://github.com/BVLC/caffe/issues/4988說法,可能時libprotobuf-dev過時了,需要從源碼重新變異protobuf。 首先安裝:sudo apt-get install autoconf auto?閱讀全文 posted @?2017-09-30 13:43?牧馬人夏崢 閱讀 (881) |??評論 (0)?編輯 深度學習工具 摘要:python圖像標記工具labelTool: http://blog.csdn.net/wuzuyu365/article/details/52523061 可視化工具,支持prototxt可視化:http://ethereon.github.io/netscope/#/editor?閱讀全文 posted @?2016-12-08 09:22?牧馬人夏崢 閱讀 (163) |??評論 (0)?編輯 Caffe學習系列(17): blob 摘要:對于blob.h文件。 先看成員變量。定義了6個保護的成員變量,包括前、后向傳播的數據,新、舊形狀數據(?), 數據個數及容量。 再看成員函數。包括構造函數(4個參數),reshape(改變blob形狀),以及很多inline函數。 #ifndef CAFFE_BLOB_HPP_ #define C?閱讀全文 posted @?2016-12-05 08:56?牧馬人夏崢 閱讀 (1373) |??評論 (0)?編輯 faster r-cnn 在CPU配置下訓練自己的數據 摘要:因為沒有GPU,所以在CPU下訓練自己的數據,中間遇到了各種各樣的坑,還好沒有放棄,特以此文記錄此過程。 1、在CPU下配置faster r-cnn,參考博客:http://blog.csdn.net/wjx2012yt/article/details/52197698#quote 2、在CPU下訓?閱讀全文 posted @?2016-12-03 09:51?牧馬人夏崢 閱讀 (7340) |??評論 (0)?編輯 如何學習caffe 摘要:知乎上的討論:https://www.zhihu.com/question/27982282 從0開始山寨caffe系列:http://www.cnblogs.com/neopenx/archive/2016/02.html caffe源碼閱讀系列:http://blog.csdn.net/xize?閱讀全文 posted @?2016-11-24 21:43?牧馬人夏崢 閱讀 (204) |??評論 (0)?編輯 Caffe學習系列(15):添加新層 摘要:如何在Caffe中增加一層新的Layer呢?主要分為四步: (1)在./src/caffe/proto/caffe.proto 中增加對應layer的paramter message; (2)在./include/caffe/***layers.hpp中增加該layer的類的聲明,***表示有com?閱讀全文 posted @?2016-11-19 21:43?牧馬人夏崢 閱讀 (7067) |??評論 (0)?編輯 Caffe學習系列(14):Caffe代碼閱讀 摘要:知乎上這位博主畫的caffe的整體結構:https://zhuanlan.zhihu.com/p/21796890?refer=hsmyy Caffe 做train時的流程圖,來自http://caffecn.cn/?/question/242?閱讀全文 posted @?2016-11-19 10:06?牧馬人夏崢 閱讀 (371) |??評論 (0)?編輯 Caffe學習系列(16):caffe的整體流程 摘要:在某社區看到的回答,覺得不錯就轉過來了:http://caffecn.cn/?/question/123 Caffe從四個層次來理解:Blob,Layer,Net,Solver。 1、Blob Caffe的基本數據結構,用四維矩陣Batch*Channel*Height*Width表示,存儲了包括神?閱讀全文 posted @?2016-11-19 09:49?牧馬人夏崢 閱讀 (5013) |??評論 (0)?編輯 Caffe學習系列(12):不同格式下計算圖片的均值和caffe.proto 摘要:均值是所有訓練樣本的均值,減去之后再進行訓練會提高其速度和精度。 1、caffe下的均值 數據格式是二進制的binaryproto,作者提供了計算均值的文件compute_image_mean, 計算均值時調用: 生成的均值文件保存在mean_binaryproto。 2、python格式下的均值(?閱讀全文 posted @?2016-11-09 22:07?牧馬人夏崢 閱讀 (1506) |??評論 (0)?編輯 Caffe學習系列(11):數據可視化環境(python接口)配置 摘要:參考:http://www.cnblogs.com/denny402/p/5088399.html 這節配置python接口遇到了不少坑。 1、我是利用anaconda來配置python環境,在將caffe根目錄下的python文件夾加入到環境變量這一步時遇到 問題,我用那個命令打開后不知道怎么加入?閱讀全文 posted @?2016-08-31 22:18?牧馬人夏崢 閱讀 (254) |??評論 (0)?編輯 Caffe學習系列(10):命令行解析 摘要:訓練網絡命令: 用預先訓練好的權重來fine-tuning模型,需要一個caffemodel,不能和-snapshot同時使用 參考:http://www.cnblogs.com/denny402/p/5076285.html?閱讀全文 posted @?2016-08-30 21:38?牧馬人夏崢 閱讀 (73) |??評論 (0)?編輯 Caffe學習系列(9):solver優化方法 摘要:介紹了各種優化算法 參考:http://www.cnblogs.com/denny402/p/5074212.html?閱讀全文 posted @?2016-08-30 21:36?牧馬人夏崢 閱讀 (217) |??評論 (0)?編輯 Caffe學習系列(8):solver,train_val.prototxt,deploy.prototxt及其配置 摘要:solver是caffe的核心。 http://www.cnblogs.com/denny402/p/5074049.html train_val.prototxt,deploy.prototxt的比較:http://blog.csdn.net/fx409494616/article/details?閱讀全文 posted @?2016-08-30 21:33?牧馬人夏崢 閱讀 (93) |??評論 (0)?編輯 caffe學習系列(7):Blob,layer,Net介紹 摘要:參考:http://www.cnblogs.com/denny402/p/5073427.html?閱讀全文 posted @?2016-08-24 23:16?牧馬人夏崢 閱讀 (100) |??評論 (0)?編輯 caffe學習系列(6):其他層介紹 摘要:主要包括softmax-loss層(與softmax有區別),全連接層(Inner Prouduct),accuracy層,reshape層, Dropout層。 softmax: accuracy reshape Dropout層 參考:http://www.cnblogs.com/denny40?閱讀全文 posted @?2016-08-24 23:07?牧馬人夏崢 閱讀 (74) |??評論 (0)?編輯 caffe學習系列(5):激活層介紹 摘要:參考:http://www.cnblogs.com/denny402/p/5072507.html 主要介紹了各個激活函數。?閱讀全文 posted @?2016-08-24 23:02?牧馬人夏崢 閱讀 (83) |??評論 (0)?編輯 caffe學習系列(4):視覺層介紹 摘要:視覺層包括Convolution, Pooling,?Local Response Normalization (LRN), im2col等層。 這里介紹下conv層。 輸入:n*c0*w0*h0 輸出:n*c1*w1*h1 其中,c1就是參數中的num_output,生成的特征圖個數 w1=(w0?閱讀全文 posted @?2016-08-24 22:58?牧馬人夏崢 閱讀 (126) |??評論 (0)?編輯 caffe學習系列(3):數據層介紹 摘要:一個模型由多個層構成,如Data,conv,pool等。其中數據層是模型的最底層,是模型的入口。 提供數據的輸入,也提供數據從Blobs轉換成別的格式進行保存輸出還包括數據的預處理(如減去 均值, 放大縮小, 裁剪和鏡像等)。數據源來自高效的數據庫(如LevelDB和LMDB),或者hdf5 文件和?閱讀全文 posted @?2016-08-24 22:40?牧馬人夏崢 閱讀 (85) |??評論 (0)?編輯 caffe學習系列(2):訓練和測試自己的圖片 摘要:參考:http://www.cnblogs.com/denny402/p/5083300.html 上述主要介紹的是從自己的原始圖片轉為lmdb數據,再到訓練、測試的整個流程(另外可參考薛開宇的筆記)。 用的是自帶的caffenet(看了下結構,典型的CNN),因為沒有GPU,整個過程實在是太慢了,?閱讀全文 posted @?2016-08-24 22:22?牧馬人夏崢 閱讀 (335) |??評論 (0)?編輯 caffe學習系列(1):圖像數據轉換成db(leveldb/lmdb)文件 摘要:參考:http://www.cnblogs.com/denny402/p/5082341.html 上述博文用caffe自帶的兩張圖片為例,將圖片轉為db格式。博主對命令參數進行了詳細的解釋,很贊。 遇到的問題是,因為對linux命令不熟,不知為啥創建.sh文件不成功,于是將其他文件下的.sh文件拷?閱讀全文 posted @?2016-08-24 20:39?牧馬人夏崢 閱讀 (448) |??評論 (0)?編輯 |
?
Blob
Blob:Caffe的基本存儲單元
blob:
四維數組,維度從低到高(width_,height_,channels_,num_);
用于存儲和交換數據;存儲數據或者權值(data)和權值增量(diff);
提供統一的存儲器接口,持有一批圖像或其他數據、權值、權值更新值;
進行網絡計算時,每層的輸入、輸出都需要通過Blob對象緩沖。
?
| Blob其實從代碼的角度看,它是一個模板類。Blob封裝了運行時的數據信息(存儲、交換和處理網絡中正反向傳播時的數據和導數信息),并且在CPU和GPU之間具有同步處理的能力。 ? 對于圖像處理來說,Blob是一個四維數組,(N, C, H ,W), 其中N表示圖片的數量,C表示圖片的通道數,H表示圖片的高度, W表示圖片的寬度。除了圖片數據,Blob也可以用于非圖片數據。比如傳統的多層感知機,就是比較簡單的全連接網絡,用2D的Blob,調用innerProduct層來計算就可以了。 ? 在模型中設定的參數,也是用Blob來表示和運算。它的維度會根據參數的類型不同而不同。比如:在一個卷積層中,輸入一張3通道圖片,有96個卷積核,每個核大小為11*11,因此這個Blob是96*3*11*11. 而在一個全連接層中,假設輸入1024通道圖片,輸出1000個數據,則Blob為1000*1024。 |
Caffe.proto中Blob的描述
// Specifies the shape (dimensions) of a Blob.該結構描述Blob的形狀信息 message BlobShape {repeated int64 dim = 1 [packed = true]; // 只包含若干int64類型的值,分別表示Blob每個維度的大小。packed表示這些值緊密排布 }message BlobProto { //該結構表示Blob載磁盤中序列化后的形態optional BlobShape shape = 7; //可選,包括一個個BlobShape對象repeated float data = 5 [packed = true]; //包括若干的(repeated)浮點類型的元素,存儲數據,權值;元素數目由shape或者(num,channels,height,width)確定repeated float diff = 6 [packed = true]; //包括若干的浮點類型的元素,來存儲增量信息(diff),維度與上面的data一致repeated double double_data = 8 [packed = true]; //與data并列,只是類型是doublerepeated double double_diff = 9 [packed = true]; //與diff并列,只是類型是double// 4D dimensions -- deprecated. Use "shape" instead. 可選的維度信息,新版本Caffe推薦使用shape來代替optional int32 num = 1 [default = 0];optional int32 channels = 2 [default = 0];optional int32 height = 3 [default = 0];optional int32 width = 4 [default = 0]; }// The BlobProtoVector is simply a way to pass multiple blobproto instances around.存放多個BlobProto實例的對應Index,易于引用? message BlobProtoVector {repeated BlobProto blobs = 1;| 說明 | proto |
| 該結構描述了Blob的形狀信息 | message BlobShape { |
| ? | ? |
| 只包括若干int64類型值,分別表示Blob | ? |
| 每個維度的大小,packed表示這些值在內存 | ? |
| 中緊密排布,沒有空洞 | repeated int64 dim = 1 [packed = true]; |
| ? | } |
| 說明 | proto |
| 該結構描述Blob在磁盤中序列化后的形態 | message BlobProto { |
| 可選,包括一個BlobShape對象 | optional BlobShape shape = 7; |
| 包括若干護墊元素, | ? |
| 用于存儲增量信息,元素數目由shape或 | ? |
| (num,channels,height,width)確定 | ? |
| ,這些元素在內存總緊密排布 | repeated float data = 5 [packed = true]; |
| ? | ? |
| 包括若干護墊元素, | ? |
| 用于存儲增量信息,維度與data粗細一致 | repeated float diff = 6 [packed = true]; |
| 與data并列,知識類型為double | repeated double double_data = 8 [packed = true]; |
| 與diff并列,只是內心為double | repeated double double_diff = 9 [packed = true]; |
| ? | ? |
| 可選的維度信息,新版本caffe | ? |
| 推薦使用shape,而不再后面的值 | // 4D dimensions -- deprecated. Use "shape" instead. |
| ? | optional int32 num = 1 [default = 0]; |
| ? | optional int32 channels = 2 [default = 0]; |
| ? | optional int32 height = 3 [default = 0]; |
| ? | optional int32 width = 4 [default = 0]; |
| ? | } |
?
Blob 的強大之處在于可以自動同步 CPU/GPU 上的數據
a.Update();//執行 Update 操作,將 diff 與 data 融合,這也是CNN 權值更新步驟的最終實施者
在Update 函數中,實現了 data=data-diff 操作。這個在CNN權值更新時會用到。
?
BlogProto 對象實現了磁盤、內存之間的數據通信,這對于保存、載入訓練好的模型權值非常實用。
?
Blobproto對象實現了磁盤、內存之間的數據通信,這對于保存、載入訓練好的模型非常實用。
不用BlobShape和BlobProto二實用ProtoBuffer的原因:
1>、結構體的序列化/反序列化操作需要額外的編程思想,難以做到接口標準化;
2>、結構體中包含變長數據時,需要更加細致的工作保證數據完整性。ProtoBuffer將變成最容易出現問題的地方加以隱藏,讓機器自動處理,提高了出的健壯性。
?
?
https://blog.csdn.net/calvinpaean/article/details/84066848
Caffe 內存管理分析
| 在Caffe的分層結構中,Blob充當了內存管理的角色,屏蔽了上層邏輯代碼對于數據的申請釋放的感知,同時也屏蔽了底層設備對上層邏輯的影響,本文主要分析Blob的管理機制和實際內存申請單元 SyncedMemory 的機制。 ?實際上整個Blob的實現就是在SyncedMemory上封裝了一層,所以首先需要分析一下SyncedMemory的實現機制。
? head_? 維護的是 SyncedMemory 當前的狀態,分為?UNINITIALIZED,HEAD_AT_GPU,HEAD_AT_CPU ,SYNCED?四中狀態。現在介紹一下具體的流程,當第一次調用 to_cpu()時, head_處于UNINITIALIZED狀態,那么系統會調用 CPU的申請內存的方式去獲得內存區域,之后設置 head_ = HEAD_AT_CPU ,如果中間過程沒有GPU設備則不會有狀態變動,如果中間有代碼調用了 to_gpu() ,則會發現 head_處于 HEAD_AT_CPU 狀態,此時會調用同步函數,將數據從CPU同步到GPU, 之后如果又回到CPU上,則同樣會發現 head_ 處于HEAD_AT_GPU的狀態,那么又會調用相應的同步代碼,將數據同步回CPU,通過 head_這樣一個狀態參數屏蔽了GPU和CPU間的申請和切換的不同。 所以上層業務只需要知道當前自己需要的是CPU還是GPU的數據,然后調用不同的接口,就可以完成數據獲取的操作。 |
| cout_中所存儲的就是所有維度的的乘積,也就是當前要reshape到的數據大小 ? ? |
GPU 顯存 - Caffe 內存優化
https://blog.csdn.net/zziahgf/article/details/80028878
| 該版本 Caffe 中, 內存優化是由網絡配置中的mem_param?來實現的. ? optimize_train - 是否在訓練網絡中進行優化. 如果設為 True, 可以節省訓練時一半的內存. optimize_test - 是否在測試網絡中進行優化. 如果設為 True, 可以節省測試時大部分內存. |
| 工作原理 ? 節省內存的原因是,?對于訓練的每次 forward 和 backward, 前一 blobs 使用的內存會被后面 blobs 重用.? 內存優化模塊通過確定網絡中 blobs 的依賴關系來工作的. 有時稱之為?multiloading. 具體來說, 在網絡訓練開始前, 運行一次 “dry-run” 來確定重用 blob 內存塊的方式. 這是一個靜態優化過程. 另一方面,?Parrots?深度學習框架是通過動態調度內存使用的, 具有更優的內存節省和更好的靈活性. |
?
?
具體如何實現的細節可以看看下面的:
https://blog.csdn.net/lanxueCC/article/details/53009130
Caffe 源碼之 CPU 與GPU 數據同步
| ? |
| 在cuda中調用cudaMallocHost得到的pinned的內存 ? |
| 梳理caffe代碼syncedmem(二) 接著最重要的就是內存分配和Caffe的底層數據的切換(cpu模式和gpu模式),需要用到內存同步模塊。這類個類的代碼比較少,但是作用是非常明顯的。文件對應著syncedmem.hpp,著syncedmem.cpp首先是兩個全局的內聯函數。如果機器是支持GPU的并且安裝了cuda,通過cudaMallocHost分配的host memory將會被pinned,pinned的意思就是內存不會被paged out,我們知道內存里面是由頁作為基本的管理單元。分配的內存可以常駐在內存空間中對效率是有幫助的,空間不會被別的進程所搶占。同樣如果內存越大,能被分配的Pinned內存自然也越大。還有一點是,對于單一的GPU而言提升并不會太顯著,但是對于多個GPU的并行而言可以顯著提高穩定性。這里是兩個封裝過的函數,內部通過cuda來分配主機和釋放內存的接口. ? |
| ? |
| /*如果是第一次初始化,就CaffeMallocHost分配CPU內存,? ? /*如果是GPU模式下才處理,如果是單cpu模式下則報錯 |
?
Caffe 源碼解析:
https://www.cnblogs.com/yymn/category/762593.html
?
| ? 隨筆分類 - caffe源碼解析(轉載) Deep Residual Network學習(二) 摘要:Deep Residual Network學習(二) 本文承接上篇對ResNet的分析與復現:Deep Residual Network學習(一) 通過上次在Cifar10上復現ResNet的結果,我們得到了上表,最后一欄是論文中的結果,可以看到已經最好的初始化方法(MSRA)已經和論文中的結果非常?閱讀全文 posted @?2018-04-03 19:02?菜雞一枚 閱讀 (90) |??評論 (0)?編輯 caffe中batch_norm層代碼詳細注解 摘要:caffe中batch_norm層代碼詳細注解 caffe中batch_norm層代碼注解 一:BN的解釋: 在訓練深層神經網絡的過程中, 由于輸入層的參數在不停的變化, 因此, 導致了當前層的分布在不停的變化, 這就導致了在訓練的過程中, 要求 learning rate 要設置的非常小, 另外,?閱讀全文 posted @?2018-03-19 11:23?菜雞一枚 閱讀 (196) |??評論 (0)?編輯 CAFFE源碼學習筆記之batch_norm_layer 摘要:CAFFE源碼學習筆記之batch_norm_layer 一、前言?網絡訓練的過程中參數不斷的變化導致后續的每一層輸入的分布也發生變化,而學習的過程使得每一層都需要適應輸入的分布。所以就需要謹慎的選擇初始化,使用小的學習率,這極大的降低了網絡收斂的速度。 為了使每層的輸入分布大致都在0均值和單位方差?閱讀全文 posted @?2018-03-19 11:22?菜雞一枚 閱讀 (48) |??評論 (0)?編輯 Batch Normalization Caffe版實現解析 摘要:Batch Normalization Caffe版實現解析 建議先看論文Batch Normalization: Accelerating Deep Network Training by?Reducing Internal Covariate Shift,這樣會對本文有更好的理解;?同時使用Ba?閱讀全文 posted @?2018-03-19 11:21?菜雞一枚 閱讀 (67) |??評論 (0)?編輯 Caffe Batch Normalization推導2 摘要:Caffe Batch Normalization推導 首先仔細看過Caffe的BN層實現的話會發現caffe的BN層與論文的是不太一致的。 沒有了?γ?和?β?。(因為如果有需要的話可以再加一個scale layer。)我這里將推導出給caffe的backward注釋一樣的diff公式。那么我們先?閱讀全文 posted @?2018-03-19 11:20?菜雞一枚 閱讀 (48) |??評論 (0)?編輯 Caffe Batch Normalization推導 摘要:Caffe Batch Normalization推導 Caffe BatchNormalization 推導 總所周知,BatchNormalization通過對數據分布進行歸一化處理,從而使得網絡的訓練能夠快速并簡單,在一定程度上還能防止網絡的過擬合,通過仔細看過Caffe的源碼實現后發現,Ca?閱讀全文 posted @?2018-03-19 11:19?菜雞一枚 閱讀 (172) |??評論 (0)?編輯 caffe的slice和concat實現MultiTask 摘要:caffe的slice和concat實現MultiTask 本篇博客部分轉自:http://blog.csdn.net/u013010889/article/details/53098346 http://blog.csdn.net/shuzfan/article/details/54565776?閱讀全文 posted @?2017-10-27 09:50?菜雞一枚 閱讀 (424) |??評論 (0)?編輯 caffe net代碼詳細注解 摘要:caffe代碼詳細注解 Caffe net:init()函數代碼詳細注解 Caffe 中net的初始化函數init()是整個網絡創建的關鍵函數。在此對此函數做詳細的梳理。 一、代碼的總體介紹 該init()函數中主要包括以下幾個函數: 1. FilterNet(in_param,&filtered_?閱讀全文 posted @?2017-09-09 16:10?菜雞一枚 閱讀 (225) |??評論 (0)?編輯 CAFFE源碼學習筆記之四-device_alternate 摘要:CAFFE源碼學習筆記之四-device_alternate 一、前言?common中包含的頭文件中有一個device_alternate,里面主要是和cuda有關系的宏:?CUDA_CHECK;?CUBLAS_CHECK;?CURAND_CHECK;?CUDA_KERNEL_LOOP;?同時還對b?閱讀全文 posted @?2017-08-21 16:48?菜雞一枚 閱讀 (332) |??評論 (0)?編輯 Caffe學習:Solver 該文被密碼保護。 posted @?2017-07-30 10:04?菜雞一枚 閱讀 (1) |??評論 (0)?編輯 解析./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt 摘要:解析./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt 解析./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt?第一?閱讀全文 posted @?2017-07-16 09:41?菜雞一枚 閱讀 (135) |??評論 (0)?編輯 Caffe中Solver解析 摘要:Caffe中Solver解析 1.Solver的初始化 caffe.cpp中的train函數中通過上述的代碼定義了一個指向Solver<float>的shared_ptr。其中主要是通過調用SolverRegistry這個類的靜態成員函數CreateSolver得到一個指向Solver的指針來構造s?閱讀全文 posted @?2017-07-11 16:10?菜雞一枚 閱讀 (365) |??評論 (0)?編輯 梳理caffe代碼solver(十四) 摘要:梳理caffe代碼solver(十四) 之前有一篇介紹solver的求解,也可以看官網的介紹:here?,和翻譯版的介紹。 solver.hpp頭文件的簡單解析: [cpp]?view plain?copy #ifndef?CAFFE_SOLVER_HPP_ #define?CAFFE_SOLVER?閱讀全文 posted @?2017-07-11 16:00?菜雞一枚 閱讀 (178) |??評論 (0)?編輯 Caffe中Layer和Net細解 摘要:Caffe中Layer和Net細解 Layer?Layer是Caffe的基本計算單元,至少有一個輸入Blob(Bottom Blob)和一個輸出Blob(Top Blob),部分Layer帶有權值(Weight)和偏置(Bias),有兩個運算方向:前向傳播(Forward)和反向傳播(Backwar?閱讀全文 posted @?2017-07-10 22:14?菜雞一枚 閱讀 (203) |??評論 (0)?編輯 caffe命令及其參數解析 摘要:caffe命令及其參數解析 caffe的c++主程序(caffe.cpp)放在根目錄下的tools文件夾內, 當然還有一些其它的功能文件,如:convert_imageset.cpp, train_net.cpp, test_net.cpp等也放在這個文件夾內。經過編譯后,這些文件都被編譯成了可執行?閱讀全文 posted @?2017-07-08 22:06?菜雞一枚 閱讀 (48) |??評論 (0)?編輯 CAFFE源碼學習筆記之初始化Filler 摘要:CAFFE源碼學習筆記之初始化Filler 一、前言?為什么CNN中的初始化那么重要呢? 我想總結的話就是因為他更深一點,相比淺層學習,比如logistics或者SVM,最終問題都轉換成了凸優化,函數優化的目標唯一,所以參數初始化隨便設置為0都不影響,因為跟著梯度走,總歸是會走向最小值的附近的。 但?閱讀全文 posted @?2017-06-25 16:03?菜雞一枚 閱讀 (147) |??評論 (0)?編輯 caffe代碼閱讀6:Filler的實現細節-2016.3.18 摘要:caffe代碼閱讀6:Filler的實現細節-2016.3.18 一、Filler的作用簡介 Filler層的作用實際上就是根據proto中給出的參數對權重進行初始化,初始化的方式有很多種,分別為常量初始化(constant)、高斯分布初始化(gaussian)、positive_unitball初?閱讀全文 posted @?2017-06-25 11:08?菜雞一枚 閱讀 (124) |??評論 (0)?編輯 caffe中的filler.hpp源碼的作用: 摘要:caffe中的filler.hpp源碼的作用: filler.hpp文件:(它應該沒有對應的.cpp文件,一切實現都是在頭文件中定義的,可能是因為filler只分在網絡初始化時用到那么一次吧) 1,首先定義了基類:Filler,它包括:一個純虛函數:filler(用于在子類里根據不同的情況具體實現)?閱讀全文 posted @?2017-06-24 22:30?菜雞一枚 閱讀 (51) |??評論 (0)?編輯 caffe中權值初始化方法 摘要:caffe中權值初始化方法 首先說明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代碼細節吧,現在不想知道太多,有個宏觀的idea就可以啦,如果想看代碼的具體的話,可以看:http://blog.csdn.net/xize?閱讀全文 posted @?2017-06-23 11:24?菜雞一枚 閱讀 (99) |??評論 (0)?編輯 .prototxt 文件添加注釋 摘要:.prototxt 文件添加注釋 利用#字符,在句首。 例如: # this is my?annotation.?閱讀全文 posted @?2017-06-21 10:42?菜雞一枚 閱讀 (280) |??評論 (0)?編輯 (Caffe)編程小技巧 摘要:(Caffe)編程小技巧 版權聲明:未經允許請勿用于商業用途,轉載請注明出處:http://blog.csdn.net/mounty_fsc/ 版權聲明:未經允許請勿用于商業用途,轉載請注明出處:http://blog.csdn.net/mounty_fsc/ 1. Cuda中要處理單位數據N大于可?閱讀全文 posted @?2017-06-13 11:00?菜雞一枚 閱讀 (67) |??評論 (0)?編輯 【caffe源碼研究】第四章:完整案例源碼篇(5) :LeNet反向過程 摘要:【caffe源碼研究】第四章:完整案例源碼篇(5) :LeNet反向過程 本部分剖析Caffe中Net::Backward()函數,即反向傳播計算過程。從LeNet網絡角度出發,且調試網絡為訓練網絡,共9層網絡。 入口信息 Net::Backward()函數中調用BackwardFromTo函數,從?閱讀全文 posted @?2017-06-05 15:39?菜雞一枚 閱讀 (175) |??評論 (0)?編輯 【caffe源碼研究】第四章:完整案例源碼篇(4) :LeNet前向過程 摘要:【caffe源碼研究】第四章:完整案例源碼篇(4) :LeNet前向過程 入口信息 通過如下的調用堆棧信息可以定位到函數ForwardFromTo(其他函數中無重要信息) caffe::Net<float>::ForwardFromTo() at net.cpp:574 caffe::Net<flo?閱讀全文 posted @?2017-06-05 15:34?菜雞一枚 閱讀 (136) |??評論 (0)?編輯 【caffe源碼研究】第四章:完整案例源碼篇(3) :LeNet初始化測試網絡 摘要:【caffe源碼研究】第四章:完整案例源碼篇(3) :LeNet初始化測試網絡 一、 測試網絡結構 注:Top Blob Shape格式為:BatchSize,ChannelSize,Height,Width(Total Count) 二、 與訓練網絡對比 訓練網絡9層,測試網絡12層?訓練網絡沒有?閱讀全文 posted @?2017-06-05 15:12?菜雞一枚 閱讀 (64) |??評論 (0)?編輯 【caffe源碼研究】第四章:完整案例源碼篇(2) :LeNet初始化訓練網絡 摘要:【caffe源碼研究】第四章:完整案例源碼篇(2) :LeNet初始化訓練網絡 一、Solver到Net SGDSolver的構造函數中主要執行了其父類Solver的構造函數,接著執行Solver::Init()函數,在Init()中,有兩個函數值得注意:InitTrainNet()和InitTes?閱讀全文 posted @?2017-06-05 15:07?菜雞一枚 閱讀 (106) |??評論 (0)?編輯 【caffe源碼研究】第四章:完整案例源碼篇(1) :LeNetSolver初始化 摘要:【caffe源碼研究】第四章:完整案例源碼篇(1) :LeNetSolver初始化 在訓練lenet的train_lenet.sh中內容為: 由此可知,訓練網咯模型是由tools/caffe.cpp生成的工具caffe在模式train下完成的。?初始化過程總的來說,從main()、train()中創?閱讀全文 posted @?2017-06-05 09:38?菜雞一枚 閱讀 (134) |??評論 (0)?編輯 【caffe源碼研究】第三章:源碼篇(6) :caffe.proto 摘要:【caffe源碼研究】第三章:源碼篇(6) :caffe.proto caffe使用protobuf來定義網絡結構、參數等。這里介紹一下caffe.proto里面核心的部分。 Blob 先看Blob相關的protobuf message BlobShape { //數據塊形狀定義為Num×Chann?閱讀全文 posted @?2017-06-01 22:30?菜雞一枚 閱讀 (203) |??評論 (0)?編輯 caffe源碼解析-solver_factory 摘要:caffe源碼解析-solver_factory 聲明:內容整理自 Caffe代碼解析(4) Caffe Source Code Analysis BUPTLdy/Caffe_Code_Analysis?(帶注釋源碼) 感謝Ldy和各位博主的無私分享。各位博主已經寫的很好,個人做了一些梳理和補充,方?閱讀全文 posted @?2017-05-31 08:50?菜雞一枚 閱讀 (205) |??評論 (0)?編輯 caffe 學c++ 編程 技巧 摘要:caffe 學c++ 編程 技巧 1、 使用模板,泛型編程 [cpp]?view plain?copy template?<typename?Dtype> Net<Dtype>::Net(const?NetParameter&?param)?{ Init(param); } [cpp]?view p?閱讀全文 posted @?2017-05-23 10:14?菜雞一枚 閱讀 (173) |??評論 (0)?編輯 Caffe代碼解析(4) 摘要:Caffe代碼解析(4) 在上文對Command Line Interfaces進行了簡單的介紹之后,本文將對caffe的Solver相關的代碼進行分析。 本文將主要分為四部分的內容: Solver的初始化(Register宏和構造函數) SIGINT和SIGHUP信號的處理 Solver::Sol?閱讀全文 posted @?2017-05-13 10:47?菜雞一枚 閱讀 (98) |??評論 (0)?編輯 Caffe代碼解析(3) 摘要:Caffe代碼解析(3) 在上文對Google Protocol Buffer進行了簡單的介紹之后,本文將對caffe的Command Line Interfaces進行分析。 本文將從一個比較宏觀的層面上去了解caffe怎么去完成一些初始化的工作和使用Solver的接口函數,本文將主要分為四部分的?閱讀全文 posted @?2017-05-11 22:19?菜雞一枚 閱讀 (128) |??評論 (0)?編輯 caffe caffe.cpp 程序入口分析 摘要:caffe caffe.cpp 程序入口分析 caffe.cpp 程序入口分析, (1)main()函數中,輸入的train,test,device_query,time。 通過下面兩行進入程序。 if (argc == 2) { return GetBrewFunction(caffe::stri?閱讀全文 posted @?2017-05-11 22:13?菜雞一枚 閱讀 (170) |??評論 (0)?編輯 一種根據輸入動態執行函數 摘要:一種根據輸入動態執行函數 匿名命名空間,使得文件外無法訪問這些變量,定義一個類,以數組方式往map中添加一個函數指針。‘#’表示將一個變量變成字符串。‘##’表示拼接一個字符串和一個變量。 使用的方法: 示例:?./main name1?./main name2 程序的整個思路是:?開始程序,執行宏?閱讀全文 posted @?2017-05-11 21:22?菜雞一枚 閱讀 (70) |??評論 (0)?編輯 Caffe代碼解析(2) 摘要:Caffe代碼解析(2) 在Caffe中定義一個網絡是通過編輯一個prototxt文件來完成的,一個簡單的網絡定義文件如下: 1 name: "ExampleNet" 2 layer { 3 name: "data" 4 type: "Data" 5 top: "data" 6 top: "labe?閱讀全文 posted @?2017-05-11 10:25?菜雞一枚 閱讀 (80) |??評論 (0)?編輯 Caffe代碼解析(1) 摘要:Caffe代碼解析(1) Caffe是一個基于C++和cuda開發的深度學習框架。其使用和開發的便捷特性使其成為近年來機器學習和計算機視覺領域最廣為使用的框架。 筆者使用Caffe做各種實驗也有一段時間了,除了Caffe支持的各種計算方式(卷積/pooling/全連接等)之外,在自己的使用中開始遇到?閱讀全文 posted @?2017-05-10 20:59?菜雞一枚 閱讀 (111) |??評論 (0)?編輯 Caffe訓練源碼基本流程 摘要:Caffe Source Code Analysis Caffe簡介 Caffe作為一個優秀的深度學習框架網上已經有很多內容介紹了,這里就不在多說。作為一個C++新手,斷斷續續看Caffe源碼一個月以來發現越看不懂的東西越多,因此在博客里記錄和分享一下學習的過程。其中我把自己看源碼的一些注釋結合了網?閱讀全文 posted @?2017-05-10 10:38?菜雞一枚 閱讀 (215) |??評論 (0)?編輯 Caffe源碼學習筆記2:include/caffe/solver_factory.hpp 摘要:Caffe源碼學習筆記2:include/caffe/solver_factory.hpp 簡要說明:slover是什么?solver是caffe中實現訓練模型參數更新的優化算法,solver類派生出的類可以對整個網絡進行訓練。在caffe中有很多solver子類,即不同的優化算法,如隨機梯度下降(?閱讀全文 posted @?2017-05-06 11:08?菜雞一枚 閱讀 (97) |??評論 (0)?編輯 Caffe源碼學習筆記1:tools/caffe.cpp 摘要:Caffe源碼學習筆記1:tools/caffe.cpp caffe-master/Tools文件夾下提供了caffe框架的主要工具(經編譯后為可執行文件,在build/tools/下)。tools/caffe.cpp是caffe程序的入口(即main函數),一條標準的訓練指令為: ./build/?閱讀全文 posted @?2017-05-05 19:48?菜雞一枚 閱讀 (274) |??評論 (0)?編輯 梳理caffe代碼net(四) 摘要:梳理caffe代碼net(四) net定義網絡, 整個網絡中含有很多layers, net.cpp負責計算整個網絡在訓練中的forward, backward過程, 即計算forward/backward 時各layer的gradient。 看一下官網的英文描述: The forward and b?閱讀全文 posted @?2017-05-02 10:03?菜雞一枚 閱讀 (237) |??評論 (0)?編輯 梳理caffe代碼io(十三) 摘要:梳理caffe代碼io(十三) io包含了創建臨時文件臨時目錄操作,以及從txt文件以及bin文件讀取proto數據或者寫入proto的數據到txt或者bin文件。io其實就是提供如何讀取如何寫入的一些讀取圖像或者文件,以及它們之間的一些轉化的函數。 hpp文件: [cpp]?view plain??閱讀全文 posted @?2016-04-12 10:31?菜雞一枚 閱讀 (575) |??評論 (0)?編輯 梳理caffe代碼data_transformer(十二) 摘要:梳理caffe代碼data_transformer(十二) data_transformer詳細注釋看頭文件和實現部分: 頭文件: [cpp]?view plain?copy /TransformationParameter的caffe消息定義 /* //?Messa?閱讀全文 posted @?2016-04-12 09:55?菜雞一枚 閱讀 (8102) |??評論 (0)?編輯 梳理caffe代碼data_reader(十一) 摘要:梳理caffe代碼data_reader(十一) 上一篇的blocking_queue到底干了一件什么事情呢?剛剛看完就有點忘記了,再過一會估計忘光了。。。 顧名思義,阻塞隊列,就是一個正在排隊的打飯隊列,先到窗口的先打飯,為什么會高效安全呢?一是像交通有秩序,二是有了秩序是不是交通運行起來就快了。?閱讀全文 posted @?2016-04-11 16:58?菜雞一枚 閱讀 (1057) |??評論 (0)?編輯 梳理caffe代碼blocking_queue(十) 摘要:梳理caffe代碼blocking_queue(十) 這一個文件基本是我們最頭疼的黑色地帶,關于XXXX鎖,XXXX解鎖的問題,遇到的了學習學習,記不住多溫習幾次就可以。 首先拋開那些官方的條條框框,我們為了不讓多個線程同時訪問共享的資源是至關重要的。假如一個線程試圖改變共享數據的值,而另外一個線程?閱讀全文 posted @?2016-04-11 16:49?菜雞一枚 閱讀 (345) |??評論 (0)?編輯 梳理caffe代碼internal_thread(九) 摘要:梳理caffe代碼internal_thread(九) 經過common的學習之后,然后這個InternalThread類實際上就是boost庫的thread的封裝,然后對線程進行控制和使用。廢話不多啰嗦 看看頭文件: [cpp]?view plain?copy class?InternalThre?閱讀全文 posted @?2016-04-11 15:30?菜雞一枚 閱讀 (621) |??評論 (0)?編輯 梳理caffe代碼common(八) 摘要:梳理caffe代碼common(八) 由于想梳理data_layer的過程,整理一半發現有幾個非常重要的頭文件就是題目列出的這幾個: 追本溯源,先從根基開始學起。這里面都是些什么鬼呢? common類 命名空間的使用:google、cv、caffe{boost、std}。然后在項目中就可以隨意使用g?閱讀全文 posted @?2016-04-11 15:21?菜雞一枚 閱讀 (4417) |??評論 (0)?編輯 梳理caffe代碼layer_factory(六) 摘要:梳理caffe代碼layer_factory(六) 因為前一篇描述的是layer層,其實應該先學習工廠模式,最早我也學習過了23中模式設計,不熟悉這個模式的可以看一下下面這段代碼。 這個是最簡單的工廠模式。 Layer_factory的主要作用是負責Layer的注冊,已經注冊完事的Layer在運行時?閱讀全文 posted @?2016-04-11 10:56?菜雞一枚 閱讀 (694) |??評論 (0)?編輯 Caffe源碼解析7:Pooling_Layer 摘要:Caffe源碼解析7:Pooling_Layer 轉載請注明出處,樓燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ Pooling 層一般在網絡中是跟在Conv卷積層之后,做采樣操作,其實是為了進一步縮小feature map,?閱讀全文 posted @?2016-04-10 17:00?菜雞一枚 閱讀 (364) |??評論 (0)?編輯 Caffe源碼解析6:Neuron_Layer 摘要:Caffe源碼解析6:Neuron_Layer 轉載請注明出處,樓燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ NeuronLayer,顧名思義這里就是神經元,激活函數的相應層。我們知道在blob進入激活函數之前和之后他的si?閱讀全文 posted @?2016-04-10 16:13?菜雞一枚 閱讀 (319) |??評論 (0)?編輯 Caffe源碼解析4: Data_layer 摘要:Caffe源碼解析4: Data_layer 轉載請注明出處,樓燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ data_layer應該是網絡的最底層,主要是將數據送給blob進入到net中,在data_layer中存在多個跟d?閱讀全文 posted @?2016-04-10 11:25?菜雞一枚 閱讀 (216) |??評論 (0)?編輯 梳理caffe代碼layer(五) 摘要:梳理caffe代碼layer(五) Layer(層)是Caffe中最龐大最繁雜的模塊。由于Caffe強調模塊化設計,因此只允許每個layer完成一類特定的計算,例如convolution操作、pooling、非線性變換、內積運算,以及數據加載、歸一化和損失計算等。layer這個類可以說是里面最終的一?閱讀全文 posted @?2016-04-08 21:02?菜雞一枚 閱讀 (1783) |??評論 (0)?編輯 caffe代碼閱讀5:Layer的實現細節-2016.3.17 摘要:caffe代碼閱讀5:Layer的實現細節-2016.3.17 一、Layer的作用簡介 Layer實際上定義了Layer的基本操作,即初始化層、前向傳播和反向傳播。在前向傳播中根據bottom blob得到top blob,反向傳播則根據top反傳到bottom。而且在前傳的時候還可以計算loss?閱讀全文 posted @?2016-04-07 10:57?菜雞一枚 閱讀 (696) |??評論 (0)?編輯 caffe代碼閱讀1:blob的實現細節-2016.3.14 摘要:caffe代碼閱讀1:blob的實現細節-2016.3.14 caffe 中 BLOB的實現 一、前言 等著caffe沒有膨脹到很大的程度把caffe的代碼理一理 (1)第一次閱讀Caffe的源碼,給人的印象就是里面大量使用了gtest,確實也簡化了不少代碼,看起來很清晰。 (2)caffe的文檔是?閱讀全文 posted @?2016-04-06 16:30?菜雞一枚 閱讀 (379) |??評論 (0)?編輯 Caffe源碼解析3:Layer 摘要:Caffe源碼解析3:Layer 轉載請注明出處,樓燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ layer這個類可以說是里面最終的一個基本類了,深度網絡呢就是一層一層的layer,相互之間通過blob傳輸數據連接起來。首先l?閱讀全文 posted @?2016-03-31 17:03?菜雞一枚 閱讀 (1149) |??評論 (0)?編輯 Caffe源碼解析1:Blob 摘要:Caffe源碼解析1:Blob 轉載請注明出處,樓燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 首先看到的是Blob這個類,Blob是作為Caffe中數據流通的一個基本類,網絡各層之間的數據是通過Blob來傳遞的。這里整個代碼是?閱讀全文 posted @?2016-03-31 16:17?菜雞一枚 閱讀 (211) |??評論 (0)?編輯 梳理caffe代碼blob(三) 摘要:梳理caffe代碼blob(三) 貫穿整個caffe的就是數據blob: [cpp]?view plain?copy #ifndef?CAFFE_BLOB_HPP_ #define?CAFFE_BLOB_HPP_ #include?<algorithm> #include?<string> #inc?閱讀全文 posted @?2016-03-31 15:26?菜雞一枚 閱讀 (4787) |??評論 (0)?編輯 【Caffe代碼解析】SyncedMemory 摘要:【Caffe代碼解析】SyncedMemory 功能: Caffe的底層數據的切換(cpu模式和gpu模式),需要用到內存同步模塊。 源碼:頭文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2?閱讀全文 posted @?2016-03-31 10:37?菜雞一枚 閱讀 (1522) |??評論 (0)?編輯 Caffe源碼解析2:SycedMem 摘要:Caffe源碼解析2:SycedMem 轉載請注明出處,樓燚(yì)航的blog,http://www.cnblogs.com/louyihang?loves baiyan/ 看到SyncedMem就知道,這是在做內存同步的操作。這類個類的代碼比較少,但是作用是非常明顯的。文件對應著syncedme?閱讀全文 posted @?2016-03-31 10:22?菜雞一枚 閱讀 (292) |??評論 (0)?編輯 梳理caffe代碼syncedmem(二) 摘要:梳理caffe代碼syncedmem(二) 接著最重要的就是內存分配和Caffe的底層數據的切換(cpu模式和gpu模式),需要用到內存同步模塊。這類個類的代碼比較少,但是作用是非常明顯的。文件對應著syncedmem.hpp,著syncedmem.cpp首先是兩個全局的內聯函數。如果機器是支持GP?閱讀全文 posted @?2016-03-31 10:21?菜雞一枚 閱讀 (569) |??評論 (0)?編輯 Caffe源碼(一):math_functions 分析 摘要:Caffe源碼(一):math_functions 分析 目錄 目錄 主要函數 caffe_cpu_gemm 函數 caffe_cpu_gemv 函數 caffe_axpy 函數 caffe_set 函數 caffe_add_scalar 函數 caffe_copy 函數 caffe_scal 函數?閱讀全文 posted @?2016-03-30 15:25?菜雞一枚 閱讀 (655) |??評論 (0)?編輯 梳理caffe代碼math_functions(一) 摘要:梳理caffe代碼math_functions(一) 先從caffe中使用的函數入手看看: #include <boost/math/special_functions/next.hpp> #include <boost/random.hpp> #include <limits> #include?閱讀全文 posted @?2016-03-30 13:35?菜雞一枚 閱讀 (473) |??評論 (0)?編輯 caffe proto文件,和配置文件 摘要:caffe proto文件,和配置文件 要看caffe源碼,我認為首先應該看的就是caffe.proto。?它位于…\src\caffe\proto目錄下,在這個文件夾下還有一個.pb.cc和一個.pb.h文件,這兩個文件都是由caffe.proto編譯而來的。?在caffe.proto中定義了很多?閱讀全文 posted @?2016-03-28 15:37?菜雞一枚 閱讀 (2194) |??評論 (0)?編輯 caffe的caffe.proto 摘要:caffe的caffe.proto 經過前面“caffe的protocol buffer使用例子”的學習,對caffe.proto熟悉了。 看caffe源碼先從這里開始吧。它位于…\src\caffe\proto目錄下,在這個文件夾下還有一個.pb.cc和一個.pb.h文件,這兩個文件都是由caff?閱讀全文 posted @?2016-03-28 15:36?菜雞一枚 閱讀 (485) |??評論 (0)?編輯 caffe源碼解析 — caffe.proto 摘要:caffe源碼解析 — caffe.proto 引言 要看caffe源碼,我認為首先應該看的就是caffe.proto。 它位于…\src\caffe\proto目錄下,在這個文件夾下還有一個.pb.cc和一個.pb.h文件,這兩個文件都是由caffe.proto編譯而來的。 在caffe.prot?閱讀全文 posted @?2016-01-27 16:16?菜雞一枚 閱讀 (517) |??評論 (0)?編輯 caffe源碼解析 — blob.cpp 摘要:caffe源碼解析 — blob.cpp 主要參考:linger Reshape(const int num, const int channels, const int height, const int width) 功能:改變一個blob的大小 步驟:1.讀入num_,channels_,he?閱讀全文 posted @?2016-01-27 15:36?菜雞一枚 閱讀 (1313) |??評論 (0)?編輯 Caffe源碼(二):blob 分析 摘要:Caffe源碼(二):blob 分析 目錄 目錄 簡單介紹 源代碼分析 Reshape 函數 Blob 構造函數 data_數據操作函數 反向傳播導數diff_ 操作函數 ShareData 函數 Updata 函數 asum_data 函數 asum_diff 函數 sumsq_data 函數 s?閱讀全文 posted @?2016-01-27 15:15?菜雞一枚 閱讀 (796) |??評論 (0)?編輯 【Caffe代碼解析】Blob 摘要:【Caffe代碼解析】Blob 主要功能: Blob 是Caffe作為數據傳輸的媒介,無論是網絡權重參數,還是輸入數據,都是轉化為Blob數據結構來存儲,網絡,求解器等都是直接與此結構打交道的。 其直觀的可以把它看成一個有4緯的結構體(包含數據和梯度),而實際上,它們只是一維的指針而已,其4維結構通?閱讀全文 posted @?2016-01-25 15:37?菜雞一枚 閱讀 (1585) |??評論 (0)?編輯 caffe study (1) - 數據結構(1) 摘要:caffestudy(1)-數據結構(1)以下主要是對于Caffe主頁文檔的總結1. 結構的生成:caffe的基本結構是采用google的proto庫自動生成的,基本流程就是定義一個配置文件,擴展名為proto,調用proto庫的編譯器編譯這個文件可以生成相應的類的c++的代碼。具體的可以參見pro...?閱讀全文 posted @?2016-01-21 09:22?菜雞一枚 閱讀 (229) |??評論 (0)?編輯 Caffe學習筆記1-安裝以及代碼結構 摘要:Caffe學習筆記1-安裝以及代碼結構安裝按照官網教程安裝,我在 OS X 10.9 和 Ubuntu 14.04 上面都安裝成功了。主要麻煩在于 glog gflags gtest 這幾個依賴項是google上面的需要翻墻。由于我用Mac沒有CUDA,所以安裝時需要設置 CPU_ONLY := 1...?閱讀全文 posted @?2016-01-20 15:48?菜雞一枚 閱讀 (1213) |??評論 (0)?編輯 Caffe源碼導讀(6):LRN層的實現 摘要:Caffe源碼導讀(6):LRN層的實現LRN全稱為Local Response Normalization,即局部響應歸一化層,具體實現在CAFFE_ROOT/src/caffe/layers/lrn_layer.cpp和同一目錄下lrn_layer.cu中。該層需要參數有:norm_region...?閱讀全文 posted @?2015-12-02 11:20?菜雞一枚 閱讀 (575) |??評論 (0)?編輯 Caffe代碼導讀(5):對數據集進行Testing 摘要:Caffe代碼導讀(5):對數據集進行Testing上一篇介紹了如何準備數據集,做好準備之后我們先看怎樣對訓練好的模型進行Testing。先用手寫體識別例子,MNIST是數據集(包括訓練數據和測試數據),深度學習模型采用LeNet(具體介紹見http://yann.lecun.com/exdb/le...?閱讀全文 posted @?2015-12-02 11:18?菜雞一枚 閱讀 (437) |??評論 (0)?編輯 Caffe代碼導讀(4):數據集準備 摘要:Caffe代碼導讀(4):數據集準備Caffe上面有兩個比較簡單的例子:MNIST和CIFAR-10,前者是用于手寫數字識別的,后者用于小圖片分類。這兩個數據集可以在Caffe源碼框架中用腳本(CAFFE_ROOT/data/mnist/get_mnist.sh和CAFFE_ROOT/data/ci...?閱讀全文 posted @?2015-12-02 11:18?菜雞一枚 閱讀 (440) |??評論 (0)?編輯 Caffe代碼導讀(3):LevelDB例程 摘要:Caffe代碼導讀(3):LevelDB例程Caffe自帶例子Cifar10中使用leveldb存儲輸入數據,為此我們研究一下怎樣使用它。安裝步驟可以參考http://blog.csdn.net/kangqing2003/article/details/6658345Leveldb庫提供了一種持續的...?閱讀全文 posted @?2015-12-02 11:16?菜雞一枚 閱讀 (215) |??評論 (0)?編輯 Caffe代碼導讀(2):LMDB簡介 摘要:Caffe代碼導讀(2):LMDB簡介閃電般的內存映射型數據庫管理(LMDB)簡介LMDB是基于二叉樹的數據庫管理庫,建模基于伯克利數據庫的應用程序接口,但做了大幅精簡。整個數據庫都是內存映射型的,所有數據獲取返回數據都是直接從映射的內存中返回,所以獲取數據時沒有malloc或memcpy發生。因此...?閱讀全文 posted @?2015-12-02 11:16?菜雞一枚 閱讀 (207) |??評論 (0)?編輯 Caffe代碼導讀(1):Protobuf例子 摘要:Caffe代碼導讀(1):Protobuf例子Protobuf是一種可以實現內存與外存交換的協議接口。這是由谷歌開發的開源工具,目前研究Caffe源碼時用到。一個軟件項目 = 數據結構 + 算法 + 參數,對于數據結構和算法我們都已經有較多研究,但不同開發者對參數管理卻各有千秋。有人喜歡TXT格式化...?閱讀全文 posted @?2015-12-02 11:15?菜雞一枚 閱讀 (759) |??評論 (0)?編輯 Caffe代碼導讀(0):路線圖 摘要:Caffe代碼導讀(0):路線圖【Caffe是什么?】Caffe是一個深度學習框架,以代碼整潔、可讀性強、運行速度快著稱。代碼地址為:https://github.com/BVLC/caffe【博客目的】從接觸Caffe、編譯運行、閱讀代碼、修改代碼一路走來,學習到不少內容,包括深度學習理論,卷積神...?閱讀全文 posted @?2015-12-02 11:12?菜雞一枚 閱讀 (384) |??評論 (0)?編輯 Caffe_Manual/get_features.cpp 摘要:Caffe_Manual/get_features.cpp根據反饋,專門寫了個cpp文件,可以一次前向,同時完成多層的特征提取、最后的概率輸出以及Top標簽輸出,見get_features.cpp文件:/*** usage: get_features.exe feat.prototxt H:\Mod...?閱讀全文 posted @?2015-08-11 19:03?菜雞一枚 閱讀 (648) |??評論 (0)?編輯 Caffe C++使用教程 摘要:Caffe C++使用教程Caffe使用教程by Shicai Yang(@星空下的巫師)on 2015/08/06初始化網絡#include "caffe/caffe.hpp"#include #include using namespace caffe;char *proto = "H:\\Mo...?閱讀全文 posted @?2015-08-09 19:24?菜雞一枚 閱讀 (5718) |??評論 (0)?編輯 caffe源碼分析--softmax_layer.cpp 摘要:caffe源碼分析--softmax_layer.cpp文件位置為caffe-master/src/caffe/layers/softmax_layer.cpp這個是一個以前版本的程序,現在的代碼有些不同了,不過可以參考caffe源碼分析--softmax_layer.cpp[cpp]view pl...?閱讀全文 posted @?2015-05-14 15:20?菜雞一枚 閱讀 (2412) |??評論 (0)?編輯 Caffe4——計算圖像均值 摘要:Caffe4——計算圖像均值均值削減是數據預處理中常見的處理方式,按照之前在學習ufldl教程PCA的一章時,對于圖像介紹了兩種:第一種常用的方式叫做dimension_mean(個人命名),是依據輸入數據的維度,每個維度內進行削減,這個也是常見的做法;第二種叫做per_image_mean,ufl...?閱讀全文 posted @?2015-05-14 15:13?菜雞一枚 閱讀 (2564) |??評論 (0)?編輯 Caffe3——ImageNet數據集創建lmdb類型的數據 摘要:Caffe3——ImageNet數據集創建lmdb類型的數據ImageNet數據集和cifar,mnist數據集最大的不同,就是數據量特別大;單張圖片尺寸大,訓練樣本個數多;面對如此大的數據集,在轉換成lmdb文件時;使用了很多新的類型對象。1,動態擴容的數組“vector”,動態地添加新元素2,p...?閱讀全文 posted @?2015-05-05 15:15?菜雞一枚 閱讀 (1908) |??評論 (0)?編輯 Caffe2——cifar10數據集創建lmdb或leveldb類型的數據 摘要:Caffe2——cifar10數據集創建lmdb或leveldb類型的數據cifar10數據集和mnist數據集存儲方式不同,cifar10數據集把標簽和圖像數據以bin文件的方式存放在同一個文件內,這種存放方式使得每個子cifar數據bin文件的結構相同,所以cifar轉換數據代碼比mnist的代...?閱讀全文 posted @?2015-05-05 15:14?菜雞一枚 閱讀 (2326) |??評論 (0)?編輯 Caffe1——Mnist數據集創建lmdb或leveldb類型的數據 摘要:Caffe1——Mnist數據集創建lmdb或leveldb類型的數據Leveldb和lmdb簡單介紹Caffe生成的數據分為2種格式:Lmdb和Leveldb。它們都是鍵/值對(Key/Value Pair)嵌入式數據庫管理系統編程庫。雖然lmdb的內存消耗是leveldb的1.1倍,但是lmdb...?閱讀全文 posted @?2015-05-05 15:13?菜雞一枚 閱讀 (4733) |??評論 (0)?編輯 ? 友情鏈接: Physcal 蘇劍林 langb2014 tangwei2014 一畝半分地 Deep_Learner hjimce happynear Xin-Yu Ou 楠小楠 仙守 慕容熙熙 ScorpioDoctor RamonCheung 卜居 菜鳥 昵稱:?菜雞一枚? 關注成功
搜索? ? 積分與排名
隨筆分類
Copyright ? 2019 菜雞一枚 Powered by .NET Core 3.0 Preview 8 on Linux | ||||||||||||||||||||||||||||||||||||||||||||||||||||
.proto 文件要會讀、讀熟
數據結構:https://blog.csdn.net/Teeyohuang/article/details/76619125
?
?
Caffe (2) SyncedMemory內存管理機制
講得比較體貼入微!
https://blog.csdn.net/hnshahao/article/details/81218713
| 在Caffe中,blob是對于上層空間的數據管理存儲對象,對于上層來說的話,大部分時候是直接取blob對象的指針來用,如果不考慮GPU的情況下,實際上很簡單,就是返回指針就行,但是問題是通常的數據是在GPU和CPU上同時存在,需要兩個數據在不同的設備上進行同步,那么SyncedMemory的作用是實際上在管理實際數據。對于Blob中,封裝的3個SyncedMemory對象的智能指針: 【大的邏輯】 SyncedMemory對象實際管理著數據空間,一個blob可以包含多個SyncedMemory對象的智能指針。SyncedMemory中主要完成數據空間的創建,GPU數據和CPU數據,數據空間的釋放,以及GPU和CPU數據的同步。 |
| ? |
| 【細節邏輯】 SyncedMemory對象管理著一個數據對象,數據對象是一個tensor. 這個數據對象可能只存在CPU上,或者只存在GPU上,或者同時存在兩個位置上。對于一個數據對象,按道理來說,存儲情況會存在幾種可能, (1)只存在CPU上,這時候通過*cpu_ptr_就能訪問 (2)只存在CPU上,這時候通過*cpu_ptr_就能訪問 (3)需要同時存在CPU和GPU上,那么需要在兩個設備上,數據需要同步。希望的效果是兩個不同位置的數據是一致的。所謂的同步是指,當一方的數據發生變化時,另外一方的數據需要更新。比如CPU上的數據發生變化,那么需要同步把GPU上的數據更新。這樣就涉及到一個何時更新的問題,更新太頻繁,比如一方發生變化,就去更新另外一方,這樣會導致額外的開銷。 那么這時候就會涉及到一個同步管理的問題,實際上對于每個SyncedMemory對象都包含了一個head_變量,標志著目前被管理的數據對象的同步情況 ? ? 1:head_ 狀態機變量介紹,功能 取值是4種可能,UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED,? (1)?UNINITIALIZED -- 表示這個數據對象的存儲空間沒有被初始化,對于這樣的情況,需要alloc memory, 分配內存可能會分配在CPU或者GPU上 (2)HEAD_AT_CPU -- 表示的是目前在CPU空間上的數據對象的備份是最新的,或者說,目前CPU上的數據是能夠反映當前SyncedMemory所管理數據對象的最新狀態,那么對于GPU上的數據備份就不是最新的 (3)HEAD_AT_GPU -- 表示的是目前在GPU空間上的數據對象的備份是最新的,或者說目前GPU上數據是能夠反映當前SyncedMemory所管理數據對象的最新狀態,那么對于GPU上的數據備份就不是最新的 (4)SYNCED --?表示的是目前GPU和CPU空間上的數據是同步的,兩個位置都能反映當前SyncedMemory所管理數據對象的最新狀態 2:下面的問題是這個狀態變量是如何改變的狀態機變量的值 在SyncedMemory.cpp文件中,改變狀態機變量,主要有兩個函數,這里的改變是指狀態機變量的值發生變化,從一個值變化到另外一個值。 (1) to_cpu() 函數 -? //函數作用是讓現在數據最新備份至少出現在cpu上 |
| ? |
| 在每次Blob對象調用函數,cpu_data()或者gpu_data()返回數據指針的時候,都是希望被返回的數據指針是能夠反映當前tensor的最新狀態,訪問CPU指針,那么希望CPU上具有tensor數據的最新備份,訪問GPU指針,那么希望GPU上有tensor數據的最新備份。而內部的管理是通過SyncedMemory對象的內部狀態機來管理。 ?————————————————? 版權聲明:本文為CSDN博主「hnshahao」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/hnshahao/article/details/81218713 |
| 這里的new?SyncedMemory(并沒有開始申請空間),只是設置了head_(UNINITIALIZED)這個標志,在實際訪問指針的時候,創建內容空間 |
| 在每次Blob對象調用函數,cpu_data()或者gpu_data()返回數據指針的時候,都是希望被返回的數據指針是能夠反映當前tensor的最新狀態,訪問CPU指針,那么希望CPU上具有tensor數據的最新備份,訪問GPU指針,那么希望GPU上有tensor數據的最新備份。而內部的管理是通過SyncedMemory對象的內部狀態機來管理。 ? |
?
https://blog.csdn.net/xizero00/article/details/51001206
caffe代碼閱讀9:SyncedMemory的實現細節-2016.3.28
?
https://blog.csdn.net/hangdianabc/article/details/72902322
caffe1源碼解析從入門到放棄1):內存管理syncedmem.hpp / syncedmem.cpp
?
?
?
caffe源碼分析-Blob
講得相當之好
https://cloud.tencent.com/developer/article/1394880
| Blob主要函數,核心在于Blob的使用實例以及其與opencv Mat的操作的相互轉化(附帶運行結果基于CLion) |
| Blob 是Caffe作為數據傳輸的媒介,無論是網絡權重參數,還是輸入數據,都是轉化為Blob數據結構來存儲,網絡,求解器等都是直接與此結構打交道的。 其直觀的可以把它看成一個有4維的結構體(包含數據和梯度),而實際上,它們只是一維的指針而已,其4維結構通過shape屬性得以計算出來(根據C語言的數據順序)。 Blob在也不一定全是4維的,例如全連接層的參數就沒有用四維,后期的版本已經deprecated,而是直接用vector<int> shape_ |
| Blob中的主要數據成員如下,實際是在SyncedMemory上做了一層包裝(SyncedMemory介紹見上一篇blog): protected:shared_ptr<SyncedMemory> data_; //存儲前向傳遞數據shared_ptr<SyncedMemory> diff_; //存儲反向傳遞梯度shared_ptr<SyncedMemory> shape_data_;// 參數維度old versionvector<int> shape_; ?//參數維度int count_; //Blob存儲的元素個數(shape_所有元素乘積)int capacity_;//當前Blob的元素個數(控制動態分配) |
| 主要函數 ? 主要分析如下幾類函數: |
| ? |
caffe系列源碼分析介紹本系列深度學習框架caffe 源碼分析主要內容如下: 1. caffe源碼分析-cmake 工程構建: caffe源碼分析-cmake 工程構建主要內容: 自己從頭構建一遍工程,這樣能讓我更好的了解大型的項目的構建。當然原始的caffe的構建感覺還是比較復雜(主要是cmake),我這里僅僅使用cmake構建,而且簡化點,當然最重要的是支持CLion直接運行調試(如果需要這個工程可以評論留下你的郵箱,我給你發送過去)。 ? 2. caffe的數據內存分配類SyncedMemory, 以及類Blob數據傳輸的媒介. 主要內容: caffe源碼分析-SyncedMemory caffe源碼分析-Blob 其中Blob分析給出了其直接與opencv的圖片相互轉化以及操作,可以使得我們更好的理解Blob. 3. caffe layer的源碼分析,包括從整體上說明了layer類別以及其proto定義與核心函數. 內容如下: caffe源碼分析-layer caffe源碼分析-ReLULayer caffe源碼分析-inner_product_layer caffe源碼分析-layer_factory 首先分析了最簡單的layer Relu,然后在是inner_product_layer全連接層, 最后是layer_factorycaffe中 以此工廠模式create各種Layer. 4. 數據輸入層,主要是多線程+BlockingQueue的方式讀取數據訓練: 內容如下: caffe源碼分析-BlockingQueue caffe源碼分析-InternalThread caffe源碼分析-DataReader 5. IO處理例如讀取proto文件轉化為網絡,以及網絡參數的序列化 內容如下: caffe源碼分析-DataTransformer caffe源碼分析-db, io 6. 最后給出了使用純C++結合多層感知機網絡訓練mnist的示例 內容如下: caffe c++示例(mnist 多層感知機c++訓練,測試) 類似與caffe一樣按照layer、solver、loss、net等模塊構建的神經網絡實現可以見下面這篇blog,相信看懂了這個python的代碼理解caffe框架會更簡單點. 神經網絡python實現 |
| ? |
| 如何學習caffe 知乎上的討論:https://www.zhihu.com/question/27982282? 從0開始山寨caffe系列:http://www.cnblogs.com/neopenx/archive/2016/02.html? caffe源碼閱讀系列:http://blog.csdn.net/xizero00?viewmode=contents? ? ? ? ? ? ? ? ? ? ? ? ? ? ??http://blog.csdn.net/langb2014/article/category/5998589/1? Google Protocol Buffer 的使用和原理:http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/? |
| ? |
| caffe系列源碼分析介紹 本系列深度學習框架caffe 源碼分析主要內容如下: 1. caffe源碼分析-cmake 工程構建: caffe源碼分析-cmake 工程構建主要內容: 自己從頭構建一遍工程,這樣能讓我更好的了解大型的項目的構建。當然原始的caffe的構建感覺還是比較復雜(主要是cmake),我這里僅僅使用cmake構建,而且簡化點,當然最重要的是支持CLion直接運行調試(如果需要這個工程可以評論留下你的郵箱,我給你發送過去)。
主要內容: 3. caffe layer的源碼分析,包括從整體上說明了layer類別以及其proto定義與核心函數. 內容如下: 首先分析了最簡單的layer Relu,然后在是inner_product_layer全連接層, 最后是layer_factorycaffe中 以此工廠模式create各種Layer. 4. 數據輸入層,主要是多線程+BlockingQueue的方式讀取數據訓練: 內容如下: 5. IO處理例如讀取proto文件轉化為網絡,以及網絡參數的序列化 內容如下: 6. 最后給出了使用純C++結合多層感知機網絡訓練mnist的示例 內容如下: caffe c++示例(mnist 多層感知機c++訓練,測試) 類似與caffe一樣按照layer、solver、loss、net等模塊構建的神經網絡實現可以見下面這篇blog,相信看懂了這個python的代碼理解caffe框架會更簡單點. 神經網絡python實現 |
| ? |
| ? |
| ? |
| ? |
| ? |
?
Caffe 源碼解析之 Blob
https://imbinwang.github.io/research/inside-caffe-code-blob
| https://imbinwang.github.io/research/inside-caffe-code-blob |
| Blob作為Caffe的四大模塊之一,負責完成CPU/GPU存儲申請、同步和數據持久化映射。Caffe內部數據存儲和通訊都是通過Blob來完成,Blob提供統一的存儲操作接口,可用來保存訓練數據、模型參數等。 模塊說明 Blob是一個N維連續數組。批處理圖像數據時通常使用4維Blob,Blob的維度可以表示為(N, K, H, W),每個維度的意思分別是:
Blob中數據是row-major存儲的,W是變化最快的維度,例如在(n, k, h, w)處的數據,其物理偏移量計算方式為 ((n?K+k)?H+h)?W+w Caffe中通常只使用4維Blob完成圖像應用,但是Blob完全可以合理地被用來存儲任何數據,例如,
對于自定義數據,通常需要我們自己準備數據處理工具,編寫自定義的data layer。一旦數據準備完畢,剩下的工作交給layers模塊來完成。 實現細節Blob內部其實包含兩個存儲對象data_和diff_,前者存儲前向傳遞的數據,后者存儲反向傳遞的梯度。在blob.hpp中定義了Blob的成員變量, |
| ? |
| 核心操作: ? ?? ?// 參數更新,新參數(data_) = 原參數(data_) - 梯度(diff_)caffe_axpy<Dtype>(count_, Dtype(-1),static_cast<const Dtype*>(diff_->cpu_data()),static_cast<Dtype*>(data_->mutable_cpu_data())); |
| ? |
| ? |
?
https://blog.shinelee.me/2018/11-23-Caffe源碼理解1:Blob存儲結構與設計.html
?
?
?
Layer
| 三、Layer:Caffe的基本計算單元 Layer至少有一個輸入Blob(Bottom Blob)和一個輸出Blob(Top Blob),部分Layer帶有權值和偏置項;
Layer頭文件位于include/caffe/layer.hpp中; |
| ? |
| 注意:caffe類中成員變量名都帶有后綴“_”,這樣再返俗世相中容易區分臨時變量和類變量。 Layer至少有一個輸入Blob(Bottom Blob)和一個輸出Blob(Top Blob),部分Layer帶有權值和偏置項;
Layer頭文件位于include/caffe/layer.hpp中; 四、Net:Caffe中網站的CNN模型,包含若干Layer實例 (1)基本用法 描述文件 ??*.prototxt ???(models/bvlc_reference_caffenet/deploy.prototxt ); (3)Net繪成法 下面有兩類Blob:
Blob提供數據容器的機制; |
?
https://blog.shinelee.me/2018/11-23-Caffe源碼理解1:Blob存儲結構與設計.html
?
Nd=4,Blob表示卷積層kernel參數時,N為當前層輸出特征圖的數量,其與卷積核數量相同,C為當前層輸入特征圖的數量,其與一個卷積核的層數相同,H和W為卷積核的高和寬,每個卷積是三維的即$CHW$。
理解上述這段的基礎見:https://blog.csdn.net/chenxuanhanhao/article/details/99709517
?
第九章
?
第十章
?
?
第十一章
?
第十二章
?
?
第十三章
?
第十四章
?
?
第十五章
?
第十六章
?
第十七章
?
第十八章
?
?
第十九章
?
第二十章
?
?
第二十一章
?
FINAL
總結
以上是生活随笔為你收集整理的深度学习_21天实战Caffe.pdf的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北斗历书与星历数据
- 下一篇: Caffe cuDNN