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

举报
程序员一诺python 发表于 2025/09/05 12:55:08 2025/09/05
【摘要】 1.深度学习概述包括深度学习与机器学习区别、深度学习应用场景、深度学习框架介绍、项目演示、开发环境搭建(pycharm安装)。2. TensorFlow基础涵盖TF数据流图、TensorFlow实现加法运算、图与TensorBoard(图结构、图相关操作、默认图、创建图、OP)、张量(张量概念、张量的阶、张量数学运算)、变量OP(创建变量)、增加其他功能(命名空间、模型保存与加

🏆🏆🏆教程全知识点简介: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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。