深度学习炼丹师的养成之路之——How to subtract the mean value

来源:互联网 发布:wap彩票网站源码 编辑:程序博客网 时间:2024/06/05 10:11

今天这个文章题目的名字好啰嗦啊,其实主要是为了提醒自己要有“工匠精神”,在深度学习的修炼之路上学会有耐心,慢工出细活。如果到头来只会盲目地堆网络和试参数,这就背离了修炼的正轨了。好了,闲话不多说。

今天主要写的是一个关于在transfer learning的时候,需要注意的问题。虽然是一个看似不起眼的细节,但是须知这些小小的细节有时候却能左右DL的learning过程,从而对最后的模型产生潜移默化的影响。

具体来说就是,比如我们一般喜欢把ImageNet上train好的模型拿过来,迁移到我们手头自己的数据上来。而网络的最前端,免不了有一个数据层,而且要对数据做一些preprocess或者transform。经常要做的一件事就是要demean(去均值)的处理,那么,从ImageNet上train好的模型,拿过来用的话,我们减的均值究竟是应该减ImageNet上的均值,还是我们手头自己数据的均值呢?

ImageNet的均值一般取为[104, 117, 123](四舍五入后的值,BGR的通道顺序了,适用于Caffe)

这确实是一个问题。。

我在网上找了一圈,发现PyTorch下面有一个讨论的帖子,讲得挺好的。我大概总结一下就是:

  • 一般来说,ImageNet数据足够有代表性了,自己手头的数据均值应该和ImageNet的差别不大(但私以为这个还是要看情况的,比如海面的高分遥感图像中,虽然也是RGB,但是计算出的均值差别可就大了)
  • 通常来说,如果你freeze了前面的一些layer,那么原则上就要继续用ImageNet的均值更好。比如说把ImageNet上训好的VGG拿过来做自己网络的frontend,而且freeze了conv1-conv5,那么最好还是接着用ImageNet的均值,让网络不受扰动地提取特征。但是!不得不提的是,我随后看了一些网络,包括DeepLab,SSD等,他们虽然并没有freeze任何的layer,而且都是train from scratch(只不过用pretrain的模型提供一个更好的initia weight),但都继续沿用了ImageNet的均值来做demean。我觉得可能论文的作者们都认为自己处理的VOC, COOC等数据集和ImageNet差别不大吧(也就是上一点的理由)
  • 其余的时候,如果没有充分的理由,我觉得都应该用自己的手上的数据去作为总体均值的估计。

That’s all~

原创粉丝点击