深度学习中的感受野计算
来源:互联网 发布:剑网三军爷脸数据 编辑:程序博客网 时间:2024/05/17 22:35
参考链接:
http://blog.csdn.net/gzq0723/article/details/53138430
http://blog.csdn.net/kuaitoukid/article/details/46829355
这两篇博客各有优缺点,我结合自己的理解分析一下。
概念:
感受野(receive field)是指当前feature map中的一个原子点P与输入层中多少个原子个数相关的问题,假设输入层相关的点为(RF*RF)个(假设长宽两个方向上做同样尺度的操作),即输入层中RF*RF个原子值的变化会影响当前feature map中的指定原子P,而输入层中其他原子变化并不会影响这个指定原子P。显然局部感受野只跟kernel size有关,与stride无关。这也是卷积层的两个重要特性之一(局部感受野和参数共享)。显然RF>=1.
当然感受野也可以作为一个相对概念,即不一定是相对于输入层的感受野,你也可以定义任意层l1相对于另外任意层L2的相对域(只需要满足约束条件:L2不能再L1层的后面,档L1==L2时,RF==1).
问题:求任意层的输出Feature map上的感受野F(则感受原子点个数即为F*F).
首先我们来分析比较简单的一种情况:
输入层通过第1层(type = conv,kernel_size =3,stride =1),再通过第2层(type = pool,kernel_size =2,stride =2),求第2层的输出feature map 在输入层的感受野F.
显然,这是很简单的模型,第一层对于输入层的感受野为3(只跟kernel_size有关),第二层对第一层的感受野为2(只跟kernel_size有关),那第二层对输入层呢?动手画一画,就知道第2层对输入层的感受野为4*4。我们在分析的过程中,是不是现求第二层对第一层的感受野,然后结合第一层对输入层的感受野,算出第二层对输入层的感受野。这就等价一个递归关系。
现在来看一般情况:
假设第i层上对第j层的局部感受野为F(i,j),显然i>=j.假定输入层为第0层。
则现在问题转化为求F(i,0)的问题。由上面分析可知F(i,i)=1,现只需要求出F(i,j) 与F(i,j-1)层的关系,即可通过F(i,i)求出F(i,0).
通过简单情况和画图分析,可得出递归关系式,F(i,j-1) = kernel_size_j + (F(i,j)-1)*stride_j,kernel_size_j表示的第j层的kernel_size,stride_j表示第j层的stride.这个式子分为两部分,一部分是指kernel_size_j,即局部感受野,另一部分是stride,可理解为当前层在每多一个原子,上一层的感受野多增加stride个(在第一个局部感受野的基础上增加的)(只考虑一个方向的大小)。
则由递归关系和F(i,i) =1,可求出F(i,0).注意F(i,0)和F(i-1,0)并没有任何关系。
现贴上博客中写的代码,挺好理解的,赞博主~
net_struct = {'alexnet': {'net':[[11,4,0],[3,2,0],[5,1,2],[3,2,0],[3,1,1],[3,1,1],[3,1,1],[3,2,0]], 'name':['conv1','pool1','conv2','pool2','conv3','conv4','conv5','pool5']}, 'vgg16': {'net':[[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1], [2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0]], 'name':['conv1_1','conv1_2','pool1','conv2_1','conv2_2','pool2','conv3_1','conv3_2', 'conv3_3', 'pool3','conv4_1','conv4_2','conv4_3','pool4','conv5_1','conv5_2','conv5_3','pool5']}, 'zf-5':{'net': [[7,2,3],[3,2,1],[5,2,2],[3,2,1],[3,1,1],[3,1,1],[3,1,1]], 'name': ['conv1','pool1','conv2','pool2','conv3','conv4','conv5']}}imsize = 224def outFromIn(isz, net, layernum): totstride = 1 insize = isz for layer in range(layernum): fsize, stride, pad = net[layer] outsize = (insize - fsize + 2*pad) / stride + 1 insize = outsize totstride = totstride * stride return outsize, totstridedef inFromOut(net, layernum): RF = 1 for layer in reversed(range(layernum)): fsize, stride, pad = net[layer] RF = ((RF -1)* stride) + fsize return RFif __name__ == '__main__': print ("layer output sizes given image = %dx%d" % (imsize, imsize))for net in net_struct.keys(): print ('************net structrue name is %s**************'% net) for i in range(len(net_struct[net]['net'])): p = outFromIn(imsize,net_struct[net]['net'], i+1) rf = inFromOut(net_struct[net]['net'], i+1) print ("Layer Name = %s, Output size = %3d, Stride = % 3d, RF size = %3d" % (net_struct[net]['name'][i], p[0], p[1], rf))
- 深度学习中的感受野计算
- 【深度学习】感受野的计算
- 深度学习——感受野
- CNN 感受野计算
- 感受野计算
- 学习中的一点点感受
- 教机器去感受:表情符号&深度学习
- 【深度学习-CNN】CNN中的参数与计算量
- 深度学习中的卷积计算及caffe的实现
- CNN 感受野大小计算
- FIFO设计中的深度计算
- FIFO设计中的深度计算
- 认知计算与深度学习
- 认知计算与深度学习
- 深度学习: softmax loss 计算
- CNN中感受野的计算
- CNN中感受野的计算
- CNN中感受野的计算
- 编译支持https的curl
- 记一个oracle官网下的数据类型页访问地址
- Eigen库求取最大特征值和特征向量
- hadoop集成到myeclipse中报错/MapReducePreferencePage : Unsupported major.minor version 51.0解决方案
- Python3实例:使用cx_Freeze打包成exe文件
- 深度学习中的感受野计算
- 设置textview可以复制黏贴
- Python中位置参数、默认参数、可变参数、命名关键字参数、关键字参数的区别
- linux v4l2 摄像头采集视频的方法
- 可变参数的格式化输出函数
- 深度学习小白——TensorFlow(一)简介
- session的removeAttribute()和invalidate()的区别
- Android之collection(集合)
- 对Java静态代码块的理解