训练过程--fineturn微调

何时微调模型

  一般来说,如果我们的数据集在上下文中与预训练模型的训练数据集没有明显不同,我们应该进行微调。像 ImageNet 这样大而多样的数据集上的预训练网络,在网络前几层可以捕获到像曲线和边缘这类通用特征,这些特征对于大多数分类问题都是相关且有用的。
  当然,如果我们的数据集代表一些非常具体的领域,例如医学图像或中文手写字符,并且找不到这个领域的预训练网络,那么我们应该考虑从头开始训练网络。

  另一个问题是,如果我们的数据集很小,那么在小数据集上微调预先训练的网络可能会导致过拟合,特别是如果网络的最后几层是全连接层,就像 VGG 网络的情况。根据我的经验,如果我们有几千个原始样本,并实现了常见的数据增强策略(翻译,旋转,翻转等),微调通常会使我们得到更好的结果。
  如果我们的数据集非常小,比如少于一千个样本,则更好的方法是在全连接的层之前将中间层的输出作为特征(瓶颈特征)并在网络的顶部训练线性分类器(例如 SVM)。SVM 特别擅长在小型数据集上绘制决策边界。

fine-tune的选择经验

  在fine-tune时,究竟该选择哪种方式的Transfer Learning?需要考虑的因素有许多,其中最重要的两条是新数据库的规模和它与预训练数据库的相似程度,根据这两条因素的不同配置,存在四种场景:

  1)新数据库小,和预训练数据库相似。因为数据库比较小,fine-tune的话可能会产生过拟合,比较好的做法是用预训练的网络作为特征提取器,然后训练线性分类器用在新的任务上。

  2)新数据库比较大,和预训练数据库相似。这种情况下,不用担心过拟合,可以放心地微调整个网络。

  3)新数据库小,和预训练数据库不相似。这时,既不能微调,用预训练网络去掉最后一层作为特征提取器也不合适,可行的方案是用预训练网络的前面几层的激活值作为特征,然后训练线性分类器。

  4)新数据库大,和预训练数据库不相似。这时可以从头开始训练,也可以在预训练的基础上进行微调。

在这里插入图片描述

  综上:做freeze操作时,通常还会根据数据集在不同情况进行有选择的性的finetune。
  如small datasets时,可以freeze前面conv layer-> fc4086来提取cnn在imagenet上的多类泛化特征来辅助作为分类的feature,再对如这边revise的fc-20->softmax进行training。以此类推,如果是medium datasets则freeze到一半的conv。个人理解这样做的很大原因在于lower level layer具有更强泛化的basic feature,同时记得考量你的数据来选择。

fine-tune的注意事项

  有FC层的情况下,model的参数总量会根据input的尺寸变化
  提到w和b参数除了和网络结构有关以外,还(在有FC的情况下)会和网络的输入有关。
  以mnist例子来说,假如输入不是2828而是NN(这里N是比28大的一个整数),那么假设pool2的输出表示为nn(在网络结构不变的情况下,这里的n比4大),所以也就导致了ip1全连接层的w参数数量增多(ip1的w参数数量为nn50500),从而导致了model大小的变化。

微调通用的做法

  1)常用的做法是截断预训练网络的最后一层(softmax 层),并将其替换为与我们自己的问题相关的新 softmax 层。例如,ImageNet 上经过预先训练的网络带有 1000 个类别的 softmax 层。
  如果我们的任务是 10 个类别的分类,则网络的新 softmax 层将是 10 个类别而不是 1000 个类别。然后,我们在网络上运行反向传播来微调预训练的权重。确保执行交叉验证,以便网络具有很好的泛化能力。

  2)使用较小的学习率去训练网络。因为我们期望预先训练的权重相比随机初始化权重要好很多,所以不希望过快和过多地扭曲这些权重。通常的做法是使此刻的初始学习率比从头训练的初始学习率小 10 倍。

  3)还有一个常用的做法是冻结预训练网络的前几层的权重。这是因为前几层捕获了与我们的新问题相关的曲线和边缘等通用特征。我们希望保持这些权重的完整。相反,我们将在后面的层中专注于学习数据集中的特殊特征。

  4)对于有sigmoid的网络进行微调时,要注意:一般我们的微调方法是指将前面卷积的权重冻结,然后训练后面分类器的的权重。但在这里,一个是因为维度的减少,第二个是 sigmoid 做中间层的激活函数可能会造成梯度消失,神经网络的能力其实有了一定程度的衰减。因此做微调的时候,作者只是把 sigmoid 层的参数采用随机化,其余参数,包括分类器的大部分参数都保留下来,然后在训练期间,sigmoid 使用 1e-3 的学习率,其余层使用 1e-4 的学习率进行学习。

  5)ARNet的base net是否需要预训练吗?
  回答:作者做过实验,是需要预训练,然后再进行fine tune可以取得更好的结果。作者也进行过不预训练的实验,提升效果不明显。作者觉得可能是因为整个网络的参数比较多,如果直接端到端的话可能参数太多,训练难以收敛,并且search space太大,因此还是进行分阶段训练比较好。

猜你喜欢

转载自blog.csdn.net/wydbyxr/article/details/84820380