局部响应归一化层(Local Response Normalization)
LRN全称为Local Response Normalization,即局部响应归一化层,LRN函数类似Dropout和数据增强作为relu激活函数之后防止数据过拟合而提出的一种处理方法。这个函数很少使用,基本上被类似Dropout这样的方法取代.
为什么要引入LRN层?
首先要引入一个神经生物学的概念:侧抑制(lateral inhibitio),即指被激活的神经元抑制相邻的神经元。归一化(normaliazation)的目的就是“抑制”,LRN就是借鉴这种侧抑制来实现局部抑制,尤其是我们使用RELU的时候,这种“侧抑制”很有效 ,因而在alexnet里使用有较好的效果。
归一化有什么好处?
1.归一化有助于快速收敛;
2.对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
补充:神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
LRN公式
code:
normal = tf.nn.lrn(input, depth_radius. bias, alpha, beta,name)
●i:代表下标,你要计算像素值的下标,从0计算起
●j:平方累加索引,代表从j~i的像素值平方求和
●x,y:像素的位置,公式中用不到
●a:代表feature map里面的 i 对应像素的具体值
●N:每个feature map里面最内层向量的列数
●k:超参数,由原型中的blas指定
●α:超参数,由原型中的alpha指定
●n/2:超参数,由原型中的deepth_radius指定
●β:超参数,由原型中的belta指定
Tensorflow示例
import tensorflow as tf
a = tf.constant([
[[1.0, 2.0, 3.0, 4.0],
[5.0, 6.0, 7.0, 8.0],
[8.0, 7.0, 6.0, 5.0],
[4.0, 3.0, 2.0, 1.0]],
[[4.0, 3.0, 2.0, 1.0],
[8.0, 7.0, 6.0, 5.0],
[1.0, 2.0, 3.0, 4.0],
[5.0, 6.0, 7.0, 8.0]]
])
#reshape 1批次 2x2x8的feature map
a = tf.reshape(a, [1, 2, 2, 8])
normal_a=tf.nn.lrn(a,2,0,1,1)
with tf.Session() as sess:
print("feature map:")
image = sess.run(a)
print (image)
print("normalized feature map:")
normal = sess.run(normal_a)
print (normal)
来看看是如何计算出来结果的:
normal = tf.nn.lrn(input, depth_radius. bias, alpha, beta,name)
normal=tf.nn.lrn(a,2,0,1,1)
n/2:超参数,由原型中的deepth_radius指定
k:超参数,由原型中的blas指定
α:超参数,由原型中的alpha指定
β:超参数,由原型中的belta指定
由参数可以得出 n/2=2,k=0,α=1,β=1,N=8
(1)第一行的第一个数来说,此时i=0,
(a = 1,min(N-1, i+n/2) = min(7, 2)=2,j = max(0, i - k)=max(0, 0)=0),表示第一行下标从0~2的数平方求和, 也就是1,2,3这三个数的平方求和b=1/(12+22+32)=1/14 = 0.071428571
(2)第一行第四个数来说:此时i = 3
a = 4,min(N-1, i+n/2) = min(7, 5 )=5, j = max(0,1) = 1,这一行下标从1~5的数进行平方求和,b = 4/(22+32+32+42+52+62) = 4/90=0.044444444
以此类推可以计算出其他的数
输出结果:
feature map:
[[[[ 1. 2. 3. 4. 5. 6. 7. 8.]
[ 8. 7. 6. 5. 4. 3. 2. 1.]]
[[ 4. 3. 2. 1. 8. 7. 6. 5.]
[ 1. 2. 3. 4. 5. 6. 7. 8.]]]]
normalized feature map:
[[[[ 0.07142857 0.06666667 0.05454545 0.04444445 0.03703704 0.03157895
0.04022989 0.05369128]
[ 0.05369128 0.04022989 0.03157895 0.03703704 0.04444445 0.05454545
0.06666667 0.07142857]]
[[ 0.13793103 0.10000001 0.0212766 0.00787402 0.05194805 0.04
0.03448276 0.04545454]
[ 0.07142857 0.06666667 0.05454545 0.04444445 0.03703704 0.03157895
0.04022989 0.05369128]]]]
代码中的参数一般设置为k=2,n=5,alpha=1Xe-4,beta=0.75。