【深度学习】嘿马深度学习笔记第11篇:卷积神经网络,学习目标【附代码文档】

本教程的知识点为:深度学习介绍 1.1 深度学习与机器学习的区别 TensorFlow介绍 2.4 张量 2.4.1 张量(Tensor) 2.4.1.1 张量的类型 TensorFlow介绍 1.2 神经网络基础 1.2.1 Logistic回归 1.2.1.1 Logistic回归 TensorFlow介绍 总结 每日作业 神经网络与tf.keras 1.3 神经网络基础 神经网络与tf.keras 1.3 Tensorflow实现神经网络 1.3.1 TensorFlow keras介绍 1.3.2 案例:实现多层神经网络进行时装分类 神经网络与tf.keras 1.4 深层神经网络 为什么使用深层网络 1.4.1 深层神经网络表示 卷积神经网络 3.1 卷积神经网络(CNN)原理 为什么需要卷积神经网络 原因之一:图像特征数量对神经网络效果压力 卷积神经网络 3.1 卷积神经网络(CNN)原理 为什么需要卷积神经网络 原因之一:图像特征数量对神经网络效果压力 卷积神经网络 2.2案例:CIFAR100类别分类 2.2.1 CIFAR100数据集介绍 2.2.2 API 使用 卷积神经网络 2.4 BN与神经网络调优 2.4.1 神经网络调优 2.4.1.1 调参技巧 卷积神经网络 2.4 经典分类网络结构 2.4.1 LeNet-5解析 2.4.1.1 网络结构 卷积神经网络 2.5 CNN网络实战技巧 2.5.1 迁移学习(Transfer Learning) 2.5.1.1 介绍 卷积神经网络 总结 每日作业 商品物体检测项目介绍 1.1 项目演示 商品物体检测项目介绍 3.4 Fast R-CNN 3.4.1 Fast R-CNN 3.4.1.1 RoI pooling YOLO与SSD 4.3 案例:SSD进行物体检测 4.3.1 案例效果 4.3.2 案例需求 商品检测数据集训练 5.2 标注数据读取与存储 5.2.1 案例:xml读取本地文件存储到pkl 5.2.1.1 解析结构

完整笔记资料代码:https://gitee.com/yinuo112/AI/tree/master/深度学习/嘿马深度学习笔记/note.md

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

卷积神经网络

2.4 经典分类网络结构

学习目标

  • 目标

  • 知道LeNet-5网络结构

  • 了解经典的分类网络结构

  • 知道一些常见的卷机网络结构的优化

    • 知道NIN中1x1卷积原理以及作用
    • 知道Inception的作用
  • 了解卷积神经网络学习过程内容

  • 应用

下面我们主要以一些常见的网络结构去解析,并介绍大部分的网络的特点。这里看一下卷积的发展历史图。

2.4.1 LeNet-5解析

首先我们从一个稍微早一些的卷积网络结构LeNet-5(这里稍微改了下名字),开始的目的是用来识别数字的。从前往后介绍完整的结构组成,并计算相关输入和输出。

2.4.1.1 网络结构
  • 激活层默认不画网络图当中,这个网络结构当时使用的是sigmoid和Tanh函数,还没有出现Relu函数
  • 将卷积、激活、池化视作一层,即使池化没有参数
2.4.1.2 参数形状总结
shape size parameters
Input (32,32,3) 3072 0
Conv1(f=5,s=1) (28,28,6) 4704 450+6
Pool1 (14,14,6) 1176 0
Conv2(f=5,s=1) (10,10,16) 1600 2400+16
Pool2 (5,5,16) 400 0
FC3 (120,1) 120 48000+120
FC4 (84,1) 84 10080+84
Ouput:softmax (10,1) 10 840+10
  • 中间的特征大小变化不宜过快

事实上,在过去很多年,许多机构或者学者都发布了各种各样的网络,其实去了解设计网络最好的办法就是去研究现有的网络结构或者论文。大多数网络设计出来是为了Image Net的比赛(解决ImageNet中的1000类图像分类或定位问题),后来大家在各个业务上进行使用。

2.4.2 AlexNet

2012年,Alex Krizhevsky、Ilya Sutskever在多伦多大学Geoff Hinton的实验室设计出了一个深层的卷积神经网络AlexNet,夺得了2012年ImageNet LSVRC的冠军,且准确率远超第二名(top5错误率为15.3%,第二名为26.2%),引起了很大的轰动。AlexNet可以说是具有历史意义的一个网络结构。

  • 总参数量:60M=6000万,5层卷积+3层全连接
  • 使用了非线性激活函数:ReLU
  • 防止过拟合的方法:Dropout
  • 批标准化层的使用

2.4.3 卷积网络结构的优化

2.4.3.1 常见结构特点

整个过程:AlexNet---NIN---(VGG---GoogLeNet)---ResNet

  • NIN:引入1 * 1卷积

  • VGG,斩获2014年分类第二(第一是GoogLeNet),定位任务第一。

  • 参数量巨大,140M = 1.4亿

  • 19layers

  • VGG 版本

    • VGG16
    • VGG19
  • GoogleNet,2014年比赛冠军的model,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构。(当然,它并没有证明浅的层次不能达到这样的效果)

  • 500万的参数量

  • 22layers

  • 引入了Inception模块

    • Inception V1
    • Inception V2
    • Inception V3
    • Inception V4
  • 下面我们将针对卷积网络架构常用的一些结构进行详细分析,来探究这些结构带来的好处

2.4.4 Inception 结构

首先我们要说一下在Network in Network中引入的1 x 1卷积结构的相关作用

2.4.4.1MLP卷积(1 x 1卷积)
  • 目的:提出了一种新的深度网络结构,称为"网络中的网络"(NIN),增强接受域内局部贴片的模型判别能力。

  • 做法

  • 对于传统线性卷积核:采用线性滤波器,然后采用非线性激活。

  • 提出MLP卷积取代传统线性卷积核

  • 作用或优点:

  • 1、多个1x1的卷积核级联加上配合激活函数,将feature map由多通道的线性组合变为非线性组合(信息整合),提高特征抽象能力(Multilayer Perceptron,缩写MLP,就是一个多层神经网络)

  • 2、1x1的卷积核操作还可以实现卷积核通道数的降维和升维,实现参数的减小化

2.4.4.2 1 x 1卷积介绍

从图中,看到1 x 1卷积的过程,那么这里先假设只有3个1x1Filter,那么最终结果还是56x56x3。但是每一个FIlter的三个参数的作用

  • 看作是对三个通道进行了线性组合。

我们甚至可以把这几个FIlter可以看成就是一个简单的神经元结构,每个神经元参数数量与前面的通道数量相等。

  • 通常在卷积之后会加入非线性激活函数,在这里之后加入激活函数,就可以理解成一个简单的MLP网络了。
2.4.4.3 通道数变化

那么对于1x1网络对通道数的变化,其实并不是最重要的特点,因为毕竟3 x 3,5 x 5都可以带来通道数的变化,

而1x1卷积的参数并不多,我们拿下面的例子来看。

  • 保持通道数不变
  • 提升通道数
  • 减少通道数
2.4.4.4 Inception层

这个结构其实还有名字叫盗梦空间结构。

  • 目的:

  • 代替人手工去确定到底使用1x1,3x3,5x5还是是否需要max_pooling层,由网络自动去寻找适合的结构。并且节省计算。

  • 特点

  • 是每一个卷积/池化最终结果的长、宽大小一致

  • 特殊的池化层,需要增加padding,步长为1来使得输出大小一致,并且选择32的通道数

  • 最终结果28 x 28 x 256

    • 使用更少的参数,达到跟AlexNet或者VGG同样类似的输出结果
2.4.4.5 Inception改进

改进目的:减少计算,如5 x 5卷积那的运算量

  • 上面的参数:5 x 5 x 32 x 192 =153600
  • 下面的参数:192 x 16 + 5 x 5 x 16 x 32 = 3072 + 12800 = 15872

所以上面的结构会需要大量的计算,我们把这种改进的结构称之为网络的"瓶颈",网络缩小后扩大。

那么这样改变会影响网络的性能和效果吗?

GoogleNet就是如此,获得了非常好的效果。所以合理的设计网络当中的Inception结构能够减少计算,实现更好的效果。

2.4.4.6 GoogleNet结构(了解)

其中包含了多个Inception结构。

完整结构:

2.3.5 卷积神经网络学习特征可视化

我们肯定会有疑问真个深度的卷积网络到底在学习什么?可以将网络学习过程中产生的特征图可视化出来,并且对比原图来看看每一层都干了什么。

  • 可视化案例使用的网络
  • 可视化结果
  • layer1,layer2学习到的特征基本是颜色、边缘等低层特征
  • layer3学习到的特征,一些纹理特征,如网格纹理
  • layer4学习到的特征会稍微复杂些,比如狗的头部形状
  • layer5学习到的是完整一些的,比如关键性的区分特征

2.4.6 案例:使用pre_trained模型进行VGG预测

Google 在提供VGG行预测的时候效果会更好一些,所以选择VGG来进行测试

2.4.6.1 VGG模型使用

在tensorflow.keras.applications中已经存在很多现有模型,

python 复制代码
from tensorflow._api.v1.keras.applications import densenet
from tensorflow._api.v1.keras.applications import inception_resnet_v2
from tensorflow._api.v1.keras.applications import inception_v3
from tensorflow._api.v1.keras.applications import mobilenet
from tensorflow._api.v1.keras.applications import mobilenet_v2
from tensorflow._api.v1.keras.applications import nasnet
from tensorflow._api.v1.keras.applications import resnet50
from tensorflow._api.v1.keras.applications import vgg16
from tensorflow._api.v1.keras.applications import vgg19
from tensorflow._api.v1.keras.applications import xception
from tensorflow.python.keras.applications import DenseNet121
from tensorflow.python.keras.applications import DenseNet169
from tensorflow.python.keras.applications import DenseNet201
from tensorflow.python.keras.applications import InceptionResNetV2
from tensorflow.python.keras.applications import InceptionV3
from tensorflow.python.keras.applications import MobileNet
from tensorflow.python.keras.applications import MobileNetV2
from tensorflow.python.keras.applications import NASNetLarge
from tensorflow.python.keras.applications import NASNetMobile
from tensorflow.python.keras.applications import ResNet50
from tensorflow.python.keras.applications import VGG16
from tensorflow.python.keras.applications import VGG19
from tensorflow.python.keras.applications import Xception

我们来使用其中一个VGG16的模型进行预测,这个模型源码文件中提供了相关的预处理图片的接口以及预测结果概率的处理API

python 复制代码
from tensorflow.python.keras.applications import VGG16
from tensorflow.python.keras.applications.vgg16 import decode_predictions
from tensorflow.python.keras.applications.vgg16 import preprocess_input
  • preprocess_input:处理输入图片
  • decode_predictions:对预测结果进行处理

2.4.6.2 步骤以及代码

  • 模型获取以及已训练好的参数加载

  • 注意:参数总计超过500M,因此当你首次使用下面的命令时,Keras需要从网上先下载这些参数,这可能需要耗用一些时间。

python 复制代码
model = VGG16()
print(model.summary())

模型打印为:

python 复制代码
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc1 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc2 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
predictions (Dense)          (None, 1000)              4097000   
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
  • 图片的输入以及格式转换

我们将会用到两个API,但是使用这个API需要PIL工具,3.7兆左右大小

python 复制代码
# 在虚拟环境中下载


pip install PIL
python 复制代码
from tensorflow.keras.preprocessing.image import load_img
from tensorflow.keras.preprocessing.image import img_to_array

进行本地图片的加载,

python 复制代码
# 加载一个图片到VGG指定输入大小


image = load_img('./tiger.png', target_size=(224, 224))



# 进行数据转换到numpy数组形式,以便于VGG能够进行使用


image = img_to_array(image)



# 形状修改


image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
  • 使用模型对数据进行处理和预测
python 复制代码
# 输入数据进行预测,进行图片的归一化处理


image = preprocess_input(image)
y_predict = model.predict(image)



# 进行结果解码


label = decode_predictions(y_predict)


# 进行lable获取


res = label[0][0]


# 预测的结果输出


print('预测的类别为:%s 概率为:(%.2f%%)' % (res[1], res[2]*100))

输出结果为

python 复制代码
Downloading data from 
 8192/35363 [=====>........................] - ETA: 0s
24576/35363 [===================>..........] - ETA: 0s
40960/35363 [==================================] - 0s 6us/step

预测的类别为:tiger 概率为:(80.30%)

2.4.7 总结

  • 掌握LeNet-5 结构计算
  • 了解卷积常见网络结构
  • 掌握1x1卷积结构作用
  • 掌握Inception结构作用
  • 掌握keras的VGG模型的使用
相关推荐
<但凡.1 分钟前
题海拾贝:力扣 138.随机链表的复制
数据结构·算法·leetcode
XianxinMao6 分钟前
2024大模型双向突破:MoE架构创新与小模型崛起
人工智能·架构
Francek Chen18 分钟前
【深度学习基础】多层感知机 | 模型选择、欠拟合和过拟合
人工智能·pytorch·深度学习·神经网络·多层感知机·过拟合
Channing Lewis28 分钟前
python生成随机字符串
服务器·开发语言·python
田梓燊33 分钟前
图论 八字码
c++·算法·图论
pchmi1 小时前
C# OpenCV机器视觉:红外体温检测
人工智能·数码相机·opencv·计算机视觉·c#·机器视觉·opencvsharp
资深设备全生命周期管理1 小时前
以Python 做服务器,N Robot 做客户端,小小UI,拿捏
服务器·python·ui
洪小帅1 小时前
Django 的 `Meta` 类和外键的使用
数据库·python·django·sqlite
认知作战壳吉桔1 小时前
中国认知作战研究中心:从认知战角度分析2007年iPhone发布
大数据·人工智能·新质生产力·认知战·认知战研究中心
夏沫mds1 小时前
web3py+flask+ganache的智能合约教育平台
python·flask·web3·智能合约