【深度学习】嘿马深度学习笔记第10篇:卷积神经网络,2.5 CNN网络实战技巧【附代码文档】

🏆🏆🏆教程全知识点简介: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://bbs.huaweicloud.com/blogs/458269 中查看
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/457511 中查看
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/458269 中查看
✨ 本教程项目亮点
🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考
🎯🎯🎯全教程总章节
🚀🚀🚀本篇主要内容
卷积神经网络
2.5 CNN网络实战技巧
学习目标
-
目标
-
了解迁移学习以及技巧
-
应用
-
无
来看一个个问题如果 要做一个具体场景的计算机视觉任务,那么从头开始训练一个网络是合适的选择吗?怎么样才能避免浪费过多的计算时间?
2.5.1 迁移学习(Transfer Learning)
2.5.1.1 介绍
-
定义
-
迁移学习就是利用数据、任务或模型之间的相似性,将在旧的领域学习过或训练好的模型,应用于新的领域这样的一个过程。
- 两个任务的输入属于同一性质:要么同是图像、要么同是语音或其他
迁移学习到底在什么情况下使用呢?有两个方面需要 考虑的
- 1、当 有海量的数据资源时,可以不需要迁移学习,机器学习系统很容易从海量数据中学习到一个鲁棒性很强的模型。但通常情况下, 需要研究的领域可获得的数据极为有限,在少量的训练样本上精度极高,但是泛化效果极差。
- 2、训练成本,很少去从头开始训练一整个深度卷积网络,从头开始训练一个卷积网络通常需要较长时间且依赖于强大的 GPU 计算资源。
2.5.1.2 方法
-
最常见的称呼叫做fine tuning,即微调
-
已训练好的模型,称之为Pre-trained model
通常 需要加载以训练好的模型,这些可以是一些机构或者公司在ImageNet等类似比赛上进行训练过的模型。TensorFlow同样也提供了相关模型地址:[
下图是其中包含的一些模型:
2.5.1.3 过程
这里 举一个例子,假设有两个任务A和B,任务 A 拥有海量的数据资源且已训练好,但并不是 的目标任务,任务 B 是 的目标任务。下面的网络模型假设是已训练好的1000个类别模型
而B任务假设是某个具体场景如250个类别的食物识别,那么该怎么去做
- 1、建立自己的网络,在A的基础上,修改最后输出结构,并加载A的模型参数
-
2、根据数据大小调整
-
如果B任务数据量小,那么 可以选择将A模型的所有的层进行freeze(可以通过Tensorflow的trainable=False参数实现),而剩下的输出层部分可以选择调整参数训练
- 如果B任务的数据量大,那么 可以将A中一半或者大部分的层进行freeze,而剩下部分的layer可以进行新任务数据基础上的微调
卷积神经网络
3.1 迁移学习案例
学习目标
-
目标
-
说明数据增强的作用
-
应用
-
应用Keras基于VGG对五种图片类别识别的迁移学习
3.1.1 案例:基于VGG对五种图片类别识别的迁移学习
3.1.1.2 数据集以及迁移需求
数据集是某场景下5个类别图片的识别
利用现有的VGG模型去进行微调
3.1.1.3 思路和步骤
-
读取本地的图片数据以及类别
-
keras.preprocessing.image import ImageDataGenerator提供了读取转换功能
-
模型的结构修改(添加 自定的分类层)
- freeze掉原始VGG模型
- 编译以及训练和保存模型方式
- 输入数据进行预测
3.1.1.4 训练的时候读取本地图片以及类别
-
使用一个ImageDataGenerator图片生成器,定义图片处理以及数据增强相关
-
train_generator = ImageDataGenerator( rescale=1.0 / 255, # 标准化 rotation_range=20, # 旋转 width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
-
这个API提供数据处理相关功能,以及数据增强功能
-
train_generator.flow_from_directory(directory=path,# 读取目录 target_size=(h,w),# 目标形状 batch_size=size,# 批数量大小 class_mode='binary', # 目标值格式 shuffle=True)
-
这个API固定了读取的目录格式,参考:
-
```python data/ train/ dogs/ dog001.jpg dog002.jpg ... cats/ cat001.jpg cat002.jpg ... validation/ dogs/ dog001.jpg dog002.jpg ... cats/ cat001.jpg cat002.jpg ...
-
代码:
首先导入包
```python
[PyMongo 文档]
import tensorflow as tf
from tensorflow import keras
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
定义一个迁移学习的类,然后进行相关属性设置和读取代码
class TransferModel(object):
def __init__(self):
self.model_size = (224, 224)
self.train_dir = "./data/train/"
self.test_dir = "./data/test/"
self.batch_size = 32
self.train_generator = ImageDataGenerator(rescale=1.0 / 255)
self.test_generator = ImageDataGenerator(rescale=1.0 / 255)
def read_img_to_generator(self):
"""
读取本地固定格式数据
:return:
"""
train_gen = self.train_generator.flow_from_directory(directory=self.train_dir,
target_size=self.model_size,
batch_size=self.batch_size,
class_mode='binary',
shuffle=True)
test_gen = self.test_generator.flow_from_directory(directory=self.test_dir,
target_size=self.model_size,
batch_size=self.batch_size,
class_mode='binary',
shuffle=True)
return train_gen, test_gen
3.1.1.5 VGG模型的修改添加全连接层-GlobalAveragePooling2D
对于VGG最后的1000输出结果, 选择不动,在这基础之上 添加若干层全连接层。
-
一个GlobalAveragePooling2D + 两个全连接层
-
在图像分类任务中,模型经过最后CNN层后的尺寸为[bath_size, img_width, img_height, channels],通常的做法是:接一个flatten layer,将尺寸变为[batch_size, w h channels],再至少接一个FC layer,这样做的最大问题是:模型参数多,且容易过拟合。利用pooling layer来替代最后的FC layer
解释如下:
from keras.layers import Dense, Input, Conv2D
from keras.layers import MaxPooling2D, GlobalAveragePooling2D
x = Input(shape=[8, 8, 2048])
# 假定最后一层CNN的层输出为(None, 8, 8, 2048)
x = GlobalAveragePooling2D(name='avg_pool')(x) # shape=(?, 2048)
# 取每一个特征图的平均值作为输出,用以替代全连接层
x = Dense(1000, activation='softmax', name='predictions')(x) # shape=(?, 1000)
# 100为类别
- 5类图片识别模型修改
需要拿到基础VGG模型,并且VGG提供所有层参数训练好的模型和没有全连接层参数的模型notop模型
-
notop模型:
-
是否包含最后的3个全连接层(whether to include the 3 fully-connected layers at the top of the network)。用来做fine-tuning专用,专门开源了这类模型。
‘weights='imagenet'’,意思是VGG在在ResNet结构预训练的权重
# 在__init__中添加
self.base_model = VGG16(weights='imagenet', include_top=False)
base_model会有相关属性,模型的输入结构:inputs,模型的输出结构, 修改需要得到已有VGG的输入和自定义模型的输出构建成一个新的模型。
def refine_vgg_model(self):
"""
添加尾部全连接层
:return:
"""
x = self.base_model.outputs[0]
x = keras.layers.GlobalAveragePooling2D()(x)
x = keras.layers.Dense(1024, activation=tf.nn.relu)(x)
y_predict = keras.layers.Dense(5, activation=tf.nn.softmax)(x)
model = keras.Model(inputs=self.base_model.inputs, outputs=y_predict)
return model
3.1.1.6 freeze VGG模型结构
目的:让VGG
- 点赞
- 收藏
- 关注作者
评论(0)