深度学习的局部响应归一化LRN
深度学习的局部响应归一化LRN
LRN这个概念和运用是出现在AlexNet中。LRN最初是生物学里的概念“相邻神经元抑制”,对局部神经元的活动创建竞争机制。使用LRN增加了泛化能力(使输出中响应比较大的值变得相对更大,并抑制其他响应较小的神经元),做了平滑处理,提高了1%~2%的识别率。
在Tensorflow中有对应的函数
tf.nn.lrn(input,depth_radius=None,bias=None,alpha=None,beta=None,name=None)
在AlexNet的论文中,有局部响应归一化的公式
接下来,我们分析这个公式
公式中的表示卷积层(卷积操作和池化操作)后的输出,输出结果是一个四维数组[batch, height, width, channel],看作channel个3维矩阵
:输出结果中一个位置[a,b,c,d],可以理解为某一张图的某一个点的第几个通道。
: 通道数
超参数
: 函数中的input
: 函数中的depth_radius,表示在channel这个坐标轴上的半径,包括的channel个数
: bias
: alpha
这么说还不够形象,那么就用图来说明。可以从图中看出,求和所选择的点范围是以n/2为半径的,这个半径的坐标轴是channel。
简单的代码来帮助我们理解LRN的作用
下面的矩阵可以理解为一张图片,大小为一个像素,有三个通道。
import tensorflow as tf
import numpy as np
a = 2 * np.ones([1, 1, 1, 3]) # array([[[[2., 2., 2.]]]])
b = tf.nn.local_response_normalization(a, 1, 0, 1, 1)
sess = tf.Session()
print(sess.run(b))
# Output:
# [[[[0.25 0.16666667 0.25 ]]]]
import tensorflow as tf
import numpy as np
a = np.arange(3)
a = a.reshape([1, 1, 1, 3]) # array([[[[0, 1, 2]]]])
b = tf.nn.local_response_normalization(a, 1, 0, 1, 1)
sess = tf.Session()
print(sess.run(b))
# Output:
# [[[[0. 0.2 0.4]]]]
可以看到,对于两边的channel,看到边缘突出,增加反差。生物学上的解释是相近的神经元彼此之间发生的抑制作用,即在某个神经元受到刺激而产生兴奋时,再刺激相近的神经元,则后者所发生的兴奋对前者产生的抑制作用。
注意在2015年的《Very Deep Convolutional Networks for Large-Scale Image Recognition》中,说明了LRN在IILSVRC数据集上不能对性能进行改善。主流的模型中基本不使用LRN。
参考博客