局部响应归一化,可防止过拟合,原理是生物学上的 ‘侧抑制’,局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。(通俗地讲就是 强的更强,弱的更弱)
这个技术主要是深度学习训练时的一种提高准确度的技术方法,LRN一般是在激活、池化后进行的一种处理方法。
LRN 一般用于使用了 RELU 激活函数的层中。
def lrn(input, depth_radius=None, bias=None, alpha=None, beta=None,name=None):
1、参数说明:
- input 表示输入数据,
- depth_radius 表示使用前后几层进行归一化操作,
- bias 表示偏移量,
- alpha 和 beta 表示系数。
2、参考资料:
3、验证公式与函数相对应:
sqr_sum[a, b, c, d] =
sum(input[a, b, c, d - depth_radius : d + depth_radius + 1] ** 2)
output = input / (bias + alpha * sqr_sum) ** beta
import tensorflow as tf
import numpy as np
# 对x的[1, 1, 1, 1]进行局部响应归一化操作,验证公式与函数相对应
# 方式一:公式计算
x = np.array([i for i in range(1, 33)]).reshape([2, 2, 2, 4])
sqr_sum = np.zeros_like(x)
sqr_sum[1, 1, 1, 1] = sum(x[1, 1, 1, 0:3] ** 2)
print(sqr_sum[1, 1, 1, 1])
z = (x[1, 1, 1, 1] / (0 + sqr_sum[1, 1, 1, 1]*1)) ** 1
# 方式二:调用函数
sess = tf.Session()
y = tf.nn.lrn(input=x, depth_radius=1, bias=0, alpha=1, beta=1)
print('Method 1 result: ',z)
print('Method 2 result: ',sess.run(y[1, 1, 1, 1]))
'''
output:
Method 1 result: 0.0111029
Method 2 result: 0.0111029
'''
参考文献:
- 参考博客 tf.nn.lrn(局部响应归一化操作)
- 《解析卷积神经网络》魏秀参