基于 Keras 对深度学习模型进行微调的全面指南 Part 1

2018 年 8 月 11 日 AI研习社

本文为AI研习社编译的技术博客,原标题 A Comprehensive guide to Fine-tuning Deep Learning Models in Keras (Part I),作者为 Felix Yu 。

翻译 | 杨东旭      校对 | 孟凡      整理 | MY


在这篇文章中,我们将对实践中的微调做一个全面的概述,微调是深度学习中常用的方法。

我将借鉴自己的经验,列出微调背后的基本原理,所涉及的技术,及最后也是最重要的,在本文第二部分中将分步详尽阐述如何在 Keras 中对卷积神经网络模型进行微调。


  首先,为什么对模型进行微调?

当我们得到一个深度学习任务时,例如,一个涉及在图像数据集上训练卷积神经网络(Covnet)的任务,我们的第一直觉将是从头开始训练网络。然而,在实践中,像 Covnet 这样的深度神经网络具有大量的参数,通常在百万数量级。在一个小的数据集(小于参数数量)上训练一个 Covnet,会极大的影响网络的泛化能力,通常会导致过拟合。

因此,更常见的是微调一个在大数据集上已经训练好的模型,就像 ImageNet(120 万的标注图像),然后在我们的小数据集上继续训练(即运行反向传播)。假如我们的数据集与原始数据集(例如 ImageNet)在上下文中没有明显的不同,则预训练模型已经具有了处理我们自己的分类问题相应的学习特征。


  何时微调模型?

一般来说,如果我们的数据集在上下文中与预训练模型的训练数据集没有明显不同,我们应该进行微调。像 ImageNet 这样大而多样的数据集上的预训练网络,在网络前几层可以捕获到像曲线和边缘这类通用特征,这些特征对于大多数分类问题都是相关且有用的。

当然,如果我们的数据集代表一些非常具体的领域,例如医学图像或中文手写字符,并且找不到这个领域的预训练网络,那么我们应该考虑从头开始训练网络。

另一个问题是,如果我们的数据集很小,那么在小数据集上微调预先训练的网络可能会导致过拟合,特别是如果网络的最后几层是全连接层,就像 VGG 网络的情况。根据我的经验,如果我们有几千个原始样本,并实现了常见的数据增强策略(翻译,旋转,翻转等),微调通常会使我们得到更好的结果。

如果我们的数据集非常小,比如少于一千个样本,则更好的方法是在全连接的层之前将中间层的输出作为特征(瓶颈特征)并在网络的顶部训练线性分类器(例如 SVM)。SVM 特别擅长在小型数据集上绘制决策边界。


  微调技术

以下是一些实现微调通用的指导原则:

1. 常用的做法是截断预训练网络的最后一层(softmax 层),并将其替换为与我们自己的问题相关的新 softmax 层。例如,ImageNet 上经过预先训练的网络带有 1000 个类别的 softmax 层。

如果我们的任务是 10 个类别的分类,则网络的新 softmax 层将是 10 个类别而不是 1000 个类别。然后,我们在网络上运行反向传播来微调预训练的权重。确保执行交叉验证,以便网络具有很好的泛化能力。

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

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


  在哪里找到预训练网络?

这要取决于深度学习框架。对于像 Caffe,Keras,TensorFlow,Torch,MxNet 等流行的框架,他们各自的贡献者通常会保留已实现的最先进 Covnet 模型(VGG,Inception,ResNet 等)的列表和在 ImageNet 或 CIFAR 等常见数据集上的预训练权重。

找到这些预训练模型的最好方法是用 google 搜索特定的模型和框架。但是,为了方便您的搜索过程,我将在流行框架上的常用预训练 Covnet 模型放在一个列表中。

  • Caffe

    Model Zoo -为第三方贡献者分享预训练 caffe 模型的平台

  • Keras

    Keras Application - 实现最先进的 Convnet 模型,如 VGG16 / 19,googleNetNet,Inception V3 和 ResNet

  • TensorFlow

    VGG16

    Inception V3

    ResNet

  • Torch

    LoadCaffe - 维护一个流行模型的列表,如 AlexNet 和 VGG。从 Caffe 移植的权重

  •  MxNet

    MxNet Model Gallery - 维护预训练的 Inception-BN(V2)和 Inception V3。


  在 Keras 中微调

在这篇文章的第二部分,我将详细介绍如何在 Keras 中对流行模型 VGG,Inception V3 和 ResNet 进行微调。

如果您有任何问题或想法,请随时在下面发表评论。

您也可以在 Twitter 上关注我 @flyyufelix。


原文链接:

https://flyyufelix.github.io/2016/10/03/fine-tuning-in-keras-part1.html


想要快速阅读相关内容?

请移步 AI 研习社

更多深度内容在向你招手

登录查看更多
0

相关内容

最新《多任务学习》综述,39页pdf
专知会员服务
259+阅读 · 2020年7月10日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
255+阅读 · 2020年6月10日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
126+阅读 · 2020年3月15日
零样本图像分类综述 : 十年进展
专知会员服务
122+阅读 · 2019年11月16日
深度学习自然语言处理综述,266篇参考文献
专知会员服务
225+阅读 · 2019年10月12日
PyTorch 官方推荐了一份 60 分钟的深度学习指南
技术最前线
19+阅读 · 2019年10月17日
基于知识蒸馏的BERT模型压缩
大数据文摘
18+阅读 · 2019年10月14日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
基于TensorFlow和Keras的图像识别
Python程序员
16+阅读 · 2019年6月24日
深度学习综述(下载PDF版)
机器学习算法与Python学习
27+阅读 · 2018年7月3日
基于Keras进行迁移学习
论智
12+阅读 · 2018年5月6日
在深度学习TensorFlow 框架上使用 LSTM 进行情感分析
北京思腾合力科技有限公司
4+阅读 · 2017年8月9日
Arxiv
13+阅读 · 2020年4月12日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Arxiv
18+阅读 · 2019年1月16日
Arxiv
53+阅读 · 2018年12月11日
Arxiv
21+阅读 · 2018年8月30日
A Survey on Deep Transfer Learning
Arxiv
11+阅读 · 2018年8月6日
The Matrix Calculus You Need For Deep Learning
Arxiv
11+阅读 · 2018年7月2日
Arxiv
4+阅读 · 2017年7月25日
VIP会员
相关资讯
PyTorch 官方推荐了一份 60 分钟的深度学习指南
技术最前线
19+阅读 · 2019年10月17日
基于知识蒸馏的BERT模型压缩
大数据文摘
18+阅读 · 2019年10月14日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
基于TensorFlow和Keras的图像识别
Python程序员
16+阅读 · 2019年6月24日
深度学习综述(下载PDF版)
机器学习算法与Python学习
27+阅读 · 2018年7月3日
基于Keras进行迁移学习
论智
12+阅读 · 2018年5月6日
在深度学习TensorFlow 框架上使用 LSTM 进行情感分析
北京思腾合力科技有限公司
4+阅读 · 2017年8月9日
相关论文
Arxiv
13+阅读 · 2020年4月12日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Arxiv
18+阅读 · 2019年1月16日
Arxiv
53+阅读 · 2018年12月11日
Arxiv
21+阅读 · 2018年8月30日
A Survey on Deep Transfer Learning
Arxiv
11+阅读 · 2018年8月6日
The Matrix Calculus You Need For Deep Learning
Arxiv
11+阅读 · 2018年7月2日
Arxiv
4+阅读 · 2017年7月25日
Top
微信扫码咨询专知VIP会员