Tensorflow的LRN是怎么做的

上海站 | 高性能计算之GPU CUDA培训

4月13-15日
三天密集式训练 快速带你晋级
阅读全文
>


正文共1699个字,2张图,预计阅读时间5分钟。


LRN全称是local response normalization,局部响应归一化,想了解原理的点这个AlexNet(http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks)。


看了Alex写的论文,里面介绍了LRN,稀里糊涂的,第一遍根本没看懂,于是我就想,先看看tensorflow怎么做的LRN吧,然后我就看明白了,但我貌似讲不太明白。。。。首先,公式是这样的:

LRN


其次,官方API的介绍是这样的:


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


以alexnet的论文为例,输入暂且定为 [batch_size, 224, 224, 96],这里224×224是图片的大小,经过第一次卷积再经过ReLU,就是LRN函数的输入。


注意上面API说明里的sum函数,意思就是,可能解释起来比较拗口,针对batch里每一个图的后3维向量,[224, 224,  d - depth_radius : d + depth_radius + 1],对它按照半径 depth_radius求每个图里的每个像素的平方,再把这2× depth_radius+1个平方过后的图片加起来,就得到了这个batch的sqr_sum。


不得不说,上面一段解释太差强人意了,貌似还不太对,于是我又思考了一下,从新解释,顺便给出一个小程序以验证,程序如下:


import numpy as npimport tensorflow as tf a = 2 * np.ones([2, 2, 2, 3]) b = tf.nn.local_response_normalization(a, 1, 0, 1, 1) sess = tf.Session()print sess.run(b)


为了简化,上面的程序中令depth_radius=1,bias=0,alpha=1,beta=1,这样算出的结果就相当于:


output = input / sqr_sum


实际运行的结果是这样的:


# a的原始值

array([[[[ 2.,  2.,  2.],           

[ 2.,  2.,  2.]],       

 [[ 2.,  2.,  2.],        

 [ 2.,  2.,  2.]]],       

[[[ 2.,  2.,  2.],        

 [ 2.,  2.,  2.]],       

 [[ 2.,  2.,  2.],        

 [ 2.,  2.,  2.]]]]

# a经过LRN之后的值

array([[[[ 0.25      ,  0.16666667,  0.25      ],  

        [ 0.25      ,  0.16666667,  0.25      ]],        

[[ 0.25      ,  0.16666667,  0.25      ],         

[ 0.25      ,  0.16666667,  0.25      ]]],       

[[[ 0.25      ,  0.16666667,  0.25      ],         

[ 0.25      ,  0.16666667,  0.25      ]],       

 [[ 0.25      ,  0.16666667,  0.25      ],         

[ 0.25      ,  0.16666667,  0.25      ]]]], dtype=float32)


这样就很明显了,针对上面的例子,解释如下:


先求某个图(就叫图A吧)周围1半径内(这个半径在第四个维度上,包括图A本身)的图的像素的平方和S,S是三个图像素平方和相加的结果,S的shape是[2, 2],然后A除以S,如下


A = [[2, 2],    S = [[12, 12],     [2, 2]]         [12, 12]] O = A/S  = [[0.16666667, 0.16666667],     [0.16666667, 0.16666667]]


这就是上面0.16666667这个数的由来了,总的来讲,当depth_radius=1,bias=0,alpha=1,beta=1时,LRN就是“每个图”除以“半径以内的其他图对应像素的平方和”,就是结果啦!


只能解释到这里了。。


最后还想再说一句,根据Stanford的CS231(http://cs231n.github.io/)所讲,最近LRN用的并不多,因为效果不好吧。


原文链接:https://www.jianshu.com/p/c06aea337d5d


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值