【tensorflow2.0】预训练网络

预训练网络是一个保存好的之前已经在大型数据集(大规模图像分类任务)上训练好的卷积神经网络。
预训练网络可以在一个小型数据集里进行训练,对特征进行提取分类,也可以叫做迁移学习

keras中内置了一些训练网络:
VGG16、VGG19、ResNet50、Inception v3、Xception等经典的模型架构


ImageNet是一个手动标注好类别的图片数据库,目前已经有22000个类别。
ImageNet视觉识别比赛,也被称为ILSVRC。这个图片分类比赛是训练一个模型,能够将输入图片正确分类到1000个类别中的某个类别,其中训练集120万,验证集5万,测试集10万。


VGG模型于2014年被提出,在“极深的大规模图像识别卷积网络”(Very Deep Convolutional Networks for Large Scale Image Recognition )这篇论文中有介绍。

VGG模型(VGG16和VGG19)结构简单有效,前几层仅使用3×3卷积核来增加网络深度,然后通过max pooling(最大池化)依次减少每层的神经元数量,最后三层分别是2个有4096个神经元的全连接层和一个softmax层

VGG16(GG- Very- Deep-16 CNN)模型:
VGG在加深网络层数的同时为了避免参数过多,在所有层都采用3×3的小卷积核,卷积层步长被设置为1。VGG的输入被设置为 224×224大小的RGB图像,在训练集图像上对所有图像计算RGB均值(将其变为channel=1的图像),然后把图像作为输入传入VGG卷积网络,使用3×3或1×1的filter,卷积步长被固定为1。

其中,VGG16表示有16层,分别为:
输入→【conv3(卷积核为3×3),输出64个单元】→【conv3,输出64个单元】→maxpool→【conv3,输出128个filter】→【conv3,输出128个单元】→maxpool→【conv3,256】→【conv3,256】→【conv1,256】→maxpool→【conv3,512】→【conv3,512】→【conv1,512】→maxpool→【conv3,512】→【conv3,512】→【conv1,512】→maxpool→【FC-4096】→【FC-4096】→【FC-1000】→softmax→输出

VGG19表示有19层,分别为:
输入→【conv3(卷积核为3×3),输出64个单元】→【conv3,输出64个单元】→maxpool→【conv3,输出128个filter】→【conv3,输出128个单元】→maxpool→【conv3,256】→【conv3,256】→【conv3,256】→【conv3,256】→maxpool→【conv3,512】→【conv3,512】→【conv3,512】→【conv3,512】→maxpool→【conv3,512】→【conv3,512】→【conv3,512】→【conv3,512】→maxpool→【FC-4096】→【FC-4096】→【FC-1000】→softmax→输出

VGG两个很大的缺点:

  1. 网络架构weight数量相当大,很消耗磁盘空间;
  2. 训练非常慢。因为其全连接节点的数量较多,再加上网络比较深,VGG16有533MB+,VGG19有574MB,这使得部署VGG比较耗时。

现如今,VGG已经有些过时,正在被逐步取代。


使用预训练网络的思路:
使用训练好的卷积基来提取特征,在这个特征基础上,训练新的分类器,也就是自己加新的dense层,来得到新的输出。

神经网络中的卷积层的目的是为了有效地提取图像的特征,最后的dense层是使用提取的所有特征映射到你的分类中。因此最后的dense层和实际的图像分类是密切相关。
总结来说,卷积部分是对图像的特征的高效提取,全连接层是综合所有的特征,映射到输出中,对应具体的映射。
因此在预训练网络中,它的全连接层就不需要了,只需要用它的卷积层对图像的特征进行提取就好了。


微调: 冻结模型库的底部的卷积层,共同训练新添加的分类器层和顶部部分卷积层

底部的卷积层比较通用化,而顶部的卷积层和所训练的任务更有关联。

我们可以通过微调基础模型中的高阶特征表示,使网络和特定任务更相关,从而使数据的正确率进一步提高。

PS:
只有分类器已经训练好了,才能微调卷积基的顶部卷积层。

否则,刚开始的训练误差很大,微调之前这些卷积层学到的表示会被破坏掉。

微调的步骤:
1.在预训练卷积基上添加自定义层
2.冻结卷积基所有层
3.训练添加的分类层
4.解冻卷积基的一部分层
5.联合训练解冻的卷积层和添加的自定义层


在ImageNet上预训练过的用于图像分类的模型:
VGG16、VGG19、ResNet50、InceptionV3、InceptionResNetV2、Xception、MobileNet、MobileNetV2、DenseNet、NASNet

其中,VGG16和VGG19略微有点老,ResNet50是使用残差网络来设计的网络模型,Xception使用可分离卷积构建模型,MobileNet和MobileNetV2都是谷歌设计的模型。

举个例子:

tf.keras.applications.xception.Xception(
	include_top=True,#是否包含顶层的全连接层
	weights='imagenet',#是否随机初始化预训练的权值
	input_tensor=None,
	input_shape=None,#仅当include_top=False时有效,输入尺寸元组,为可选参数
	pooling=None,#可选,是否包含最后,avg为全局平均的池化,max为最大池化
	classes=1000)

在ImageNet上预训练的Xception V1模型,在ImageNet上,该模型取得了验证集top1 0.790和top5 0.945的准确率。
该模型只支持channels_last的维度顺序(高度、宽度、通道),模型默认的输入尺寸是299×299。

对于其他训练网络参数设置,可以查看:
https://keras.io/zh/applications/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值