详解LRN(local response normalization--局部响应标准化)缓解过拟合

局部响应归一化层(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。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
局部响应归一化(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:一个超参数,控制归一化的局部范围大小。 实现中,我们先计算分母部分,然后计算最终的输出。其中,分母部分的计算需要分三种情况进行处理。最终的输出即为输入数据除以分母部分的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值