理解Caffe的網絡模型

目錄

  • 1. 初見LeNet原始模型
  • 2. Caffe LeNet的網絡結構
  • 3. 逐層理解Caffe LeNet
    • 3.1 Data Layer
    • 3.2 Conv1 Layer
    • 3.3 Pool1 Layer
    • 3.4 Conv2 Layer
    • 3.5 Pool2 Layer
    • 3.6 Ip1 Layer
    • 3.7 Relu1 Layer
    • 3.8 Ip2 Layer
    • 3.9 Loss Layer

1. 初見LeNet原始模型

?

1

Fig.1. Architecture of original LeNet-5.

圖片來源: Lecun, et al., Gradient-based learning applied to document recognition,?P IEEE, vol. 86, no. 11, 1998, pp. 2278-2324.

在這篇圖片的論文中,詳細描述了LeNet-5的結構。

這里不對LeNet-5原始模型進行討論。可以參考這些資料:

http://blog.csdn.net/qiaofangjie/article/details/16826849

http://blog.csdn.net/xuanyuansen/article/details/41800721

回到頂部(go to top)

2. Caffe LeNet的網絡結構

他山之石,可以攻玉。本來是準備畫出Caffe LeNet的圖的,但發現已經有人做了,并且畫的很好,就直接拿過來輔助理解了。

第3部分圖片來源:http://www.2cto.com/kf/201606/518254.html

先從整體上感知Caffe LeNet的拓撲圖,由于Caffe中定義網絡的結構采用的是bottom&top這種上下結構,所以這里的圖也采用這種方式展現出來,更加方便理解。

1

Fig.2. Architecture of caffe LeNet.

From bottom to top: Data Layer, conv1, pool1, conv2, pool2, ip1, relu1, ip2, [accuracy]loss.

本節接下來將按照這個順序依次理解Caffe LeNet的網絡結構。

3. 逐層理解Caffe LeNet
本節將采用定義與圖解想結合的方式逐層理解Caffe LeNet的結構。3.1 Data Layer
#==============定義TRAIN的數據層============================================
layer { name: "mnist" #定義該層的名字type: "Data"  #該層的類型是數據top: "data"   #該層生成一個data blobtop: "label"  #該層生成一個label blobinclude {phase: TRAIN #說明該層只在TRAIN階段使用}transform_param {scale: 0.00390625 #數據歸一化系數,1/256,歸一到[0,1)}data_param {source: "E:/MyCode/DL/caffe-master/examples/mnist/mnist_train_lmdb" #訓練數據的路徑batch_size: 64 #批量處理的大小backend: LMDB}
}
#==============定義TEST的數據層============================================
layer { name: "mnist"type: "Data"top: "data"top: "label"include {phase: TEST #說明該層只在TEST階段使用}transform_param {scale: 0.00390625}data_param {source: "E:/MyCode/DL/caffe-master/examples/mnist/mnist_test_lmdb" #測試數據的路徑batch_size: 100backend: LMDB}
}
2Fig.3. Architecture of data layer.Fig.3 是train情況下,數據層讀取lmdb數據,每次讀取64條數據,即N=64。Caffe中采用4D表示,N*C*H*W(Num*Channels*Height*Width)。3.2 Conv1 Layer
#==============定義卷積層1=============================
layer {name: "conv1"       #該層的名字conv1,即卷積層1type: "Convolution" #該層的類型是卷積層bottom: "data"      #該層使用的數據是由數據層提供的data blobtop: "conv1"        #該層生成的數據是conv1param {lr_mult: 1        #weight learning rate(簡寫為lr)權值的學習率,1表示該值是lenet_solver.prototxt中base_lr: 0.01的1倍}param {lr_mult: 2        #bias learning rate偏移值的學習率,2表示該值是lenet_solver.prototxt中base_lr: 0.01的2倍}convolution_param {num_output: 20    #產生20個輸出通道kernel_size: 5    #卷積核的大小為5*5stride: 1         #卷積核移動的步幅為1weight_filler {type: "xavier"  #xavier算法,根據輸入和輸出的神經元的個數自動初始化權值比例}bias_filler {type: "constant"  #將偏移值初始化為“穩定”狀態,即設為默認值0}}
}
3Fig.4. Architecture of conv1 layer.conv1的數據變化的情況:batch_size*1*28*28->batch_size*20*24*243.3 Pool1 Layer
#==============定義池化層1=============================
layer {name: "pool1"type: "Pooling"bottom: "conv1"     #該層使用的數據是由conv1層提供的conv1top: "pool1"        #該層生成的數據是pool1pooling_param {pool: MAX         #采用最大值池化kernel_size: 2    #池化核大小為2*2stride: 2         #池化核移動的步幅為2,即非重疊移動}
}
4Fig.5. Architecture of pool1 layer.池化層1過程數據變化:batch_size*20*24*24->batch_size*20*12*123.4 Conv2 Layer
#==============定義卷積層2=============================
layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}
conv2層的圖與Fig.4 類似,卷積層2過程數據變化:batch_size*20*12*12->batch_size*50*8*8。3.5 Pool2 Layer
#==============定義池化層2=============================
layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: MAXkernel_size: 2stride: 2}
}
pool2層圖與Fig.5類似,池化層2過程數據變化:batch_size*50*8*8->batch_size*50*4*4。3.6 Ip1 Layer
#==============定義全連接層1=============================
layer {name: "ip1"type: "InnerProduct" #該層的類型為全連接層bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500 #有500個輸出通道weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}
5Fig.6. Architecture of ip11 layer.ip1過程數據變化:batch_size*50*4*4->batch_size*500*1*1。此處的全連接是將C*H*W轉換成1D feature vector,即800->500.3.7 Relu1 Layer
#==============定義ReLU1層=============================
layer {name: "relu1"type: "ReLU"bottom: "ip1"top: "ip1"
}
6
Fig.7. Architecture of relu1 layer.
ReLU1層過程數據變化:batch_size*500*1*1->batch_size*500*1*13.8 Ip2 Layer
#==============定義全連接層2============================
layer {name: "ip2"type: "InnerProduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10          #10個輸出數據,對應0-9十個數字weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}
ip2過程數據變化:batch_size*500*1*1->batch_size*10*1*13.9 Loss Layer
#==============定義損失函數層============================
layer {name: "loss"type: "SoftmaxWithLoss"bottom: "ip2"bottom: "label"top: "loss"
}
7Fig.8. Architecture of loss layer.損失層過程數據變化:batch_size*10*1*1->batch_size*10*1*1note:注意到caffe LeNet中有一個accuracy layer的定義,這是輸出測試結果的層。回到頂部(go to top)
4. Caffe LeNet的完整定義
name: "LeNet" #定義網絡的名字
#==============定義TRAIN的數據層============================================
layer { name: "mnist" #定義該層的名字type: "Data"  #該層的類型是數據top: "data"   #該層生成一個data blobtop: "label"  #該層生成一個label blobinclude {phase: TRAIN #說明該層只在TRAIN階段使用}transform_param {scale: 0.00390625 #數據歸一化系數,1/256,歸一到[0,1)}data_param {source: "E:/MyCode/DL/caffe-master/examples/mnist/mnist_train_lmdb" #訓練數據的路徑batch_size: 64 #批量處理的大小backend: LMDB}
}
#==============定義TEST的數據層============================================
layer { name: "mnist"type: "Data"top: "data"top: "label"include {phase: TEST #說明該層只在TEST階段使用}transform_param {scale: 0.00390625}data_param {source: "E:/MyCode/DL/caffe-master/examples/mnist/mnist_test_lmdb" #測試數據的路徑batch_size: 100backend: LMDB}
}
#==============定義卷積層1=============================
layer {name: "conv1"       #該層的名字conv1,即卷積層1type: "Convolution" #該層的類型是卷積層bottom: "data"      #該層使用的數據是由數據層提供的data blobtop: "conv1"        #該層生成的數據是conv1param {lr_mult: 1        #weight learning rate(簡寫為lr)權值的學習率,1表示該值是lenet_solver.prototxt中base_lr: 0.01的1倍}param {lr_mult: 2        #bias learning rate偏移值的學習率,2表示該值是lenet_solver.prototxt中base_lr: 0.01的2倍}convolution_param {num_output: 20    #產生20個輸出通道kernel_size: 5    #卷積核的大小為5*5stride: 1         #卷積核移動的步幅為1weight_filler {type: "xavier"  #xavier算法,根據輸入和輸出的神經元的個數自動初始化權值比例}bias_filler {type: "constant"  #將偏移值初始化為“穩定”狀態,即設為默認值0}}
}#卷積過程數據變化:batch_size*1*28*28->batch_size*20*24*24
#==============定義池化層1=============================
layer {name: "pool1"type: "Pooling"bottom: "conv1"     #該層使用的數據是由conv1層提供的conv1top: "pool1"        #該層生成的數據是pool1pooling_param {pool: MAX         #采用最大值池化kernel_size: 2    #池化核大小為2*2stride: 2         #池化核移動的步幅為2,即非重疊移動}
}#池化層1過程數據變化:batch_size*20*24*24->batch_size*20*12*12
#==============定義卷積層2=============================
layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}#卷積層2過程數據變化:batch_size*20*12*12->batch_size*50*8*8
#==============定義池化層2=============================
layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: MAXkernel_size: 2stride: 2}
}#池化層2過程數據變化:batch_size*50*8*8->batch_size*50*4*4
#==============定義全連接層1=============================
layer {name: "ip1"type: "InnerProduct" #該層的類型為全連接層bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500 #有500個輸出通道weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}#全連接層1過程數據變化:batch_size*50*4*4->batch_size*500*1*1
#==============定義ReLU1層=============================
layer {name: "relu1"type: "ReLU"bottom: "ip1"top: "ip1"
}#ReLU1層過程數據變化:batch_size*500*1*1->batch_size*500*1*1
#==============定義全連接層2============================
layer {name: "ip2"type: "InnerProduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10          #10個輸出數據,對應0-9十個數字weight_filler {type: "xavier"}bias_filler {type: "constant"}}
}#全連接層2過程數據變化:batch_size*500*1*1->batch_size*10*1*1
#==============定義顯示準確率結果層============================
layer {name: "accuracy"type: "Accuracy"bottom: "ip2"bottom: "label"top: "accuracy"include {phase: TEST}
}
#==============定義損失函數層============================
layer {name: "loss"type: "SoftmaxWithLoss"bottom: "ip2"bottom: "label"top: "loss"
}#損失層過程數據變化:batch_size*10*1*1->batch_size*10*1*1

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444667.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git(8)-分支

分支1. 分支名2. 創建分支-git branch3. 查看分支-git show-branch4. 檢出分支4.1 有未提交的修改時進行檢出4.2 合并變更到不同的分支git checkout -m5. 分離HEAD 分支6.刪除分支分支操作命令概覽 git branch # 列出版本庫中的分支 git branch -r # 列出遠程跟蹤分支…

caffe開始訓練自己的模型(轉載并驗證過)

學習caffe中踩了不少坑,這里我參考了此博主的文章,并體會到了如何訓練自己的模型:http://www.cnblogs.com/denny402/p/5083300.html 學習caffe的目的,不是簡單的做幾個練習,最終還是要用到自己的實際項目或科研中。因…

leetcode169. 多數元素

給定一個大小為 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數大于 ? n/2 ? 的元素。 你可以假設數組是非空的,并且給定的數組總是存在多數元素。 示例 1: 輸入: [3,2,3] 輸出: 3 示例 2: 輸入: [2,2,1,1,1,2,2] 輸出: 2 思路&…

Git(9)-diff

分支1. diff in Linux/Unix2. diff in Git3. git diff 兩點語法Linux/Unix 系統中存在diff 命令,可以用來顯示兩個文本/工作路徑的差異。Git diff 在此基礎上進行的擴展。 1. diff in Linux/Unix Linux 系統中的diff 命令:提供了一個文件如何轉化為另一…

圖像拼接(一):柱面投影+模板匹配+漸入漸出融合

這種拼接方法的假設前提是:待拼接的兩幅圖像之間的變換模型是平移模型,即兩幅圖像同名點位置之間只相差兩個未知量:ΔxΔx 和ΔyΔy,自由度為2,模型收得最緊。所以只有所有圖像都是用同一水平線或者同一已知傾斜角的攝…

圖像拼接(二):OpenCV同時打開兩個攝像頭捕獲視頻

使用OpenCV實現同時打開兩個USB攝像頭,并實時顯示視頻。如果未檢測有兩個攝像頭,程序會結束并發出“攝像頭未安裝好”的警告。這里推薦一個小巧的攝像頭視頻捕捉軟件:amcap,使用它可以方便的檢查每個攝像頭是否能正常工作。 捕獲…

Git(10)-merge

Merge1. 無沖突合并2. 有沖突合并-手動解決3. git diff in merge4. 廢棄合并5. 合并策略merge相關的操作的命令 git checkout master git merge alternate # 解決沖突 ..... git add file_1 git commit -m "Add slternate line 5, 6" git reset --hard HEAD # b…

elasticsearch的Linux下安裝報錯問題解決

1.啟動報錯如下: vim /etc/security/limits.conf 然后修改如下 * soft nofile 65536 * hard nofile 65536sudo vi /etc/pam.d/common-session 添加 session required pam_limits.so sudo vi /etc/pam.d/common-session-noninteractive 添加 session required pam_limits.so…

leetcode120. 三角形最小路徑和

給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。 例如,給定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自頂向下的最小路徑和為 11(即,2 3 5 1 11&#xff0…

Elasticsearchan相關插件和工具安裝

1、下載elasticsearch-head的源碼包 地址:https://github.com/mobz/elasticsearch-head/releases 2、安裝node運行環境 地址:https://nodejs.org/en/download/ 3、安裝完node之后編譯elasticsearch-head 執行npm install -g grunt-cli編譯源碼 執行…

Git(11)-cherry-pick、reset、rebase

更改提交,版本回退1.get reset 重置HEAD指針的指向2.git cherry-pick3.git revert4.git commit --amend修改提交5.git rebase 變基提交5.1 git rebase --onto5.2rebase 產生沖突,解決沖突/終止變基5.3git rebase -i6. rebase Vs mergegit 提供了【修改】…

Elasticsearch集群節點配置詳解

注意:如果是在局域網中運行elasticsearch集群也是很簡單的,只要cluster.name設置一致,并且機器在同一網段下,啟動的es會自動發現對方,組成集群。 三、配置淺涉 elasticsearch的config文件夾里面有兩個配置文件&#…

MongoDB修改器使用

歡迎關注我的新微信公眾號 ipgame,有什么問題可以提供交流的平臺,歡迎大家討論。 對于文檔的更新除替換外,針對某個或多個文檔只需要部分更新可使用原子的更新修改器,能夠高效的進行文檔更新。更新修改器是中特殊的鍵, 用來指定復雜的操作,比如增加、刪除或者調整鍵,還…

Git(12)-stash, reflog

git stash1. git stash2. reflog命令概覽git stash save "WIP:xxxxx" # save后可以跟筆記,WIP:work in process git stash list # 查看存儲狀態棧的條目 git stash pop # 當前工作目錄和索引還原至最近一次save操作的內容…

cmake生成Win64位工程

使用cmake編譯64的dll 一開始使用cmake --build .來生成了dll,在導入到java項目中使用的時候,才發現是32位的。導致程序不能正常運行,報錯如下: Exception in thread "main" java.lang.UnsatisfiedLinkError Cant load…

leetcode 106. 從中序與后序遍歷序列構造二叉樹

根據一棵樹的中序遍歷與后序遍歷構造二叉樹。 注意: 你可以假設樹中沒有重復的元素。 例如,給出 中序遍歷 inorder [9,3,15,20,7] 后序遍歷 postorder [9,15,7,20,3] 返回如下的二叉樹: 3 / \ 9 20 / \ 15 7 思路:和前…

Mat矩陣(圖像容器)的創建及CV_8UC1,CV_8UC2等參數詳解

一)Mat矩陣(圖像容器)創建時CV_8UC1,CV_8UC2等參數詳解 1--Mat不但是一個非常有用的圖像容器類,同時也是一個通用的矩陣類 2--創建一個Mat對象的方法很多 3--使用Mat圖像容器類創建Mat類的對象 //! default constructor Mat(); //! constructs …

TensorFlow(1)-模型相關基礎概念

TensorFlow-11.Graph對象2.Session對象3.Variabels變量4. placeholders與feed_dict5. tf.train.Saver() 模型參數保存、加載Tensorflow 中文官網教程–2.0版本的官方教程 TensorFlow教程:TensorFlow快速入門教程(非常詳細) pytorch Vs tensor…

memcache的使用入門C++代碼

下載源碼編譯,memcached就是生成的主程序,啟動可指定端口,memcached作為server端,依然是我們熟悉的cs模式,使用兩個client一個setkey,一個getkey一百萬個做測試。 ./memcached -d -m 300 -p 11211 -u root…

leetcode78 子集

給定一組不含重復元素的整數數組 nums,返回該數組所有可能的子集(冪集)。 說明:解集不能包含重復的子集。 示例: 輸入: nums [1,2,3] 輸出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 思路&…