VGG19是VGG网络中一个更复杂的网络,相比较于VGG16,它的层数更深。
VGG19网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。但是它的训练时间过长,调参难度大,并且需要的存储容量大,不利于部署。
本次基于CNN和VGG19,对灵笼人物进行识别。其中VGG19网络分别调用了官方模型和自己搭建的模型。

1.导入库

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import os,PIL,pathlib
from tensorflow import keras
from tensorflow.keras import layers,models,Sequential,Input
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Dense,Flatten,Dropout
from tensorflow.keras.models import Model

2.数据加载

①添加文件路径

data_dir = "E:/tmp/.keras/datasets/linglong_photos"
data_dir = pathlib.Path(data_dir)

②构建一个ImageDataGenerator

#因为训练集和测试集是在一个文件夹中,所以构建一个ImageDataGenerator就可以
train_data_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,rotation_range=45,shear_range=0.2,validation_split=0.2,#以8: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,class_mode='categorical',subset='validation'
)

结果如下:

Found 225 images belonging to 6 classes.
Found 55 images belonging to 6 classes.

3.设置超参数

height = 224
width = 224
batch_size = 16
epochs = 10

4.搭建CNN网络

网络结构:3层卷积池化层+Flatten+全连接层

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.MaxPooling2D(),tf.keras.layers.Conv2D(128,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(1024,activation="relu"),tf.keras.layers.Dense(512,activation="relu"),tf.keras.layers.Dense(6,activation="softmax")
])

网络编译&&运行

model.compile(optimizer="adam",loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=["acc"])
history = model.fit(train_ds,validation_data=test_ds,epochs=epochs
)

实验结果如下:

不尽如人意,这个上下波动就很无语。将epochs调大后的结果如下:


在20次训练之后没有任何的效果。
修改优化器:

opt = tf.keras.optimizers.Adam(learning_rate=1e-5)
model.compile(optimizer=opt,loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=["acc"])


在改变优化器之后,效果得到了很大的改善,准确率也得到了提高。

4.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(6,activation='sigmoid'))opt = tf.keras.optimizers.Adam(learning_rate=1e-5)
model.compile(optimizer=opt,loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=["acc"])
history = model.fit(train_ds,validation_data=test_ds,epochs=epochs
)

实验结果如下所示(epochs=10):

相比于上面的网络,效果还算可以。没有出现大规模的波动,最后的准确率也比较高。
②自己搭建VGG19网络

参考自K同学啊

def VGG19(nb_classes,input_shape):input_ten = Input(shape=input_shape)#1blockx = Conv2D(64,(3,3),activation='relu',padding='same',name='block1_conv1')(input_ten)x = Conv2D(64,(3,3),activation='relu',padding='same',name='block1_conv2')(x)x = MaxPooling2D((2,2),strides=(2,2),name='block1_pool')(x)#2blockx = Conv2D(128,(3,3),activation='relu',padding='same',name='block2_conv1')(x)x = Conv2D(128,(3,3),activation='relu',padding='same',name='block2_conv2')(x)x = MaxPooling2D((2,2),strides=(2,2),name='block2_pool')(x)#3blockx = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv4')(x)x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)#4blockx = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv4')(x)x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)#5blockx = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv4')(x)x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)#Fullx = Flatten()(x)x = Dense(4096, activation='relu', name='fc1')(x)x = Dense(4096, activation='relu', name='fc2')(x)output_ten = Dense(nb_classes, activation='softmax', name='predictions')(x)model = Model(input_ten, output_ten)return model
model = VGG19(6,(width,height,3))

实验结果如下所示:

就特么离谱,都不知道为啥会有这么大的差别,希望路过的大佬批评指正。
总结
经过改变优化器以及增加epochs之后,自己搭建的CNN准确率是比较好的,但是出现了较大规模的波动。VGG19网络的训练速度确实比较慢,但是官方模型的准确率是比较好的,没有出现CNN模型的波动情况。由于硬件原因,博主在实验时的epochs设置的都比较小,可以尝试一下epochs增大时的效果如何。自己搭建的VGG19网络,最后的模型准确率也比较高,但是波动较大,而且很不稳定,具体原因不清楚。

深度学习之基于CNN和VGG19实现灵笼人物识别相关推荐

  1. 深度学习之基于CNN和VGG19实现猫狗大战

    猫狗大战在一开始接触深度学习的时候,实现过,也写过一篇博客.但是当时的理解并不是很深,在做过之前的实验之后,再次接触猫狗大战,就有一些别的体会了. 本次实验基于自己搭建的CNN与VGG19的官方模型, ...

  2. 深度学习之基于CNN实现汉字版手写数字识别(Chinese-Mnist)

    Mnist数据集是深度学习入门的数据集,昨天发现了Chinese-Mnist数据集,与Mnist数据集类似,只不过是汉字数字,例如'一'.'二'.'三'等,本次实验利用自己搭建的CNN网络实现Chin ...

  3. 【FPGA教程案例100】深度学习1——基于CNN卷积神经网络的手写数字识别纯Verilog实现,使用mnist手写数字数据库

    FPGA教程目录 MATLAB教程目录 ---------------------------------------- 目录 1.软件版本 2.CNN卷积神经网络的原理 2.1 mnist手写数字数 ...

  4. PyTorch 深度学习实战 | 基于生成式对抗网络生成动漫人物

    生成式对抗网络(Generative Adversarial Network, GAN)是近些年计算机视觉领域非常常见的一类方法,其强大的从已有数据集中生成新数据的能力令人惊叹,甚至连人眼都无法进行分 ...

  5. 深度学习之基于CNN实现天气识别

    其实和猫狗大战还有上一篇博客的代码差不太多,但是中间出现了新的问题. 1.导入库 import numpy as np import tensorflow as tf import os,PIL im ...

  6. 【深度学习】基于Torch的Python开源机器学习库PyTorch卷积神经网络

    [深度学习]基于Torch的Python开源机器学习库PyTorch卷积神经网络 文章目录 1 CNN概述 2 PyTorch实现步骤2.1 加载数据2.2 CNN模型2.3 训练2.4 可视化训练 ...

  7. 《深度学习入门——基于Python的理论与实现》笔记

    PS:写这篇博客主要是记录下自己认为重要的部分以及阅读中遇到的些问题,加深自己的印象. 附上电子书及源代码: 链接:https://pan.baidu.com/s/1f2VFcnXSSK-u3wuvg ...

  8. Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)

    Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类) 1.卷积神经网络 1.1卷积神经网络简介 1.2卷积运算 1.3 深度学习与小数据问题的相关性 2.下载数据 2.1下载原始数据 ...

  9. 深度学习实战—基于TensorFlow 2.0的人工智能开发应用

    作者:辛大奇 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2020-10-01 深度学习实战-基于TensorFlow 2.0的人工智能开发应用

最新文章

  1. SLAM++: SLAM at the Level of Objects
  2. 裸奔浏览器_大概是最好用的隐私浏览器 - Firefox Focus
  3. python好学嘛-马哥教育官网-专业Linux培训班,Python培训机构
  4. Task三个列子的分享
  5. luoguP1082同余方程
  6. vue 中watch函数名_VUE中watch用法
  7. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码
  8. 50个数据可视化最有价值的图表(附完整Python代码,建议收藏
  9. php的qq接口文档,分账接口
  10. linux简单邮件系统,怎样简单搭建一个Linux操作系统邮件服务器
  11. 最新的CocoaPods的使用教程(一)
  12. Nokia5230连接电脑无线上网
  13. shell 命令返回值判断
  14. 2017年2月14日实习日记 RHEL下dracut制作initramfs
  15. cadence/allegro文件不能双击直接打开解决办法
  16. 融创孙喆一:父辈的光环与阴影下,我反对扮演所谓的二代
  17. 一次进入 Cisco Router(SDM)小记
  18. 为什么程序员喜欢在半夜写代码?
  19. dimm和udimm_Adata推出32GB DDR4-2666 UDIMM和SO-DIMM
  20. 电子科技大学计算机学刘峰林,康昭 - 电子科技大学 - 计算机科学与工程学院

热门文章

  1. c#中tcp协议服务器同时接收客户端的数据
  2. C++中WSAAsyncSelect模型的用法例程
  3. 静态方法和实例化方法的本质区别
  4. linux 多个变量,linux-BASH-使用相同“变量”的多个实例读入...
  5. php xml 格式化,php简单处理XML数据的方法示例
  6. matlab gui 中指定axes窗口画进度条
  7. java 监听本地端口_JAVA本地监听与远程端口扫描
  8. java nio is例子,Java Buffer isDirect()用法及代码示例
  9. 利用QCommonStyle绘制自定义的窗体部件
  10. Android开发之自定义view进行旋转动画