MATLAB深度学习(七)——ResNet残差网络
一、ResNet网络
ResNet是深度残差网络的简称。其核心思想就是在,每两个网络层之间加入一个残差连接,缓解深层网络中的梯度消失问题

二、残差结构
在多层神经网络模型里,设想一个包含诺干层自网络,子网络的函数用H(x)来表示,其中x是子网络的输入。残差学习是通过重新设定这个参数,让一个参数层表达一个残差函数

因此这个子网络的输出y 就是
其中 +x 的操作,是通过一个相当于恒等映射的跳跃连接来完成的,它将残差块的输入直接与输出连接,这就是残差结构。按照上面的结构递推,根据前向传播,第i个残差块的输出就是第i+1个残差块的输入
根据递归公式,可以推导出
这里的L表示任意后续残差块,i是靠前块,那么公式就说明了总会有信号能从浅层到深层。
从反向传播来看,根据上面的公式对 Xl 进行求导,可以得到
这里的 是最小损失化函数。以上说明,浅层的梯度计算
,总会直接加上上一个项
因为存在额外的一项,所以就想 F(xi)很小,总的梯度都不会消失。
三、基于ResNet识别实现步骤
其主要步骤为1.加载图像数据,并将数据分为训练集合与验证集;2.加载MATLAB训练好的ResNet50;3.和Alexnet一样替换最后几层;4.按照网络配置调整图像数据;5.对网络进行训练
3.1 调整ResNet实现迁移学习
针对ImageNet的数据任务,原本最后三层 FC SOFTMAX 输出层是针对1000个类别的物体进行识别,针对图像问题,继续调整这三层,首先冻结上面的层。将下面的三层进行替换。由于ResNet50需要输入的图像大小为224 * 224 *3.
unzip('MerchData.zip');
img_ds = imageDatastore('MerchData', ...'IncludeSubfolders',true, ...'LabelSource','foldernames');total_split = countEachLabel(img_ds); %返回一个包含每个标签和相应图像数量的表格num_images = length(img_ds.Labels); %返回的图像的个数,5个类型都有15张照片
perm = randperm(num_images,10); %随机取出10个
figure
for i = 1:9subplot(3,3,i)imshow(imread(img_ds.Files{perm(i)})); %从图像数据集 (img_ds) 中读取一张图像并显示它%可以用alexnet的方法
endtest_idx = randperm(num_images,9); %随机取5张做样本
img_ds_Test = subset(img_ds,test_idx);
train_idx = setdiff(1:length(img_ds.Files),test_idx);
img_ds_Train = subset(img_ds,train_idx);%% 步骤2:加载预训练好的网络% 加载ResNet50网络(注:该网络需要提前下载,当输入下面命令时按要求下载即可)
net = resnet50;%% 步骤3:对网络结构进行调整,替换最后几层% 获取网络图结构
LayerGraph = layerGraph(net);
clear net;% 确定训练数据中新冠图片标签类别数量:5类
numClasses = numel(categories(img_ds_Train.Labels));
disp(numClasses);% 保留ResNet50倒数第三层之前的网络,并替换后3层
% 倒数第三层的全连接层,这里修改为5类
newLearnableLayer = fullyConnectedLayer(numClasses,...'Name','new_fc',...'WeightLearnRateFactor',10,...
'BiasLearnRateFactor',10);
%numClasses 分类任务。通过设置 WeightLearnRateFactor 和 BiasLearnRateFactor
%来控制学习率的调整,使得这些层在训练过程中能更快速地学习
% 分别替换最后3层:fc1000、softmax和分类输出层
LayerGraph = replaceLayer(LayerGraph,'fc1000',newLearnableLayer);
%替换了原网络中的 fc1000 层(ResNet50 中的全连接层)为 new_fc 层
% (即刚才定义的新的全连接层)。replaceLayer 函数通过层的名字来替换图层newSoftmaxLayer = softmaxLayer('Name','new_softmax');
LayerGraph = replaceLayer(LayerGraph,'fc1000_softmax',newSoftmaxLayer);newClassLayer = classificationLayer('Name','new_classoutput');
LayerGraph = replaceLayer(LayerGraph,'ClassificationLayer_fc1000',newClassLayer);%% 步骤4:按照网络配置调整图像数据% 输入图像格式转换,这里调用了自定义函数preprocess
img_ds_Train.ReadFcn = @(filename)preprocess(filename);
img_ds_Test.ReadFcn = @(filename)preprocess(filename);% 数据增强的参数
augmenter = imageDataAugmenter(...'RandRotation',[-5 5],...'RandXReflection',1,...'RandYReflection',1,...'RandXShear',[-0.05 0.05],...'RandYShear',[-0.05 0.05]);
% 将批量训练图像的大小调整为与输入层的大小相同
aug_img_ds_train = augmentedImageDatastore([224 224],img_ds_Train,'DataAugmentation',augmenter);
% 将批量测试图像的大小调整为与输入层的大小相同
aug_img_ds_test = augmentedImageDatastore([224 224],img_ds_Test);%% 步骤5:对网络进行训练% 对训练参数进行设置
options = trainingOptions('adam',...'MaxEpochs',10,...'MiniBatchSize',8,...'Shuffle','every-epoch',...'InitialLearnRate',1e-4,...'Verbose',false,...'Plots','training-progress',...'ExecutionEnvironment','cpu');% 用训练图像对网络进行训练
netTransfer = trainNetwork(aug_img_ds_train,LayerGraph,options);%% 步骤6:进行测试并查看结果% 对训练好的网络采用验证数据集进行验证
[YPred,scores] = classify(netTransfer,aug_img_ds_test);% 随机显示验证效果
idx = randperm(numel(img_ds_Test.Files),4);
figure
for i = 1:4subplot(2,2,i)I = readimage(img_ds_Test,idx(i));imshow(I)label = YPred(idx(i));title(string(label));
end%% 计算分类准确率
YValidation = img_ds_Test.Labels;
accuracy = mean(YPred == YValidation);%% 创建并显示混淆矩阵
figure
confusionchart(YValidation,YPred)
实现效果如下:

相关文章:
MATLAB深度学习(七)——ResNet残差网络
一、ResNet网络 ResNet是深度残差网络的简称。其核心思想就是在,每两个网络层之间加入一个残差连接,缓解深层网络中的梯度消失问题 二、残差结构 在多层神经网络模型里,设想一个包含诺干层自网络,子网络的函数用H(x)来表示&#x…...
freeswitch(配置event_socket连接)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景说明: 如果想使用代码进行控制freeswitch添加账号、获取注册信息、强拆等,可以使用ESL控制vim autoload_configs/event_socket.conf.x…...
C++ SQLite轻量化数据库使用总结
官网下载:https://www.sqlite.org/download.html 示例1 #include <iostream> #include <sqlite3.h>int main() {sqlite3* db;char* zErrMsg 0;int rc;// 打开数据库连接(如果数据库不存在,则会自动创建)rc sqlite…...
docker打包当前使用的某个容器为镜像,导出,导入
容器打包成镜像 要将正在使用的 Docker 容器打包成镜像,你可以使用 docker commit 命令。这个命令会从运行中的容器创建一个新的镜像。以下是详细步骤: 查看正在运行的容器: 使用以下命令查看当前正在运行的容器: docker ps找到目…...
【刷题22】BFS解决最短路问题
目录 一、边权为1的最短路问题二、迷宫中离入口最近的出口三、最小基因变化四、单词接龙五、为高尔夫比赛砍树 一、边权为1的最短路问题 如图:从A到I,怎样走路径最短 一个队列一个哈希表队列:一层一层递进,直到目的地为止哈希表&…...
服务器重启:数字世界的短暂休憩与新生
在互联网的浩瀚海洋中,服务器犹如一座座灯塔,持续稳定地散发着光芒,为无数的网络活动提供着支撑与指引。而服务器重启,便是这数字灯塔周期性进行自我调整与修复的关键环节。 服务器重启是指对服务器进行重新启动的过程࿰…...
JavaEE 【知识改变命运】05 多线程(4)
文章目录 单例模式什么是单例模式饿汉模式懒汉模式多线程- 懒汉模式分析多线程问题第一种添加sychronized的方式第二种添加sychronized的方式改进第二种添加sychronized的方式(DCL检查锁) 阻塞队列什么是阻塞队列什么是消费生产者模型标准库中的阻塞队列…...
【CSS in Depth 2 精译_076】12.4 @font-face 的工作原理
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...
SQL Having用法
拿个业务场景说这个案例,比如我们有个表里面可能有批改过的数据,批改过得数据不会随着新批改的数据覆盖,而是逐条插入表中,如果想找出包含最早批改的数据和最新批改数据的话,那么我们就需要用到了havinng 用法,假设最开…...
@JsonNaming实现入参接口参数下划线驼峰自动转换
JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 是用于 Jackson 库中的一个注解,作用是改变 Java 对象的字段命名策略,特别是在序列化和反序列化时。这可以帮助 Java 对象中的字段名从驼峰命名法(CamelCase)转换为蛇…...
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
目标检测技术作为计算机视觉领域的核心组件,在自动驾驶系统、智能监控、零售分析以及增强现实等应用中发挥着关键作用。本文将详细介绍PaliGemma2模型的微调流程,该模型通过整合SigLIP-So400m视觉编码器与Gemma 2系列的高级语言模型,专门针对…...
MinerU:PDF文档提取工具
目录 docker一键启动本地配置下载模型权重文件demo.pyGPU使用情况 wget https://github.com/opendatalab/MinerU/raw/master/Dockerfile docker build -t mineru:latest .docker一键启动 有点问题,晚点更新 本地配置 就是在Python环境中配置依赖和安装包 根据需求…...
spark的共享变量
因为RDD在spark中是分布式存储 1、python中定义的变量仅仅在driver中运行,在excutor中是获取不到值的——广播变量 2、若定义了一个变量进行累加,先分别在driver和excutor中进行累加,但是结果是不会主动返回给driver的——累加器 Broadcas…...
Scrapy与MongoDB
Scrapy可以在非常短的时间里获取大量的数据。这些数据无论是直接保存为纯文本文件还是CSV文件,都是不可取的。爬取一个小时就可以让这些文件大到无法打开。这个时候,就需要使用数据库来保存数据了。 MongoDB由于其出色的性能,已经成为爬虫的首…...
爬虫基础与实践
爬虫技术基础与实践 在当今数字化的时代,数据成为了宝贵的资源。爬虫技术作为获取数据的重要手段,受到了广泛的关注和应用。本文将介绍爬虫的基本概念、工作原理以及一些常用的技术和工具。 一、爬虫的基本概念 爬虫,也称为网络蜘蛛或网络机器…...
快速上手Serverless架构与FastAPI结合实现自动化移动应用后端
快速上手Serverless架构与FastAPI结合实现自动化移动应用后端 引言 随着云计算技术的发展,Serverless架构已经成为构建现代应用的一种流行选择。它允许开发者将更多精力集中在核心业务逻辑上,而无需管理底层基础设施。本文将以AWS Lambda和API Gateway…...
ansible自动化运维(二)playbook模式详解
一.Ansible中的playbook模式 Playbook不同于使用单个模块操作远程服务器,Playbook的功能更加强大。如果说单个模块执行类似于Linux系统中的命令,那么Playbook就类似于shell脚本,将多个模块组合起来实现一组的操作。 Playbook还是会用到ad-h…...
基于Springboot社团管理系统【附源码】
基于Springboot社团管理系统 效果如下: 系统登录页面 用户管理页面 社团信息管理页面 社团活动管理页面 经费信息管理页面 新闻信息管理页面 系统主页面 社团信息页面 研究背景 在当今高校与社区环境中,学生社团蓬勃发展,成为学生课余生活…...
CSS:html中,.png的动态图,怎么只让它显示部分,比如只显示右上部分的,或右边中间部分
目录 背景 方法 1: 使用 background-image 和 background-position 示例代码 解释 方法 2: 使用 clip-path 裁剪图像 示例代码 解释 方法 3: 使用 object-fit 和 overflow 示例代码 解释 示例 总结 背景 在HTML中,如果你有一个 .png 的动态图(例如一个 GIF 动画或…...
解读CVPR2024-论文分享|RepViT: Revisiting Mobile CNN From ViT Perspective
论文标题 RepViT: Revisiting Mobile CNN From ViT Perspective 论文链接: https://arxiv.org/abs/2307.09283 论文作者 Ao Wang, Hui Chen, Zijia Lin, Jungong Han, Guiguang Ding 内容简介 这篇论文探讨了在资源受限的移动设备上,轻量级视觉变…...
ROCm零基础入门实战指南:从环境搭建到高性能计算
ROCm零基础入门实战指南:从环境搭建到高性能计算 【免费下载链接】ROCm AMD ROCm™ Software - GitHub Home 项目地址: https://gitcode.com/GitHub_Trending/ro/ROCm AMD ROCm(Radeon Open Compute)是一套开源GPU计算平台,…...
打破音乐枷锁:ncmdumpGUI让你的NCM文件重获自由
打破音乐枷锁:ncmdumpGUI让你的NCM文件重获自由 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你下载的音乐其实并不属于你。当你在网易云音乐客户…...
Simulink模型加密二选一:是选‘受保护模型’还是自己写S-Function?一份给嵌入式代码生成者的选择指南
Simulink模型加密实战:受保护模型与S-Function的深度技术选型 在嵌入式系统开发中,Simulink模型往往承载着核心算法和知识产权。当需要与团队协作或交付给客户时,如何在保证模型可用性的同时防止核心逻辑被窥探或篡改?这成为每个嵌…...
Vue 过滤器详解及 Vue 3 中的替代方案
Vue 过滤器详解及 Vue 3 中的替代方案 一、Vue 过滤器的核心概念与特性 Vue 过滤器(Filter)是 Vue 2.x 提供的用于数据格式化转换的机制,其核心设计理念是不修改原始数据,仅对显示层进行格式化处理。过滤器本质上是纯函数…...
告别手动复制粘贴:MeterSphere参数提取功能详解,让你的接口自动化测试效率翻倍
MeterSphere参数提取实战:构建动态接口测试链的三大高阶技巧 在持续集成环境中,接口自动化测试往往面临一个关键挑战:如何让不同接口之间实现数据动态传递?传统的手动复制粘贴不仅效率低下,更难以应对复杂业务场景。Me…...
唯品会数据采集API接口||电商API数据采集
唯品会数据采集,优先走合规第三方 API(个人 / 企业均可);企业可申请官方开放平台 API(仅限合作方)。一、合规路径选择(必看)1. 官方开放平台(企业级)入口&…...
避坑指南:单相有源逆变电路Simulink仿真中那些教科书没讲的细节(附反电动势设置模板)
单相有源逆变电路Simulink仿真实战:从参数配置到波形调试的工程化指南 第一次在Simulink里搭建单相有源逆变电路时,看着报错窗口弹出的"Algebraic loop detected"提示,我盯着屏幕足足愣了五分钟。教科书上明明写着"连接好器件…...
zteOnu:核心功能全解析与实战指南
zteOnu:核心功能全解析与实战指南 【免费下载链接】zteOnu 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 解锁高级配置:工厂模式激活指南 场景描述 网络管理员在配置中兴光猫时,发现普通用户权限无法修改关键网络参数&…...
Apollo自动驾驶系统C++核心模块实战解析——从源码到实现
1. Apollo自动驾驶系统架构全景解析 第一次打开Apollo源码仓库时,我完全被它庞大的代码量震撼到了——超过200万行C代码构成的自动驾驶系统,就像一座精密的机械钟表。但当你拆解它的核心模块后,会发现其架构设计处处体现着模块化和高内聚低耦…...
Loop:Mac窗口管理的优雅革命,开源免费的全新体验
Loop:Mac窗口管理的优雅革命,开源免费的全新体验 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 你是否曾在多窗口工作中迷失方向?Loop作为一款开源的macOS窗口管理工具,通过…...
