您的位置:首页 > 理论基础 > 计算机网络

全卷积网络FCN几点认识

2017-09-04 10:38 211 查看
FCN全卷积网络,作为语义分割的鼻祖,研究了一下,但是,其中几个问题一直没有想明白,现汇总一下。

1、首个卷积层为什么pad=100 ?



我们从VGG16网络结构中探究原因。

VGG16的特点是,conv5之前的卷积层均使用卷积核 kernel_size=3,pad=1,因此,卷积前后不改变数据尺寸,改变featrueMap的尺寸只有pooling层。

现在我们只考虑pooling层,所有pooling层参数也一致: kernel_size: 2,stride: 2

pool1的输入图像尺寸h

pool1:h1=(h−2)/2+1=h/2

pool2:h2=(h1−2)/2+1=h/22

pool3:h3=(h2−2)/2+1=h/23

…………………………

…………………………

pool5:h5=(h4−2)/2+1=h/25

可以看出,图像尺寸缩小了32倍。之后为卷积化后的fc6。



fc6:h6=(h5−7)/1+1=(h−192)/25 …………………………………………………………….式(1)

后接着的层为 fc7和 score_fr_sem层,此两层均为 1*1卷积核,不会对featureMap大小产生影响。因此输入反卷积层的输入尺寸为 h6!!!!!

通过以上可以看出,如果不加pad 100,那么原始图像尺寸小于192则出现问题。当pad 100后,原始图像尺寸设为h′,则输入至pool1的尺寸为:

conv1:h=(h′−3+2∗100)/1+1=h′+198

带入式(1),最终可知输入反卷积的尺寸为:

fc6:h6=(h′+6)/25

2、反卷积层和Crop层如何产生和原图尺寸相同的输出?



stride=32,因为图像缩小了32倍,因此在featureMap上相邻像素在原图的间隔为32.

kernel_size=64,不明白是啥原因。只知道64可保证2*2个featureMap的值参与局部差值运算。

卷积后的输出尺寸计算方法:

W=(Wi−kernelSize+2∗pad)/stride+1

因此反卷积输出尺寸计算方法:

Wi=W∗stride−stride+kernelSize−2∗pad

因此根据以上公式,继续推倒:

upscore:h7=(h6−1)∗32+64=((h+6)/32−1)∗32+64=h+38

反卷积之后与原图的尺寸不一致,因此需要crop层参与剪切。

1、axis 从 0开始,

2、offset 偏移量

参数axis=2,表明我们只想裁剪后两个维度,亦即输出尺寸,offset=19,对应于C = A[: , : , 19: 19+h , 19: 19+h ],这正是从(h+38,w+38)upscore层中裁剪出中间的(h,h)的图像,这也就产生了和原图尺寸相同的最终输出!

3、Deconv层,学习率为0,如何理解?



我们知道,如果lr_mult=0,则在训练过程中,该层的参数不会参与学习,而默认初始化为constant初始化为,均为0,那么该层有啥作用呢?

通过查看solver.py文件可知,当网络模型加载之后,又调用了surgery.interp函数对反卷积层进行了参数初始化(线性差值)。



surgery.py只要调用 upsample_filt函数生成核函数的参数,如下,7*7卷积核生成数据如下:

[[ 0.0625  0.125   0.1875  0.25    0.1875  0.125   0.0625]
[ 0.125   0.25    0.375   0.5     0.375   0.25    0.125 ]
[ 0.1875  0.375   0.5625  0.75    0.5625  0.375   0.1875]
[ 0.25    0.5     0.75    1.      0.75    0.5     0.25  ]
[ 0.1875  0.375   0.5625  0.75    0.5625  0.375   0.1875]
[ 0.125   0.25    0.375   0.5     0.375   0.25    0.125 ]
[ 0.0625  0.125   0.1875  0.25    0.1875  0.125   0.0625]]


4 FCN为什么能进行分割任务呢?

直观上理解,最后全链接层的输出视为heatmap,它的每一个点代表类别概率,代表了某一感受野下的类别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: