深度學習之局部響應歸一化LRN(Local Response Normalization)

 

1、LRN 局部響應歸一化:

這個技術主要是深度學習訓練時的一種提高準確度的技術方法。其中caffe、tensorflow等裏面是很常見的方法,其跟激活函數是有區別的,LRN一般是在激活、池化後進行的一中處理方法。

AlexNet將LeNet的思想發揚光大,把CNN的基本原理應用到了很深很寬的網絡中。

AlexNet主要使用到的新技術點如下:

(1)成功使用ReLU作爲CNN的激活函數,並驗證其效果在較深的網絡超過了Sigmoid,成功解決了Sigmoid在網絡較深時的梯度彌散問題。雖然ReLU激活函數在很久之前就被提出了,但是直到AlexNet的出現纔將其發揚光大。

(2)訓練時使用Dropout隨機忽略一部分神經元,以避免模型過擬合。Dropout雖有單獨的論文論述,但是AlexNet將其實用化,通過實踐證實了它的效果。在AlexNet中主要是最後幾個全連接層使用了Dropout。

(3)在CNN中使用重疊的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。並且AlexNet中提出讓步長比池化核的尺寸小,這樣池化層的輸出之間會有重疊和覆蓋,提升了特徵的豐富性。

(4)提出了LRN層,對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。

其中LRN的詳細介紹如下:   (鏈接地址:tensorflow下的局部響應歸一化函數tf.nn.lrn)

實驗環境:windows 7,anaconda 3(Python 3.5),tensorflow(gpu/cpu) 
函數:tf.nn.lrn(input,depth_radius=None,bias=None,alpha=None,beta=None,name=None)
 

函數解釋援引自tensorflow官方文檔 
https://www.tensorflow.org/api_docs/python/tf/nn/local_response_normalization 
The 4-D input tensor is treated as a 3-D array of 1-D vectors (along the last dimension), and each vector is normalized independently. Within a given vector, each component is divided by the weighted, squared sum of inputs within depth_radius. In detail, 
sqr_sum[a, b, c, d] = 
sum(input[a, b, c, d - depth_radius : d + depth_radius + 1] ** 2) 
output = input / (bias + alpha * sqr_sum) ** beta

背景知識: 


tensorflow官方文檔中的tf.nn.lrn函數給出了局部響應歸一化的論文出處 


詳見http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks 

 

以及:
爲什麼要有LRN?
 

局部響應歸一化原理是仿造生物學上活躍的神經元對相鄰神經元的抑制現象(側抑制)


這裏寫圖片描述

公式解釋: 

因爲這個公式是出自CNN論文的,所以在解釋這個公式之前讀者應該瞭解什麼是CNN,可以參見 
http://blog.csdn.net/whiteinblue/article/details/25281459 
http://blog.csdn.net/stdcoutzyx/article/details/41596663 
http://www.jeyzhang.com/cnn-learning-notes-1.html 
這個公式中的a表示卷積層(包括卷積操作和池化操作)後的輸出結果,這個輸出結果的結構是一個四維數組[batch,height,width,channel],

這裏可以簡單解釋一下,batch就是批次數(每一批爲一張圖片),height就是圖片高度,width就是圖片寬度,channel就是通道數可以理解成一批圖片中的某一個圖片經過卷積操作後輸出的神經元個數(或是理解成處理後的圖片深度)。

ai(x,y)表示在這個輸出結構中的一個位置[a,b,c,d],可以理解成在某一張圖中的某一個通道下的某個高度和某個寬度位置的點,即第a張圖的第d個通道下的高度爲b寬度爲c的點。

論文公式中的N表示通道數(channel)。a,n/2,k,α,β分別表示函數中的input,depth_radius,bias,alpha,beta,其中n/2,k,α,β都是自定義的,特別注意一下疊加的方向是沿着通道方向的,即每個點值的平方和是沿着a中的第3維channel方向的,也就是一個點同方向的前面n/2個通道(最小爲第0個通道)和後n/2個通道(最大爲第d-1個通道)的點的平方和(共n+1個點)。而函數的英文註解中也說明了把input當成是d個3維的矩陣,說白了就是把input的通道數當作3維矩陣的個數,疊加的方向也是在通道方向。 


畫個簡單的示意圖:
這裏寫圖片描述

 

代碼:

import tensorflow as tf
import numpy as np
x = np.array([i for i in range(1,33)]).reshape([2,2,2,4])
y = tf.nn.lrn(input=x,depth_radius=2,bias=0,alpha=1,beta=1)
 
with tf.Session() as sess:
    print(x)
    print('#############')
    print(y.eval())

這裏寫圖片描述 
結果解釋: 
這裏要注意一下,如果把這個矩陣變成圖片的格式是這樣的 
這裏寫圖片描述 
然後按照上面的敘述我們可以舉個例子比如26對應的輸出結果0.00923952計算如下 


26/(0+1*(25^2+26^2+27^2+28^2))^1

 

 

3.後期爭議
在2015年 Very Deep Convolutional Networks for Large-Scale Image Recognition.提到LRN基本沒什麼用。

在Alexnet模型中首次提出這個概念。

這裏寫圖片描述


參考文獻:

[LRN]:ImageNet Classification with Deep Convolutional Neural Networks
 

發佈了101 篇原創文章 · 獲贊 317 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章