疑问:
1.pvanet中original model和test model有什么区别?
在pvanet的README.md
对于这两种模型有以下介绍:
test model :For testing-time efficiency, batch normalization (w/ its moving averaged mini-batch statistics) and scale (w/ its trained parameters) layers are merged into the corresponding convolutional layer.
original model : Original network structure.
通过阅读源码,我们发现test model对应网络架构test.pt和original model对应网络架构origianl.pt的区别在于test.pt中没有bn和scale/shift层。(当然在neg之后的scale/shift是必要的,作用:使得neg之后的通道数值和原始通道不同)
2.既然是这样,那么没有bn,scale/shift层的test model比起传统的VGG,resnet又好在哪呢?
其实说test model没有bn,scale/shift层。这本身就存在这误解。test model中有bn,scale/shift层,只不过我们可以通过运算将bn,scale/shift整合到conv层中。
解答见 speed improvement by merging batch normalization and scale的讨论中kyehyeon的解答。
为了之后阅读方便,这里我直接copy啦!
It's just a simple math.
Given the parameters for each layer as:
conv layer: conv_weight, conv_bias
bn layer: bn_mean, bn_variance, num_bn_samples
scale layer: scale_weight, scale_bias
Let us define a vector 'alpha' of scale factors for conv filters:
alpha = scale_weight / sqrt(bn_variance / num_bn_samples + eps)
If we set conv_bias and conv_weight as:
conv_bias = conv_bias * alpha + (scale_bias - (bn_mean / num_bn_samples) * alpha)
for i in range(len(alpha)):
conv_weight[i] = conv_weight[i] * alpha[i]
Then we can get the same result compared to that with the original network by setting bn and scale parameters as:
bn_mean[...] = 0
bn_variance[...] = 1
num_bn_samples = 1
scale_weight[...] = 1
scale_bias[...] = 0
thus we can simply remove bn and scale layers.
The code is not opened, but you can easily implement a script to do this.
一开始,看到这里,我还是没办法理解:即使bn,scale/shift可以转换到conv层,那么这和没有使用bn的方法又有什么区别。训练的时候,bn照样没有啊!因为test.pt中连bn,scale/shift层都没有。
诶。。。
通过和老师和师弟们的讨论终于清楚了,问题就出在训练 二字上。一开始,我的理解就出现了偏差。
一开始,我认为original model和test model是单独训练的两个模型。
其实不是。test model 是original model 由上述公式推导而来的,它并没有单独的训练过程。
由于有它们之间的推导公式,和original model。我们可以得到
bn_mean[...] = 0
bn_variance[...] = 1
num_bn_samples = 1
scale_weight[...] = 1
scale_bias[...] = 0
情况下,conv层的权值。由于bn,scale/shift层均值为0,方差为1,经过这两层不再改变网络输出,故而可以省略,也就可以等价地将模型转为test model。
虽然说二者网络架构不同,但因为权值之间具有等价关系,故对检测准确率不产生影响。而且由于它将bn,scale/shift都融入conv一步操作,根据这里*提到的,test model在检测过程具有更快的计算速度
(话说关于bn,scale融入conv,googlenet里好像有提到,不过之前没看过googlenet,不清楚。莫见怪)
3.为什么在fine-tuning过程中用的是test.pt网络架构?
fine-tuning按理说,属于训练过程。不采用bn,scale/shift操作势必会影响权值更新(bn的提出就是为了解决深层网络中权值衰减问题)。这也是,我之前的一大疑问点。
不过讨论之后,终于明朗。虽说fine-tuning是训练过程,不过由于在fine-tuning之前,已经有过训练(有bn),网络权值已经在最优权值附近。fine-tuning的作用不过是网络权值的微调。而且有些时候因为所有分类目标卷积层的前几层特征都类似,在fine-tuning时,会固定前几层卷积层网络参数。所以fine-tuning采用不加bn,scale/shift的test.pt网络架构,也就说的通啦。
Note:
(1)pvanet采用ILSVC2012数据做分类训练得到pvanet卷积层初始参数(pre-trained);
(2)之后,利用联合数据集COCO,VOC2007,VOC2012进行训练(网络:original.pt)
(3)最后用VOC2007和VOC2012进行fine-tuning(网络:test.pt)
——毕竟最后竞赛在VOC数据集上,这样fine-tuning当然更好。
数据集组成(trainval(train数据集+val数据集), test(test数据集))