深度学习之全面了解预训练模型

news2024/11/17 4:28:13

在本专栏中,我们将讨论预训练模型。有很多模型可供选择,因此也有很多考虑事项。

这次的专栏与以往稍有不同。我要回答的问题全部源于 MathWorks 社区论坛(ww2.mathworks.cn/matlabcentral/)的问题。我会首先总结 MATLAB Answers 上的回答,然后基于问题提出问题:大家为什么会问这些问题?

因此,本专栏将介绍如何选择预训练模型、如何确定是否作出了正确的选择,并回答关于预训练模型的三个问题:

1. 训练网络时,应操作数据大小还是模型输入大小?

2. 为什么要在 MATLAB 中导入经过预训练的 YOLO 模型?

3. 为什么要冻结预训练模型的权重?

选择预训练模型

可供选择的模型非常多,而且只会越来越多。这当然带来很多便利,但也有些令人望而生畏:我们该如何挑选,又如何确定是否作出了正确的选择?

与其把所有预训练模型放在一起考虑,我们不妨将它们分成几类。

基本模型

这些模型架构简单,可以轻松上手。这些模型通常层数较少,支持预处理和训练选项的快速迭代。一旦掌握了训练模型的方法,就可以开始尝试改善结果。

尝试这些模型:GoogLeNet、VGG-16、VGG-19 和 AlexNet

图片

高准确度模型

这些模型适用于基于图像的工作流,如图像分类、目标检测和语义分割。大多数网络,包括上述基本模型,都属于此类别。与基本模型的区别在于,高准确度模型可能需要更多训练时间,网络结构更复杂。

尝试这些模型:ResNet-50、Inception-v3、Densenet-201

目标检测工作流:一般推荐基于 DarkNet-19 和 DarkNet-53 创建检测和 YOLO 类型工作流。我也见过 ResNet-50 加 Faster R-CNN 的组合,因此多少有一些选择余地。我们将在之后的问题中进一步讨论目标检测。

语义分割:您可以选择一个网络并将其转换为语义分割网络。也有一些专门的 Segnet 结构,如 segnetLayers 和 unetLayers。

图片

适合边缘部署的模型

当部署到硬件时,模型大小变得尤为重要。此类模型内存占用量较小,适合 Raspberry Pi™ 等嵌入式设备。

尝试这些模型:SqueezeNet、MobileNet-v2、ShuffLeNet、NASNetMobile

图片

以上只是一些常规原则,为模型选择提供基本思路。我将从第一类模型入手,之后如果需要,再选择更复杂的模型。我个人觉得 AlexNet 是一个不错的起点。它的架构非常容易理解,性能表现通常也不错,当然也取决于具体问题。

选择模型时,如何确定是否作出了正确的选择?

对于您的任务来说,合适的模型可能不止一个。

只要模型的准确度能满足给定任务的需求,就是一个可接受的模型。至于多高的准确度意味着“可接受”,则可能视应用不同而差异极大。

例如,购物时某宝推荐商品出错不是什么大事,但暴风雪漏报后果就很严重。

针对您的应用尝试各种预训练网络,方能确保获得最准确和最稳健的模型。

当然,要实现一个成功的应用,网络架构只是众多因素之一。

图片

Q1

问题 1:训练网络时,应操作数据大小还是模型输入大小?

此问题来自论坛提问“如何在预训练模型中使用灰度图像”和“如何更改预训练模型的输入大小”。

  • 如何在预训练模型中使用灰度图: 

https://ww2.mathworks.cn/matlabcentral/answers/448360-how-we-do-transfer-learning-using-pretrained-models-with-grey-scale-images-as-input

  • 如何更改预训练模型的输入大小: 

https://ww2.mathworks.cn/matlabcentral/answers/458610-change-input-size-of-a-pre-trained-network

首先快速回顾一下模型数据输入的相关知识。

所有预训练模型都有一个预期,即需要什么样的输入数据结构,才能重新训练网络或基于新数据进行预测。

如果数据与模型预期不符,您就可能提出这些问题。

这就带来了一个有趣的问题:是要操作数据,还是操作模型?

最简单的方法是更改数据

这很简单:只需调整数据的大小,就可以操作数据输入的大小。在 MATLAB® 中,使用 imresize 命令就能做到。灰度问题也变得很简单。

彩色图像通常采用 RGB 形式,包含三个层,分别表示红、绿、蓝三个颜色平面。灰度图像则只包含一个层而不是三个层。只需重复灰度图像的单个层,就可以创建网络所期望的输入结构,原理如下图所示。

图片

山魈照片的原始彩色图像,经灰度处理的图像,以及单独显示红、绿、蓝平面的图像。

这是一张色彩非常丰富的图像,可以看到,三个 RGB 平面看起来就像三张灰度图像,它们组合在一起形成一张彩色图像。

稍微复杂一点的方法是更改模型。为什么要大费周章地操作模型而不是数据?

因为现有的输入数据决定了只能这样做。

假设您的图像是 1000×1000 像素,您的模型接受 10×10 像素大小的图像。如果您将图像调整到 10×10 像素,就只能得到一张充满噪声的输入图像。

在这种情况下,您需要更改模型的输入层,而不是输入。

图像大小:1000×1000 像素:

图片

图像大小:10×10 像素

图片

我原以为对模型输入层进行操作会非常复杂,但在 MATLAB 里试了试,其实还好。相信我,真的不复杂。您只需完成以下操作:

1. 打开深度网络设计器 Deep Network Designer。

2. 选择一个预训练模型。

3. 删除当前输入层,并替换为新层。这样您就可以更改输入大小。

4. 导出模型,直接就能在迁移学习应用中使用。我推荐按照基本迁移学习示例进行操作:

https://ww2.mathworks.cn/help/deeplearning/ug/train-deep-learning-network-to-classify-new-images.html

整个过程非常轻松,您不必手动编码即可更改预训练模型的输入大小。

Q2

问题 2:为什么要在 MATLAB 中导入经过预训练的 YOLO 模型?

此问题源于基于 COCO 数据集训练 YOLO v3,答案很明确。背景并不复杂。

  • 基于 COCO 数据集训练 YOLO v3

https://ww2.mathworks.cn/matlabcentral/answers/553528-yolo-v3-training-on-coco-data-set

此示例介绍如何使用 ResNet-50 训练 YOLO v2 网络以在 MATLAB 中使用:

https://ww2.mathworks.cn/help/deeplearning/ug/object-detection-using-yolo-v2.html

YOLO 是“you only look once”的缩写。

该算法有多个版本,相对于 v2,v3 改进了定位较小对象的功能。YOLO 从一个特征提取网络(使用预训练模型,如 ResNet-50 或 DarkNet-19)开始,然后进行定位。

YOLO v3: https://ww2.mathworks.cn/help/vision/ug/object-detection-using-yolo-v3-deep-learning.html

那么,为什么要在 MATLAB 中导入经过预训练的 YOLO 模型?

YOLO 是最流行的目标检测算法之一。与简单的目标识别问题相比,目标检测更具挑战性。

对于目标检测,面临的挑战不仅仅是识别目标,还要确定其位置。

有两类目标检测器:

单级检测器,如 YOLO;两级检测器,如 Faster R-CNN。

  • 单级检测器可以实现快速检测。这篇文档详细介绍了 YOLO v2 算法。

https://ww2.mathworks.cn/help/vision/ug/getting-started-with-yolo-v2.html

  • 两级检测器:定位和目标识别准确度高这篇文档介绍了 R-CNN 算法的基础知识。

https://ww2.mathworks.cn/help/vision/ug/getting-started-with-r-cnn-fast-r-cnn-and-faster-r-cnn.html

图片

值得探索的目标检测应用有很多,不过我强烈建议从简单的目标检测示例开始,以此为基础逐步推进。

Q3

问题 3:为什么要冻结预训练模型的权重?

此问题源自如何冻结神经网络模型的特定权重?要回答此问题,我们先看一小段代码。

导入预训练网络后,您可以选择通过以下方式冻结权重:

冻结所有初始层:

layers(1:10) = freezeWeights(layers(1:10));

冻结单个层:

layer.WeightLearnRateFactor = 0;

冻结所有允许冻结的层:

function layers = freezeWeights(layers)

for ii = 1:size(layers,1)
    props = properties(layers(ii));
    for p = 1:numel(props)
        propName = props{p};
        if ~isempty(regexp(propName, 'LearnRateFactor$',  'once'))
            layers(ii).(propName) = 0;
        end
    end
end

end

如果该层有 LearnRateFactor,则将其设置为零。其他层保持不变。

冻结权重有两个好处,即您可以:

  • 加快训练速度。由于不需要计算已冻结层的梯度,因此冻结多个初始层的权重可以显著加快网络训练速度。

  • 防止过拟合。如果新数据集很小,冻结较浅的网络层可以防止这些层对新数据集过拟合。

实际上,您也可以将一个预训练模型的权重应用于您的模型,这样不经训练也能创建一个“经过训练的”网络。查看 MATLAB 中 assembleNetwork 的说明,了解如何不经训练直接基于层创建深度学习网络。

https://ww2.mathworks.cn/help/deeplearning/ref/assemblenetwork.html

最后,说到权重,对于类分布不平衡的分类问题,可以使用加权分类输出层。请参考关于使用自定义加权分类层的示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机视觉-05-目标检测:LeNet的PyTorch复现(MNIST手写数据集篇)(包含数据和代码)

文章目录 0. 数据下载1. 背景描述2. 预测目的3. 数据总览4. 数据预处理4.1 下载并加载数据,并做出一定的预先处理4.2 搭建 LeNet-5 神经网络结构,并定义前向传播的过程4.3 将定义好的网络结构搭载到 GPU/CPU,并定义优化器4.4 定义训练过程4.5…

机器学习算法(9)——集成技术(Bagging——随机森林分类器和回归)

一、说明 在这篇文章,我将向您解释集成技术和著名的集成技术之一,它属于装袋技术,称为随机森林分类器和回归。 集成技术是机器学习技术,它结合多个基本模块和模型来创建最佳预测模型。为了更好地理解这个定义,我们需要…

C语言进阶之路之结构体、枚举关卡篇

目录 一、学习目标 二、组合数据类型-结构体 结构体基本概念 结构体的声明: 小怪实战 结构体初始化 指定成员初始化的好处: 结构体成员引用 结构体指针与数组 关卡BOOS 三、结构体的尺寸 CPU字长 地址对齐 结构体的M值 可移植性 四、联合体…

ssm的健身房预约系统(有报告)。Javaee项目。ssm项目。

演示视频: ssm的健身房预约系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spring…

极智一周 | AI 算力国产化、通义开源、Gemini、鸿蒙、蔚来 And so on

欢迎关注我的公众号 [极智视界],获取我的更多技术分享 大家好,我是极智视界,带来本周的 [极智一周],关键词:AI 算力国产化、通义开源、Gemini、鸿蒙、蔚来 And so on。 邀您加入我的知识星球「极智视界」,…

c-语言->数据在内存的存储

系列文章目录 文章目录 系列文章目录前言 前言 目的:学习整数在内存的储存,什么是大小端,浮点数的储存。 1. 整数在内存中的存储 在讲解操作符的时候,我们就讲过了下⾯的内容: 整数的2进制表⽰⽅法有三种&#xff0…

带有 RaspiCam 的 Raspberry Pi 监控和延时摄影摄像机

一、说明 一段时间以来,我一直想构建一个运动激活且具有延时功能的树莓派相机,但从未真正找到我喜欢的案例。我在thingiverse上找到了这个适合树莓派和相机的好案例。它是为特定的鱼眼相机设计的,但从模型来看,我拥有的廉价中国鱼…

STM32F1之CAN报文传输

目录 报文传输 1. 帧类型 1.1 数据帧 1.1.1 帧起始 1.1.2 仲裁场 1.1.3 控制场 1.1.4 数据场 1.1.5 CRC 场 1.1.6 应答场 1.1.7 帧结尾 1.2 远程帧 1.3 错误帧 1.4 过载帧 1.5 帧间空间(INTERFRAME SPACING) 2. 发送器/接收器的…

【动态规划】【广度优先】LeetCode2258:逃离火灾

作者推荐 本文涉及的基础知识点 二分查找算法合集 动态规划 二分查找 题目 给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid ,它表示一个网格图。每个格子为下面 3 个值之一: 0 表示草地。 1 表示着火的格子。 2 表示一座墙,你跟…

【C语言】内联函数

一、内联函数 在C语言中,内联函数(Inline function)是一种代码优化技术,它的目的是减少函数调用的开销。内联函数通知编译器在每个函数调用的位置插入函数的实际代码,而不是进行传统的函数调用。这避免了调用函数时的…

球上进攻^^

欢迎来到程序小院 球上进攻 玩法&#xff1a;点击鼠标走动躲避滚动的球球&#xff0c;球球碰到即为游戏结束&#xff0c;看看你能坚持多久&#xff0c;快去玩吧^^。开始游戏https://www.ormcc.com/play/gameStart/214 html <div id"game" class"game" …

【基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现】

基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现 前言数据获取与清洗数据集数据获取数据清洗 数据分析与可视化数据分析功能可视化功能 创新点结语 前言 随着游戏产业的蓬勃发展&#xff0c;了解游戏销售数据对于游戏从业者和游戏爱好者都至关重要。为了更好地分…

(六)五种最新算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…

DataFrame的使用

查看数据类型及属性 # 查看df类型 type(df) # 查看df的shape属性&#xff0c;可以获取DataFrame的行数&#xff0c;列数 df.shape # 查看df的columns属性&#xff0c;获取DataFrame中的列名 df.columns # 查看df的dtypes属性&#xff0c;获取每一列的数据类型 df.dtypes df.i…

模型能力赋能搜索——零样本分类(Zero-Shot Classification)在搜索意图识别上的探索

什么是Zero-Shot Classification https://huggingface.co/tasks/zero-shot-classification hugging face上的零样本分类模型 facebook/bart-large-mnli https://huggingface.co/facebook/bart-large-mnli 当然这是一个英文模型&#xff0c;我们要去用一些多语言的模型。 可以在…

Android 样式小结

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、使用3.1 创建并应用样式3.2 创建并…

Azure Machine Learning - 使用 Azure OpenAI 服务生成图像

在浏览器/Python中使用 Azure OpenAI 生成图像&#xff0c;图像生成 API 根据文本提示创建图像。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#x…

点击el-tree小三角后去除点击后的高亮背景样式,el-tree样式修改

<div class"videoTree" v-loading"loadingTree" element-loading-text"加载中..." element-loading-spinner"el-icon-loading" element-loading-background"rgba(0, 0, 0, 0.8)" > <el-tree :default-expand-all&q…

可视化监控云平台/智能监控平台EasyCVR国标设备开启音频没有声音是什么原因?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。GB28181视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存…

Nacos源码解读09——配置中心配置信息创建修改怎么处理的

存储配置 从整体上Nacos服务端的配置存储分为三层&#xff1a; 内存&#xff1a;Nacos每个节点都在内存里缓存了配置&#xff0c;但是只包含配置的md5&#xff08;缓存配置文件太多了&#xff09;&#xff0c;所以内存级别的配置只能用于比较配置是否发生了变更&#xff0c;只用…