迁移学习的应用场景以及finetune的使用方法

这里简单介绍下什么是迁移学习,就是基于前已经学习到的知识应用到当前具体的任务需求上,而他们两者的领域并不是相同的,严谨说是不是直接相关的,比如任务是不同类型(如之前的分类猫和狗,而当前的可能是分类狮子和大象),或者数据集是不同类型的(如先前的数据是拍摄的自然真实动物的图像数据,而当前的数据是卡通,漫画的图像数据)。典型的可分为两大类情形:1是different domain, similiar task, 2是different task,similiar domain.经常的情况就是把一个先前训练好的模型(一般情况下,这个模型多数基于一个大规模数据集训练得到的),用到当前的任务需求上。 

 

    而实现迁移学习最主要的方法则是finetune, 需要说明一点的是,很多人会把迁移学习和finetune混淆,其实两者是有区别的,finetune只是实现迁移学习的一种方法而已, 而finetune本身既可以用于迁移学习,也可以用于自身原有的训练学习,比如在已经初步训练好的一个模型基础上,用同样的数据再来训练微调,这也是finetune.而且,在深度学习领域,因为模型都比较复杂,train from scratch 一般需要耗费很长的时间,少则1-2周,多则1-2个月也是有可能的,如果没有GPU,那就不知道哪个猴年马月才能训练好,所以多数都是用finetune来寻练的。

    那么finetune该怎么使用呢?这真得是一个很关键的问题。科研界的普遍现象,就是什么火,什么方法用的多,就都来搞,当然,这本身没什么问题。但不能停于表象或者随大流,主要是在自己本身是否真正深入了解。网上也有很多finetune的例子啥的,但这些例子多数都是比较简单的,相信很多人也都是在网上找资料,参考,代码之类的,这很正常。但是真正的finetune是要结合自己的具体任务场景的,别人的例子并不一定适合你,可以说很多时候都不是很适合。那么什么时候以及该怎样正确的使用finetune呢?一般可有如下几种情形:

 

1. 自己的数据集比较小,和原先的数据集比较类似。首先,两者是比较类似的,所以可做浅层次的finetune,即只改最后几层,一般是只训练最后的分类层(数据集太少如果训练很多层的话,容易过拟合),而前面层的权重啥的不做改动,直接用来生成CNN feature。同时,因为数据集比较小,最好训练线性分类器。

 

2. 自己的数据集比较大,和原先的数据集比价类似。由于数据集比较,所以可以训练整个网络,即finetune through the full network, 这样既不会过拟合也能取得不错的效果。那么什么是finetune through the full network呢?用原有的模型(pre-trained model)的参数来初始化,然后再结合当前的数据集继续训练。

 

3. 自己的数据集比较小,而且和原先的数据集很不相同。如前所述,小数据集最好训练线性分类器,而同时两者又不相同,那么就不能只训练最后几层了,可以选取从中间或者更早的某一层开始训练,也不建议特别往前,因为数据集比较小太往前开始训练容易过拟合。

 

4. 数据集比较大,而且和原先的数据集很不相同。这种情形我们可以train from sratch,就是完全从随机参数开始训练,不用迁移学习,不用以前别的模型的参数。其实,而且实际中,往往也会用迁移学习,用先前的模型的参数来初始化,然后再训练,即finetune through the full network。

    以上就是关于迁移学习的应用场景以及finetune的使用方法的一些简单介绍,接下来的一节会简单分析下不同的finetune程度以及相应的结果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值