說明: 這個屬於個人的一些理解,有錯誤的地方,還希望給予教育哈~
此處以caffe官方提供的AlexNet為例.
目錄:
1.背景
2.框架介紹
3.步驟詳細說明
5.參考文獻
背景:
AlexNet是在2012年被發表的一個金典之作,並在當年取得了ImageNet最好成績,也是在那年之后,更多的更深的神經網路被提出,比如優秀的vgg,GoogleLeNet.
其官方提供的數據模型,准確率達到57.1%,top 1-5 達到80.2%. 這項對於傳統的機器學習分類算法而言,已經相當的出色。
框架介紹:
AlexNet的結構模型如下:
如上圖所示,上圖采用是兩台GPU服務器,所有會看到兩個流程圖,我們這里以一台CPU服務器為例做描述.該模型一共分為八層,5個卷基層,,以及3個全連接層,在每一個卷積層中包含了激勵函數RELU以及局部響應歸一化(LRN)處理,然后在經過降采樣(pool處理),下面我們來逐一的對每一層進行分析下吧.
3. 詳細介紹:
1. 對於conv1層,如下
layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 96 kernel_size: 11 stride: 4 } }
該過程,
1.輸入Input的圖像規格: 224*224*3(RGB圖像),實際上會經過預處理變為227*227*3
2.使用的96個大小規格為11*11的過濾器filter,或者稱為卷積核,進行特征提取,(ps:圖上之所以看起來是48個是由於采用了2個GPU服務器處理,每一個服務器上承擔了48個).
需要特別提一下的是,原始圖片為RBG圖像,也就是三個通道的,我們這96個過濾器也是三通道的,也就是我們使用的實際大小規格為11*11*3,也就是原始圖像是彩色的,我們提取到的特征也是彩色的,在卷積的時候,我們會依據這個公式來提取特征圖: 【img_size - filter_size】/stride +1 = new_feture_size,所以這里我們得到的特征圖大小為:
([227-11] / 4 + 1 )= 55 注意【】表示向下取整. 我們得到的新的特征圖規格為55*55,注意這里提取到的特征圖是彩色的.這樣得到了96個55*55大小的特征圖了,並且是RGB通道的.
需要特別說明的一點是,我們在使用過濾器filter和數據進行卷積時(ps: 卷積就是[1,2,3]*[1,1,1] = 1*1+2*1+3*1=6,也就是對應相乘並求和),而且我們使用的卷積核尺寸是11*11,也就是采用的是局部鏈接,每次連接11*11大小區域,然后得到一個新的特征,再次基礎上再卷積,再得到新的特征,也就是將傳統上采用的全鏈接的淺層次神經網絡,通過加深神經網路層次也就是增加隱藏層,然后下一個隱藏層中的某一個神經元是由上一個網絡層中的多個神經元乘以權重加上偏置之后得到的,也就是所偶為的權值共享,通過這來逐步擴大局部視野,(形狀像金字塔),最后達到全鏈接的效果. 這樣做的好處是節約內存,一般而言,節約空間的同時,消耗時間就會相應的增加,但是近幾年的計算機計算速度的提升,如GPU.已經很好的解決了這個時間的限制的問題.
3. 使用RELU激勵函數,來確保特征圖的值范圍在合理范圍之內,比如{0,1},{0,255}
最后還有一個LRN處理,但是由於我一直都是沒用這玩意,所以,哈哈哈哈哈哈,沒有深切的體會,就沒有發言權.
4. 降采樣處理(pool層也稱為池化),如下圖:
layer { name: "pool1" type: "Pooling" bottom: "norm1" top: "pool1" pooling_param { pool: MAX kernel_size: 3 stride: 2 } }
5. 使用LRN,中文翻譯為局部區域歸一化,對降采樣的特征圖數據進行如果,其中LRN又存在兩種模式:
5.1 源碼默認的是ACROSS_CHANNELS ,跨通道歸一化(這里我稱之為弱化),local_size:5(默認值),表示局部弱化在相鄰五個特征圖間中求和並且每一個值除去這個和.
官方給的是內核是3*3大小,該過程就是3*3區域的數據進行處理(求均值,最大/小值,就是區域求均值,區域求最大值,區域求最小值),通過降采樣處理,我們可以得到
( [55-3] / 2 + 1 ) = 27 ,也就是得到96個27*27的特征圖,然后再以這些特征圖,為輸入數據,進行第二次卷積.
conv2層,如下圖:
對應的caffe:
layer { name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 256 pad: 2 kernel_size: 5 group: 2 } }
conv2和conv1不同,conv2中使用256個5*5大小的過濾器filter對96*27*27個特征圖,進行進一步提取特征,但是處理的方式和conv1不同,過濾器是對96個特征圖中的某幾個特征圖中相應的區域乘以相應的權重,然后加上偏置之后所得到區域進行卷積,比如過濾器中的一個點X11 ,如X11*new_X11,需要和96個特征圖中的1,2,7特征圖中的X11,new_X11 =1_X_11*1_W_11+2_X_11*2_W_11+7_X_11*7_W_11+Bias,經過這樣卷積之后,然后在在加上寬度高度兩邊都填充2像素,會的到一個新的256個特征圖.特征圖的大小為:
(【27+2*2 - 5】/1 +1) = 27 ,也就是會有256個27*27大小的特征圖.
然后進行ReLU操作.
再進行降采樣【pool】處理,如下圖,得到
layer { name: "pool2" type: "Pooling" bottom: "norm2" top: "pool2" pooling_param { pool: MAX kernel_size: 3 stride: 2 } }
得到: 【27-3】/2 +1 = 13 也就是得到256個13*13大小的特征圖.
conv3層,如下圖:
layer { name: "conv3" type: "Convolution" bottom: "pool2" top: "conv3" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 384 pad: 1 kernel_size: 3 } }
得到【13+2*1 -3】/1 +1 = 13 , 384個13*13的新特征圖.
conv3沒有使用降采樣層.
conv4層:
layer { name: "conv4" type: "Convolution" bottom: "conv3" top: "conv4" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 384 pad: 1 kernel_size: 3 group: 2 } }
依舊
得到【13+2*1 -3】/1 +1 = 13 , 384個13*13的新特征圖.
conv4沒有使用降采樣層.
conv5層,如下圖:

layer { name: "conv5" type: "Convolution" bottom: "conv4" top: "conv5" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 256 pad: 1 kernel_size: 3 group: 2 } }
得到256個13*13個特征圖.
降采樣層pool,防止過擬合:
layer { name: "pool5" type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { pool: MAX kernel_size: 3 stride: 2 } }
得到: 256個 (【13 - 3】/2 +1)=6 6*6大小的特征圖.
fc6全鏈接圖:
描述一下: 這里使用4096個神經元,對256個大小為6*6特征圖,進行一個全鏈接,也就是將6*6大小的特征圖,進行卷積變為一個特征點,然后對於4096個神經元中的一個點,是由256個特征圖中某些個特征圖卷積之后得到的特征點乘以相應的權重之后,再加上一個偏置得到.
layer { name: "drop6" type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } }
再進行一個dropout隨機從4096個節點中丟掉一些節點信息(也就是值清0),然后就得到新的4096個神經元.
fc7全連接層:
和fc6類似.
fc8鏈接層:
采用的是1000個神經元,然后對fc7中4096個神經元進行全鏈接,然后會通過高斯過濾器,得到1000個float型的值,也就是我們所看到的預測的可能性,
如果是訓練模型的話,會通過標簽label進行對比誤差,然后求解出殘差,再通過鏈式求導法則,將殘差通過求解偏導數逐步向上傳遞,並將權重進行推倒更改,類似與BP網絡思慮,然后會逐層逐層的調整權重以及偏置.
5.參考文獻:
ImageNet https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
BP神經網絡 https://www.zhihu.com/question/27239198
還有一些當時學習的時候看過,不過時隔久遠,已經忘了地址了.