【深度学习】嘿马深度学习笔记第8篇:卷积神经网络,2.2案例:CIFAR100类别分类【附代码文档】

🏆🏆🏆教程全知识点简介:1.深度学习概述包括深度学习与机器学习区别、深度学习应用场景、深度学习框架介绍、项目演示、开发环境搭建(pycharm安装)。2. TensorFlow基础涵盖TF数据流图、TensorFlow实现加法运算、图与TensorBoard(图结构、图相关操作、默认图、创建图、OP)、张量(张量概念、张量的阶、张量数学运算)、变量OP(创建变量)、增加其他功能(命名空间、模型保存与加载、命令行参数使用)、逻辑回归案例。3. 神经网络基础包括playground使用、多个神经元效果演示、深层神经网络。4. 神经网络与tf.keras。5. 梯度下降算法改进涵盖指数加权平均、动量梯度下降法、RMSProp算法、Adam算法、TensorFlow Adam算法API、学习率衰减、标准化输入、神经网络调优、批标准化。6. 卷积神经网络包括CNN原理、CIFAR类别分类(API使用、步骤分析代码实现缩减版LeNet)、卷积神经网络学习特征可视化。7. 经典分类网络结构涵盖LeNet解析、AlexNet、卷积网络结构优化、Inception结构、pre_trained模型VGG预测(VGG模型使用、步骤代码)。8. CNN网络实战技巧。9. 迁移学习案例包括基于VGG的五种图片类别识别迁移学习(数据集迁移需求、思路步骤、训练时读取本地图片类别、特征图平均值输出替代全连接层)。10. 目标检测包括目标检测任务描述、目标定位实现思路、商品物体检测项目介绍、R-CNN(Overfeat模型、SPPNet)、Faster R-CNN(RPN原理)、YOLO(单元格grid cell、非最大抑制NMS、训练)、SSD。11. 商品检测数据集训练涵盖标注数据读取存储(xml读取本地文件存储pkl、解析结构、one_hot编码函数)、训练(案例训练结果、多GPU训练代码修改)、本地预测测试(预测代码)、模型导出(keras模型TensorFlow导出)。12. 模型部署包括Web与模型服务对接逻辑、Docker部署环境、TF Serving与Web开启服务(安装Tensorflow Serving、commodity模型服务运行)、TensorFlow Client对接模型服务、Web Server开启。

📚📚👉👉👉 https://gitee.com/yinuo112/AI/blob/master/深度学习/嘿马深度学习笔记/note.md 🍅🍅
✨ 本教程项目亮点
🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考
🎯🎯🎯全教程总章节
🚀🚀🚀本篇主要内容
卷积神经网络
2.2案例:CIFAR100类别分类
学习目标
-
目标
-
掌握keras卷积网络相关API
-
掌握卷机网络的构建
-
应用
-
应用keras构建CNN神经网络进行CIFAR100类别分类
2.2.1 CIFAR100数据集介绍
这个数据集就像CIFAR-10,除了它有100个类,每个类包含600个图像。,每类各有500个训练图像和100个测试图像。CIFAR-100中的100个类被分成20个超类。每个图像都带有一个“精细”标签(它所属的类)和一个“粗糙”标签(它所属的超类) 以下是CIFAR-100中的类别列表:
等等...
2.2.2 API 使用
-
用于构建CNN模型的API
-
Conv2D:实现卷积,kernel_size,strides,padding,dataformat,'NHWC'和'NCHW'
- MaxPool2D:池化操作
keras.layers.Conv2D(32, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
2.2.3 步骤分析以及代码实现(缩减版LeNet5)
-
读取数据集:
-
从datasets中获取相应的数据集,直接有训练集和测试集
- 需要进行形状处理以及归一化
class CNNMnist(object):
def __init__(self):
(self.train, self.train_label), (self.test, self.test_label) = \
keras.datasets.cifar100.load_data()
self.train = self.train.reshape(-1, 32, 32, 3) / 255.0
self.test = self.test.reshape(-1, 32, 32, 3) / 255.0
-
进行模型编写
-
两层卷积层+两个神经网络层
-
网络设计:
-
第一层
-
卷积:32个filter、大小5*5、strides=1、padding="SAME"
- 激活:Relu
-
池化:大小2x2、strides2
-
第一层
[Plotly Python]
- 卷积:64个filter、大小5*5、strides=1、padding="SAME"
- 激活:Relu
-
池化:大小2x2、strides2
-
全连接层
经过每一层图片数据大小的变化需要确定,CIFAR100输入的每批次若干图片数据大小为[None, 32 * 32],如果要进过卷积计算,需要变成[None, 32, 32, 3]
-
第一层
-
卷积:[None, 32, 32, 3]———>[None, 32, 32, 32]
- 权重数量:[5, 5, 1 ,32]
- 偏置数量:[32]
-
激活:[None, 32, 32, 32]———>[None, 32, 32, 32]
-
池化:[None, 32, 32, 32]———>[None, 16, 16, 32]
-
第二层
-
卷积:[None, 16, 16, 32]———>[None, 16, 16, 64]
- 权重数量:[5, 5, 32 ,64]
- 偏置数量:[64]
-
激活:[None, 16, 16, 64]———>[None, 16, 16, 64]
-
池化:[None, 16, 16, 64]———>[None, 8, 8, 64]
-
全连接层
-
[None, 8, 8, 64]——>[None, 8 8 64]
- [None, 8 8 64] x [8 8 64, 1024] = [None, 1024]
- [None,1024] x [1024, 100]——>[None, 100]
- 权重数量:[8 8 64, 1024] + [1024, 100],由分类别数而定
- 偏置数量:[1024] + [100],由分类别数而定
[structlog 文档]
model = keras.Sequential([
keras.layers.Conv2D(32, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
keras.layers.Conv2D(64, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
keras.layers.Flatten(),
keras.layers.Dense(1024, activation=tf.nn.relu),
keras.layers.Dense(100, activation=tf.nn.softmax),
])
- 其它完整代码
def compile(self):
CNNMnist.model.compile(optimizer=keras.optimizers.Adam(),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
return None
def fit(self):
CNNMnist.model.fit(self.train, self.train_label, epochs=1, batch_size=32)
return None
def evaluate(self):
test_loss, test_acc = CNNMnist.model.evaluate(self.test, self.test_label)
print(test_loss, test_acc)
return None
if __name__ == '__main__':
cnn = CNNMnist()
cnn.compile()
cnn.fit()
cnn.predict()
print(CNNMnist.model.summary())
卷积神经网络
2.2 梯度下降算法改进
[logging 文档]
学习目标
-
目标
-
了解深度学习遇到的一些问题
- 知道批梯度下降与MiniBatch梯度下降的区别
- 知道指数加权平均的意义
- 知道动量梯度、RMSProp、Adam算法的公式意义
- 知道学习率衰减方式
- 知道参数初始化策略的意义
- 了解偏差与方差的意义
- 知道L2正则化与L1正则化的数学意义
- 知道Droupout正则化的方法
- 知道常用的一些神经网络超参数
-
知道BN层的意义以及数学原理
-
应用
-
无
[Python 语言参考]
深度学习难以在大数据领域发挥最大效果的一个原因是,在巨大的数据集基础上进行训练速度很慢。而优化算法能够帮助我们快速训练模型,提高计算效率。接下来我么就去看有哪些方法能够解决我们刚才遇到的问题或者类似的问题
2.2.1 优化遇到的问题
[Seaborn 文档]
- 梯度消失
- 局部最优
2.2.1.1 梯度消失
在梯度函数上出现的以指数级递增或者递减的情况分别称为梯度爆炸或者梯度消失。
假设g(z)=z,b[l]=0g(z) = z, b^{[l]} = 0g(z)=z,b[l]=0y^=W[L]W[L−1]...W[2]W[1]X\hat{y} = W^{[L]}W^{[L-1]}...W^{[2]}W^{[1]}Xy^=W[L]W[L−1]...W[2]W[1]X
- 对于W[l]W^{[l]}W[l]
- 对于W[l]W^{[l]}W[l]
在计算梯度时,根据不同情况梯度函数也会以指数级递增或递减,导致训练导数难度上升,梯度下降算法的步长会变得非常小,需要训练的时间将会非常长。
2.2.1.2 局部最优
[PySimpleGUI 文档]
[CatBoost 文档]
鞍点(saddle)是函数上的导数为零,但不是轴上局部极值的点。通常梯度为零的点是上图所示的鞍点,而非局部最小值。减少损失的难度也来自误差曲面中的鞍点,而不是局部最低点。
- 在训练较大的神经网络、存在大量参数,并且成本函数被定义在较高的维度空间时,困在极差的局部最优基本不会发生
- 鞍点附近的平稳段会使得学习非常缓慢,而这也是需要后面的动量梯度下降法、RMSProp 以及 Adam 优化算法能够加速学习的原因,它们能帮助尽早走出平稳段。
解决办法有多种形式,通常会结合一些形式一起进行
-
初始化参数策略(第一部分第四节提到)
-
Mini梯度下降法
-
梯度下降算法的优化
- 学习率衰减
[sys 文档]
2.2.2 参数初始化策略(复习)
由于在z=w1x1+w2x2+...+wnxn+bz={w}_1{x}_1+{w}_2{x}_2 + ... + {w}_n{x}_n + bz=w1x1+w2x2+...+wnxn+bwiw_iwizzz
2.2.3 批梯度下降算法(Batch Gradient Descent)
- 定义:批梯度下降法(btach),即同时处理整个训练集。
[GeeksforGeeks Python]
其在更新参数时使用所有的样本来进行更新。对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候,处理速度就会比较慢。
所以换一种方式,每次处理训练数据的一部分进行梯度下降法,则我们的算法速度会执行的更快。
2.2.3.1 Mini-Batch Gradient Descent
- 定义:Mini-Batch 梯度下降法(小批量梯度下降法)每次同时处理固定大小的数据集。
不同
-
种类:
-
mini-batch 的大小为 1,即是随机梯度下降法(stochastic gradient descent)
使用 Mini-Batch 梯度下降法,对整个训练集的一次遍历(epoch)只做 mini-batch个样本的梯度下降,一直循环整个训练集。
2.2.3.2 批梯度下降与Mini-Batch梯度下降的区别
batch梯度下降法和Mini-batch 梯度下降法代价函数的变化趋势如下:
