LRN 局部响应归一化层(Local Response Normalization)

局部响应归一化层(Local Response Normalization)

局部响应归一化层简称LRN,是在深度学习中提高准确度的技术方法。一般是在激活、池化后进行的一中处理方法,因在Alexnet中运用到,故做一下整理。

为什么要引入LRN层?

首先要引入一个神经生物学的概念:侧抑制(lateral inhibitio),即指被激活的神经元抑制相邻的神经元。归一化(normaliazation)的目的就是“抑制”,LRN就是借鉴这种侧抑制来实现局部抑制,尤其是我们使用RELU的时候,这种“侧抑制”很有效 ,因而在alexnet里使用有较好的效果。

归一化有什么好处?

1.归一化有助于快速收敛;
2.对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

【补充:神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
深度网络的训练是复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。】

LRN的公式

公式的解释

首先这个公式中的a表示卷积层(包括卷积操作和池化操作)后的输出结果,这个输出结果的结构是一个四维数组[batch,height,width,channel],
【batch:批次数(每一批为一张图片)
height:图片高度,
width:图片宽度,
channel:通道数可以理解成一批图片中的某一个图片经过卷积操作后输出的神经元个数(或是理解成处理后的图片深度)。】
ai(x,y)表示在这个输出结构中的一个位置[a,b,c,d],可以理解成在某一张图中的某一个通道下的某个高度和某个宽度位置的点,即第a张图的第d个通道下的高度为b宽度为c的点。
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维矩阵的个数,叠加的方向也是在通道方向
公式看上去比较复杂,但理解起来并不难。
i表示第i个核在位置(x,y)运用激活函数ReLU后的输出,n是同一位置上临近的kernal map的数目,N是kernal的总数。
参数K,n,alpha,belta都是超参数
一般设置k=2,n=5,alpha=1Xe-4,beta=0.75
来个示意图:

 

 

补充一下代码:

 

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())

结果:

 

结果解释:

具体参考(https://blog.csdn.net/yangdashi888/article/details/77918311

参考资料(https://blog.csdn.net/hduxiejun/article/details/70570086

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
局部响应归一化Local Response NormalizationLRN)是一种常用的神经网络正则化方法,其作用是对神经元的输出进行归一化,使得其对输入的微小变化不敏感,从而提高模型的泛化能力。下面是使用Python实现局部响应归一化的示例代码: ```python import numpy as np def local_response_normalization(x, alpha=1e-4, k=2, beta=0.75, n=5): # x为输入数据,alpha为参数,k为参数,beta为参数,n为参数 # 在这里,我们假设输入数据为一个四维张量,即(batch_size, height, width, channels) # 首先计算分母部分 square = np.square(x) scale = k for i in range(n//2): scale += alpha * square[:, :, :, i:i+1] for i in range(n//2, x.shape[-1]-n//2): scale += alpha * (square[:, :, :, i-n//2:i-n//2+1] + square[:, :, :, i+n//2:i+n//2+1]) for i in range(x.shape[-1]-n//2, x.shape[-1]): scale += alpha * square[:, :, :, i:i+1] # 计算最终的输出 return x / np.power(scale, beta) ``` 在这里,我们假设输入数据为一个四维张量,即(batch_size, height, width, channels),其中: - alpha:一个超参数,控制归一化的强度。 - k:一个超参数,控制归一化的强度。 - beta:一个超参数,控制归一化的强度。 - n:一个超参数,控制归一化局部范围大小。 实现中,我们先计算分母部分,然后计算最终的输出。其中,分母部分的计算需要分三种情况进行处理。最终的输出即为输入数据除以分母部分的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值