深度学习:局部响应归一化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的论文中,有局部响应归一化的公式
接下来,我们分析这个公式

公式中的 a a a表示卷积层(卷积操作和池化操作)后的输出,输出结果是一个四维数组[batch, height, width, channel],看作channel个3维矩阵

a x , y i a^i_{x,y} ax,yi:输出结果中一个位置[a,b,c,d],可以理解为某一张图的某一个点的第几个通道。
N N N: 通道数

超参数
a a a: 函数中的input
n 2 \frac{n}{2} 2n: 函数中的depth_radius,表示在channel这个坐标轴上的半径,包括的channel个数
k k k: 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。

参考博客

  1. https://blog.csdn.net/yangdashi888/article/details/77918311
  2. https://blog.csdn.net/hduxiejun/article/details/70570086
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值