一、关于各层data size的分析
layer1: floor((224-7)/2)+1=109
这里7是filter大小,2是stride
layer4: floor((109+0+1-3)/2)+1=54
这里0和1是前向和后向的pad,3是filter大小,2是stride
layer5:floor((54+1+1-5)/2)+1=26
floor((54+1-5)/2)+1=26
不知道上面那个是正确的,就是不知道layer5的pad的1是只一个方向(后)pad1,还是两个方向(前,后)都pad1
layer8: floor((26+0+1-3)/2)+1=13
layer11: floor(13+1+1-3)/1)+1=13
floor(13+1-3)/1)+1=12
从这里可以知道layer5的第一个公式是正确的,也就是前后两个方向都pad 1,如果是2维图像,则在上下左右都pad了1.
二、关于rf size的分析
这里的rf是指receptive field,各层接受野的计算思路如下:
按照这个思路就很容易理解这段代码:(上图蓝色圆珠笔有误,应该是layer1,4,5;我写成了layer1,2,3)
info.receptiveFieldSize(1:2,l) = 1 + ...
sum(cumprod([[1;1], info.stride(1:2,1:l-1)],2) .* ...
(info.support(1:2,1:l)-1),2) ;%只要画图就可以计算出来
三、关于rf offset的分析
首先layer1 如果以中心对齐,可以看到原先的像素4对应了layer1的△1,所以layer1的offset就是4
layer4: layer4是三个layer1对应一个layer4,所以layer1的△2对应了layer4的○1,而layer1的△2对应的实际上是原先输入像素的6,即offset是6
layer5: layer5是五个layer4对应一个layer5,所以layer4的○3对应了layer5的□1,而layer4的○3对应了layer1的△6,进一步的实际上是原先输入像素的14
但是这个值和上面display出来的结果是不一样的,实际上layer5有一个pad的操作,这个操作当然是对layer4去pad,如果去考虑这个pad,那么:
layer4的○2对应了layer5的□1,而layer4的○2对应了layer1的△4,进一步的实际上是原先输入像素的10,即offset是10
这样就和simplenn_display出来的结果一样了,有了这个思路,就很好去理解:
info.receptiveFieldOffset(1:2,l) = 1 + ...
sum(cumprod([[1;1], info.stride(1:2,1:l-1)],2) .* ...
((info.support(1:2,1:l)-1)/2 - info.pad([1 3],1:l)),2) ;