关于pvanet中original model和test model的理解

疑问:

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数据集))

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值