1. 程式人生 > >AlexNet詳解2

AlexNet詳解2

網路 5.1 alexnet mage 限制 結構 net 內存 分享

此處以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層,如下圖:

技術分享

技術分享 View Code

得到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
  }
}
技術分享

AlexNet詳解2