VGG16迁移学习实现

摘要:
VGG16迁移学习的实现本文讨论了迁移学习,这是一种非常强大的深度学习技术,在不同领域有很多应用。其想法是使用VGG16网络,该网络在大型数据集(如ImageNet)上进行预训练。然后,将并置网络作为一个整体重新训练,同时保持VGG16的15个较低层参数不变。它可以节省大量的计算能力,并将工作的VGG16网络用于迁移学习。网络已完成ImageNet上的学习。这种学习可以应用于新的特定领域,通过微调完成分类任务。

VGG16迁移学习实现

本文讨论迁移学习,它是一个非常强大的深度学习技术,在不同领域有很多应用。动机很简单,可以打个比方来解释。假设想学习一种新的语言,比如西班牙语,那么从已经掌握的另一种语言(比如英语)学起,可能是有用的。

按照这种思路,计算机视觉研究人员通常使用预训练 CNN 来生成新任务的表示,其中数据集可能不够大,无法从头开始训练整个 CNN。另一个常见的策略是采用在 ImageNet 上预训练好的网络,然后通过微调整个网络来适应新任务。

这里提出的例子受启于 Francois Chollet 写的关于 Keras 的一个非常有名的博客(https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html)。

这个想法是使用在像 ImageNet 这样的大型数据集上预先训练的 VGG16 网络。注意,训练的计算量可能相当大,因此使用已经预训练的网络是有意义的:

VGG16迁移学习实现第1张

 图 1.  一个 VGG16 网络

如何使用 VGG16 呢?Keras 使其变得容易,因为有一个标准的 VGG16 模型可以作为一个库来使用,预先计算好的权重会自动下载。注意,这里省略了最后一层,并将其替换为自定义层,该层将在预定义的 VGG16 的顶部进行微调。

例如,下面将学习如何分类 Kaggle 提供的狗和猫的图片:

  1. 从 Kaggle(https://www.kaggle.com/c/dogs-vs-cats/data)下载狗和猫的数据,并创建一个包含两个子目录(train 和 validation)的数据目录,每个子目录有两个额外的子目录,分别是 dogs 和 cats。
  2. 导入稍后将用于计算的 Keras 模块,并保存一些有用的常量:

VGG16迁移学习实现第2张

  1. 加载 ImageNet 上预训练的 VGG16 网络,省略最后一层,因为这里将在预建的 VGG16 网络的顶部添加自定义分类网络,并替换原来 VGG16 的分类层:

VGG16迁移学习实现第3张

 上述代码的输出如下:

VGG16迁移学习实现第4张

  1. 冻结预训练的 VGG16 网络的一定数量的较低层。在这里决定冻结最前面的 15 层:

VGG16迁移学习实现第5张

 为了分类,添加一组自定义的顶层:

VGG16迁移学习实现第6张

 自定义网络应该单独进行预训练,为了简单起见,这里省略了这部分,将此任务交给读者:

VGG16迁移学习实现第7张

 创建一个新的网络,这是预训练的 VGG16 网络和预训练的定制网络的组合体:

VGG16迁移学习实现第8张

 重新训练组合的新模型,仍然保持 VGG16 的 15 个最低层处于冻结状态。在这个特定的例子中,也使用 Image Augumentator 来增强训练集:

VGG16迁移学习实现第9张

 在组合网络上评估结果:

VGG16迁移学习实现第10张

解读分析

一个标准的 VGG16 网络已经在整个 ImageNet 上进行了预训练,并且使用了预先计算好的从网上下载的权值。这个网络和一个已经被单独训练的定制网络并置在一起。然后,并置的网络作为一个整体被重新训练,同时保持 VGG16 的 15 个低层的参数不变。

这个组合非常有效。它可以节省大量的计算能力,重新利用已经工作的 VGG16 网络进行迁移学习,该网络已经在 ImageNet 上完成了学习,可以将此学习应用到新的特定领域,通过微调去完成分类任务。

根据具体的分类任务,有几条经验法则需要考虑:

  • 如果新的数据集很小,并且与ImageNet数据集相似,那么可以冻结所有的VGG16网络,并仅重新训练定制网络。这样,也可以最小化组合网络过度拟合的风险。

可运行代码 base_model.layers:layer.trainable=False 冻结所有低层参数。

  • 如果新数据集很大,并且与ImageNet数据集相似,那么可以重新训练整个并置网络。仍然保持预先计算的权重作为训练起点,并通过几次迭代进行微调:

可运行代码 model.layers:layer.trainable=True 取消冻结所有低层的参数。

  • 如果新数据集与ImageNet数据集有很大的不同,实际上仍然可以使用预训练模型的权值进行初始化。在这种情况下,将有足够的数据和信心通过整个网络进行微调。更多信息请访问http://cs231n.github.io/transfer-learning/

 

免责声明:文章转载自《VGG16迁移学习实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Zabbix监控华为交换机使用DbUp完成数据库更新下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

tensorflow安装: win10 + RTX2060 + tensorflow1.15.0+ cuda10.0 + VScode

引言: 之前用的tensorflow 1.10版本,发现在训练CNN的时候会自动中止,最后定位到加入卷积层就会导致训练崩溃/中止,只用全连接层却能正常训练。重装一天后无果,干脆全部升级使用tensorflow1.15: 改用WIN10+python3.7+tensorflow1.15.0+CUDA10.0(+cudnn7.6.5)+VScode 顺便记录下...

多层神经网络及TensorFlow使用

一、文本的预处理---文本转数字列表 TensorFlow的Keras库有文本预处理功能。Tokenizer是一个用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类。如下面示例的: ['ha ha gua angry','howa ha gua excited naive'],按照每个词的位置重新编号为 [[1, 1, 2...

利用LSTM(长短期记忆网络)来处理脑电数据

目录 LSTM 原理介绍 LSTM的核心思想 一步一步理解LSTM 代码案例 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195 Rose小哥今天介绍一下用LSTM来处理脑电数据。 LSTM 原理介绍 LSTMs(Long Short Term Memory net...

使用Keras进行深度学习:(二)CNN讲解及实践

欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识! 现今最主流的处理图像数据的技术当属深度神经网络了,尤其是卷积神经网络CNN尤为出名。本文将通过讲解CNN的介绍以及使用keras搭建CNN常用模型LeNet-5实现对MNist数据集分类,从而使得读者更好的理解CNN。 1....

MINST手写数字识别(一)—— 全连接网络

这是一个简单快速入门教程——用Keras搭建神经网络实现手写数字识别,它大部分基于Keras的源代码示例 minst_mlp.py. 1、安装依赖库 首先,你需要安装最近版本的Python,再加上一些包Keras,numpy,matplotlib和jupyter.你可以安装这些报在全局,但是我建议安装它们在virtualenv虚拟环境, 这基本上封装了一个...

《python深度学习》笔记---3.1、神经网络剖析

《python深度学习》笔记---3.1、神经网络剖析 一、总结 一句话总结: |||-being 训练神经网络主要围绕以下四个方面,构建好架构,还是非常简单的 |||-end 层,多个层组合成网络(或模型)。 输入数据和相应的目标。 损失函数,即用于学习的反馈信号。 优化器,决定学习过程如何进行。 1、层:深度学习的基础组件 ? 输入张量转化为输出张量:...