经过之前深度学习的实践,无论是自己搭建的CNN网络也好,还是通过迁移学习调用官方的网络模型也好,都有其优点以及不足。本次实验通过对各种常用的CNN网络模型进行调用,了解一下它们的特点,对比一下在对于同一数据集进行分类时的准确率。
本次所调用的CNN模型有:VGG16 VGG19 ResNet Densenet模型

1.导入库

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os,PIL,pathlib
from tensorflow import keras
from tensorflow.keras import layers,models,Sequential,Input

2.加载数据

操作与之前的相似,将数据按照8:2的比例划分为训练集和测试集

data_dir = "E:/tmp/.keras/datasets/Pokemon_photos"
data_dir = pathlib.Path(data_dir)img_count = len(list(data_dir.glob('*/*.png')))#总共219张照片
# print(img_count)height = 224
width = 224
epochs = 20
batch_size = 8
train_data_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,rotation_range=45,shear_range=0.2,zoom_range=0.2,validation_split=0.2,horizontal_flip=True
)
train_ds = train_data_gen.flow_from_directory(directory=data_dir,target_size=(height,width),batch_size=batch_size,shuffle=True,class_mode='categorical',subset='training'
)
test_ds = train_data_gen.flow_from_directory(directory=data_dir,target_size=(height,width),batch_size=batch_size,shuffle=True,class_mode='categorical',subset='validation'
)

3.自己搭建CNN网络

三层卷积池化层+Flatten+三层全连接层

#CNN
model = tf.keras.Sequential([tf.keras.layers.Conv2D(16,3,padding="same",activation="relu",input_shape=(height,width,3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(32,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding="same",activation="relu"),tf.keras.layers.AveragePooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(1024,activation="relu"),tf.keras.layers.Dense(512,activation="relu"),tf.keras.layers.Dense(10,activation="softmax")
])


最终的模型准确率在80%左右,通过实验结果可以发现,增加epochs的个数,最终的模型准确率并没有得到提高,而是在震荡,而模型准确率最高的时候在epochs为20的时候。

4.官方模型

VGG16模型
VGG16和VGG19是VGG系列模型中最经典的两个模型,后者具有更深的层次。VGG系列的模型有以下特点:
①小卷积核:相比AlexNet,将卷积核全部替换为3x3,极少用了1x1。而3x3是最小的能够捕获像素八邻域信息的尺寸。
②小池化层:相比AlexNet,3x3的池化核全部换为2x2的池化核。
③层数更深:VGG16为例,3 → 64 → 126 → 256 → 512,卷积核专注于扩大通道数,3个通道的特征经过经过卷积层的提取扩散到了512个通道。
④层数更深:VGG16为例,3 → 64 → 126 → 256 → 512 ,卷积核专注于扩大通道数,3个通道的特征经过经过卷积层的提取扩散到了512个通道。
⑤全连接转1 × 1卷积:测试阶段可以接收任意宽或高为的输入。
这是相比于VGG模型之前的模型所做出的改变,那么为何要做这样的改变呢?

3x3卷积核
两个3x3的堆叠卷基层的有限感受野是5x5;三个3x3的堆叠卷基层的感受野是7x7,故可以通过小尺寸卷积层的堆叠替代大尺寸卷积层,并且感受野大小不变。多个小卷积可以提取出更大更深的卷积特征,并且减少模型参数数量。

2x2池化核
AlexNet的最大池化核为 3 × 3,步幅为2。VGGNet最大池化核为 2 × 2,步幅为2 22。小池化核带来的是更细节的信息捕获

1x1卷积核
测试阶段可以接收任意宽或高为的输入,消除输入的限制

调用官方VGG16模型,其中常用的几个参数解释如下:

VGG模型中包含的所有参数,在别的官方模型中,参数与之类似。
tf.keras.applications.vgg16.VGG16(include_top=True, weights='imagenet', input_tensor=None,input_shape=None, pooling=None, classes=1000,classifier_activation='softmax'
)include_top:是否包括网络顶部的 3 个全连接层。
weights:默认不加载权重文件,"imagenet"加载官方权重文件,或者输入自己的权重文件路径。
classes:分类图像的类别数。
conv_base = tf.keras.applications.VGG16(weights = 'imagenet',include_top = False)
conv_base.trainable =False#不可训练
#模型搭建
model = tf.keras.Sequential()
model.add(conv_base)
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(1024,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))

优化器的配置与前几篇博客的设置相同,在此不再赘述。

相比较自己搭建的CNN网络,VGG16模型准确率没有那么频繁的振动,最终模型准确率在80%。不过这是epochs=20的条件下,在epochs同样的条件下,训练效果应该更好。

调用官方VGG19模型

conv_base = tf.keras.applications.VGG19(weights = 'imagenet',include_top = False)
conv_base.trainable =False#不可训练
#模型搭建
model = tf.keras.Sequential()
model.add(conv_base)
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(1024,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))


相比较起VGG16模型,VGG19模型充分体现了加深网络深度对于模型准确率的好处。模型准确率在80%以上,最高达到了90%。
当把epochs设置为40时,结果如下所示:

准确率最高为94.87%,效果不错。

ResNet50模型

在深层网络能够收敛的前提下,随着网络深度的增加,正确率开始饱和甚至下降,称之为网络的退化(degradation)问题。在一定程度上,加深网络模型可以增加模型的准确率,但是网络深度过深,准确率就会下降,这些退化并不是过拟合造成的。在极端条件下,如果增加的所有层都是前一层的直接复制(即 y=x),这种情况下深层网络的训练误差应该和浅层网络相等。因此,网络退化的根本原因还是优化问题。 为了解决优化的难题,提出了残差网络。残差网络可以理解为在前向网络中增加了一些快捷连接(shortcut connections)。这些连接会跳过某些层,将原始数据直接传到之后的层。新增的快捷连接不会增加模型的参数和复杂度。整个模型还是可以使用端到端的方法来训练(比如SGD),在实现上并不难。

conv_base = tf.keras.applications.ResNet50(weights = 'imagenet',include_top = False)
conv_base.trainable =False
#模型搭建
model = tf.keras.Sequential()
model.add(conv_base)
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(1024,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))


这结果就很迷,训练集的准确率已经高达100%,但是测试集的准确率几乎为0。应该不是网络本身的问题,有些参数的设置博主并不是很理解,希望路过的大佬可以指点一二。在之前的一篇博客鸟类识别中,这样的情况也出现了,当时以为是过拟合,但现在看来并不是过拟合。

Densenet模型

这个模型是最近几年提出的网络模型,平常用的并不多,但是它的优点突出。
1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递。
3、更有效地利用了feature。
4、一定程度上较少了参数数量。

Densenet模型在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来!在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有L(L+1)/2个连接。简单讲,就是每一层的输入来自前面所有层的输出。如下图所示:

conv_base = tf.keras.applications.densenet.DenseNet121(weights = 'imagenet',include_top = False)
conv_base.trainable =False
#模型搭建
model = tf.keras.Sequential()
model.add(conv_base)
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(1024,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))


该网络在训练集的准确率上已经达到了98%,但是在测试集的准确率在70%-80%之间,并没有VGG模型的准确率高。

总结:
本文只是对同一数据集利用不同的网络模型进行准确率的比较,并没有说某一网络模型一定好。任何一种网络模型都有其突出的优点以及各自的不足。在对于神奇宝贝的识别中,VGG19网络的准确率是最高的,并且没有出现振动或者过拟合的现象。

深度学习之迁移学习实现神奇宝贝识别相关推荐

  1. 婴儿哭声分类识别实现(准确率99.3%)(深度学习、迁移学习、音频分类、tensorflow)

    一.项目概述 本文是婴儿哭声分类识别系统化的主体部分,主要解决智能音频分类的问题.基于此目标,本文查找了大量资料,并做了大量实验,最后获得了一个婴儿哭声分类识别准确率相对较高的深度学习模型--迁移学习 ...

  2. 八千字长文深度解读,迁移学习在强化学习中的应用及最新进展

    点击我爱计算机视觉标星,更快获取CVML新技术 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载. 机器之心原创 作者:Luo Sainan 编辑:H4O 迁移学习通 ...

  3. AI小白必读:深度学习、迁移学习、强化学习别再傻傻分不清

    摘要:诸多关于人工智能的流行词汇萦绕在我们耳边,比如深度学习 (Deep Learning).强化学习 (Reinforcement Learning).迁移学习 (Transfer Learning ...

  4. 基于深度学习下的稳定学习究竟是什么?因果学习?迁移学习?之一

    机器学习 | 稳定学习 | DGBR 深度学习 | 迁移学习 | 因果学习 众所周知,深度学习研究是机器学习领域中一个重要研究方向,主要采用数据分析.数据挖掘.高性能计算等技术,其对服务器的要求极其严 ...

  5. 深度学习之迁移学习介绍与使用

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转载自:OpenCV学堂 迁移学习概述 在深度学习领域,通过预训练 ...

  6. 机器学习、监督学习、非监督学习、强化学习、深度学习、迁移学习

    机器学习.监督学习.非监督学习.强化学习.深度学习.迁移学习 机器学习(machine learning) 监督学习(supervised learning) 非监督学习(unsupervised l ...

  7. 联邦学习 OR 迁移学习?No,我们需要联邦迁移学习

    2020-11-18 13:40:43 机器之心分析师网络 作者:仵冀颖 编辑:H4O 在这篇文章中,作者通过 4 篇论文详细介绍了联邦学习中的联邦迁移学习问题,并探讨了向经典联邦学习中引入迁移学习的 ...

  8. 什么是迁移学习?迁移学习的场景与应用

    作者:机器之心 链接:https://www.zhihu.com/question/41979241/answer/208177153 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  9. 模型独立学习:多任务学习与迁移学习

    导读:机器学习的学习方式包括监督学习和无监督学习等.针对一个给定的任务,首先要准备一定规模的训练数据,这些训练数据需要和真实数据的分布一致,然后设定一个目标函数和优化方法,在训练数据上学习一个模型.此 ...

  10. 分类 迁移学习_迁移学习时间序列分类

    迁移学习时间序列分类 题目: Transfer learning for time series classification 作者: Hassan Ismail Fawaz, Germain For ...

最新文章

  1. background:#e5eecc;
  2. SAP smartforms之Zebra print control language
  3. 万能写入sql语句,并且防注入
  4. easyexcel 日期类型 convert_[Oracle 专题] SQL 日期、数字、字符串,运算、转换
  5. 算法 查找子节点_掌握着十大编程算法助你走上高手之路
  6. 4.3 深层网络中的前向传播
  7. php 0 n随机数,PHP n个不重复的随机数生成代码
  8. idea报错命令行过长
  9. Java基础:Collections
  10. lumisoft.net 邮件管理系列文章 - 如何判断附件为内嵌式还是附加式
  11. 如何ajax上传文件,如何实现Ajax文件上传功能
  12. vjc机器人灰度怎么编程_VJC1.5仿真版说明
  13. springmvc如何进行json格式转换及 json化日期格式
  14. JDK自带的native2ascii工具完全揭密
  15. 解决方案:Android开发基于rtmp视频直播
  16. synchronized原理
  17. crmeb多商户2.0正式版 新增DIY、PC端客服、同城配送平台等完整包下载更新包下载
  18. 禁用win10自带的微软输入法!
  19. 搜索技巧:最全面的检索知识讲座
  20. 使用canvas生成水印watermark,有详细注释,简单易懂

热门文章

  1. sql数据库实例(c#查询登录界面)
  2. python从csv读取数据到网页输入框_python中怎么把csv文件读取的数据显示在网页上...
  3. 虚拟机ubuntu安装ssh服务器,经过Xshell远程链接虚拟机VMVARE中的Ubuntu
  4. Unable to load script from assets ‘index.android.bundle‘.
  5. java并发中的延迟初始化
  6. WKViewManager iOS 弹窗架构
  7. centos6.6安装hadoop-2.5.0(四、hadoop HA安装)
  8. Phoenix报错(6)Inconsistent namespace mapping properites
  9. 一家公司干了8年的程序员的年终总结
  10. 乐游 游戏论坛开发第二阶段