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

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

这次的专栏与以往稍有不同。我要回答的问题全部源于 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;endend
endend

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

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

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

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

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

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

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

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

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

相关文章

关于Linux Kernel Panic导致重启的简单分析步骤

Linux系统Kernel Panic的检索 如何判断是否发生Kernel Panic,以下以 CentOS 7.9系统为例 #查看 /var/crash 路径下是否有生成文件夹,Kernel Panic后会生成文件夹在此路径表示产生了Kernel Panic ls /var/crash #/var/crash/127.0.0.1-2023-12-04-08\:5…

HarmonyOS应用开发者基础认证考试(稳过)

判断题 ​​​​​​​ 1. Web组件对于所有的网页都可以使用zoom(factor: number)方法进行缩放。错误(False) 2. 每一个自定义组件都有自己的生命周期正确(True) 3. 每调用一次router.pushUrl()方法,默认情况下,页面栈数量会加1,页面栈支持的…

linux redis-cluster ipv6方式

配置文件,具体字段的含义,可以参考其他文档。 1.单个文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…

【STM32】TIM定时器编码器

1 编码器接口简介 Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 接收正交信号&#…

黑豹程序员-EasyExcel实现导出

需求 将业务数据导出到excel中,老牌的可以选择POI,也有个新的选择EasyExcel。 有个小坑,客户要求样式比较美观,数字列要求千位符,保留2位小数。 可以用代码实现但非常繁琐,用模板就特别方便,模…

C++优秀串口库

serial::Serial Class Reference #include <serial.h> Data Structures class ScopedReadLockclass ScopedWriteLock Public Member Functions公有成员方法&#xff08;编程用的都在这里了&#xff0c;那些私有的如果不开源一般跟我们没有关系了&#xff09; Serial …

用chatGPT开发项目:我想的无人的智慧树网站 流量之神 利用人工智能的算法将人吸引住 GPT4是不是越来越难用了,问一下就要证明一下自己是不是人类

广度发散&#xff1a;让AI给出时代或今日或你关注的热点事件 比如采集新闻头条&#xff0c;根据内容或标题&#xff0c;以不同的角度&#xff0c;或各种人群的角色&#xff0c;生成50篇简短的文章。一下就能占传统的搜索引擎。这是AI最擅长的【千人千面&#xff0c;海量生成】…

【中国海洋大学】操作系统随堂测试6整理

1. IO系统的层次机构包括&#xff1a;IO硬件、中断处理程序、&#xff08;&#xff09;程序、设备独立性软件、用户层软件。 答&#xff1a;设备驱动 2. IO设备和控制器之间的接口包括三种类型的信号&#xff1a;数据信号线、控制信号线和&#xff08;&#xff09;&#xff1…

qt反射基础

最近研究了一下QT的反射机制&#xff0c; Qt的元对象系统除了提供信号/槽机制的特性之外&#xff0c;它还提供了以下特性: QObject::metaObject() 返回关联的元对象 QMetaObject::className() 在运行时状态下返回类名 QObject::inherits() 判断类的继承关系 QObject::tr()&…

鸿蒙开发之封装优化

面向对象开发离不开封装&#xff0c;将重复的可以复用的代码封装起来&#xff0c;提高开发效率。 基于之前的List&#xff0c;对代码进行封装。 1、抽取component 将List的头部抽离出来作为一个新的component。可以创建一个新的ArkTS文件&#xff0c;写我们的头部代码 为了…

代理模式:解析对象间的间接访问与控制

目录 引言 理解代理模式 不同类型的代理模式 代理模式的应用场景 代理模式的优缺点 优点 缺点 实际案例&#xff1a;Java中的代理模式应用 结语 引言 代理模式是软件设计模式中的一种结构型模式&#xff0c;旨在为其他对象提供一种代理以控制对这个对象的访问。它允许你…

消息队列使用指南

介绍 消息队列是一种常用的应用程序间通信方法&#xff0c;可以用来在不同应用程序或组件之间传递数据或消息。消息队列就像一个缓冲区&#xff0c;接收来自发送方的消息&#xff0c;并存储在队列中&#xff0c;等待接收方从队列中取出并处理。 在分布式系统中&#xff0c;消…

死锁问题,4个必要条件+避免死锁

目录 引入 死锁 概念 示例 多把锁 单锁 4个必要条件 用途 引入 我们用加锁的方式保证了多个线程访问临界资源时,不会出现数据紊乱的问题 但是,锁的引入,会导致出现其他的问题 死锁 概念 在多线程或多进程的并发环境中&#xff0c;两个或多个进程或线程被永久阻塞&…

esxi全称“VMware ESXi

esxi全称“VMware ESXi”&#xff0c;是可直接安装在物理服务器上的强大的裸机管理系统&#xff0c;是一款虚拟软件&#xff1b;ESXi本身可以看做一个操作系统&#xff0c;采用Linux内核&#xff0c;安装方式为裸金属方式&#xff0c;可直接安装在物理服务器上&#xff0c;不需…

数据结构算法-希尔排序算法

引言 在一个普通的下午&#xff0c;小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐&#xff0c;更是要用扑克牌来决定谁是真正的“大老板”。 然而&#xff0c;小明的牌就像刚从乱麻中取出来的那样&#xff0c;毫无头绪。小森的牌也像是被小丑掷…

Agent学习笔记

背景&#xff1a;LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了&#xff0c;ChatGPT很强大&#xff0c;但是也有做不到的东西。例如&#xff1a; 实时查询问题&#xff1a;实时的天气&#xff0c;地理位置&#xff0c;最新新闻报道&#xff0c;现实世界…

十年婚姻·总结八

十年婚姻总结八 女人一生的合伙人不能只是帅哥哥 女人一生的合伙人不能只是帅哥哥 浪漫的本质还是你的筹码。 比如你送男人5万的手表&#xff0c;但你没什么其他筹码&#xff08;皮肤粗糙蜡黄、没人脉金钱资源、长的胖&#xff09;。 那个男人会觉得你胡闹&#xff0c;你送的…

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…

引用文献算作重复率么【一文读懂】

大家好&#xff0c;今天来聊聊引用文献算作重复率么&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 引用文献算作重复率么 在学术研究和论文撰写过程中&#xff0c;引用文献是不可或缺的一部分小发猫伪…

shell学习1——txt文件备份,文件名加个年月日的后缀,如test.txt对于备份文件为test.txt_20231205

跟B站Up主学习shell脚本——阿铭linux 3461576172505894 需求 txt文件备份&#xff0c;文件名加个年月日的后缀&#xff0c;如test.txt对于备份文件为test.txt_20231205 代码 #!/bin/bash ##定义后缀变量 suffixdate %Y%m%d##找到/test/目录下的txt文件 for f in find /tes…