【视频讲解】ResNet深度学习神经网络原理及其在图像分类中的应用|附Python代码

全文链接:https://tecdat.cn/?p=37134

原文出处:拓端数据部落公众号

分析师:Canglin Li

本文深入探讨了卷积层(Convolutional Layer)在深度学习框架中的核心作用与操作机制,并分析了其在特征提取、网络构建以及性能提升方面的独特优势。此外,本文还介绍了与卷积层紧密相关的激活函数、池化层以及ResNet深度神经网络的概念与应用,并通过实验验证了ResNet在复杂数据集上的高效分类性能。本文将通过视频讲解,展示ResNet原理,并结合如何用 Python中VGG模型、自定义ResNet模型、Capsule Network模型分析MNIST数据集实例的代码数据,为读者提供一套完整的实践数据分析流程。

1. 引言

在深度学习中,卷积层作为构建卷积神经网络(CNN)的基本单元,承担着从输入数据中提取并表征关键特征的重要任务。通过窗口滑动与滤波器计算两个关键操作,卷积层能够逐层递进地提取从低级到高级的特征表示,为后续的网络层提供丰富的信息基础。

2. 卷积层的基本原理

卷积层的核心在于卷积运算,该运算通过自定义大小的卷积核(滤波器)在输入数据上滑动,实现局部数据的加权求和。这一过程不仅模拟了生物视觉系统的处理机制,还使得网络能够捕捉到输入数据的空间结构特征。值得注意的是,随着网络层数的增加,卷积层能够迭代地提取出更为复杂、高级的特征表示,从而增强了网络的表征能力。

3. 激活函数与池化层

为了引入非线性因素并提升网络的泛化能力,卷积层后通常会接入激活函数。常用的激活函数包括ReLU、tanh和sigmoid等,它们各自具有不同的特性与适用范围。

此外,为了降低特征维度并保留关键信息,池化层(Pooling Layer)被广泛应用于卷积层之后。池化层通过将特征图划分为多个区域并取最大值或平均值来实现降维处理,从而减小了计算量并增强了特征的鲁棒性。

4. ResNet深度神经网络

ResNet(残差网络)作为一种创新的深度神经网络架构,在ImageNet等大规模图像识别竞赛中取得了显著的成绩。ResNet通过引入“shortcut connection”(残差连接)机制解决了深度神经网络训练中的梯度消失和梯度爆炸问题,使得网络能够训练得更深且更稳定。本文详细分析了ResNet的网络结构特点及其在不同层数版本中的具体实现方式,并强调了残差连接在保留原始特征和加速网络收敛方面的重要作用。

ResNet的网络结构图

伴随着深度神经网络的不断发展,ResNet同样延伸出了不同的版本,这里的版本指的是层数的不同,各种版本的具体结构下如图所示。

由图可知,各种ResNet的网络结构相差不大,不论是18层、34层、50层、101层还是152层。在网络的开始都是一个77的卷积层,然后是一个33的最大池化下采样,然后按照途图中的conv2_x、conv3_x、 conv4_x、conv5_x中的残差结构。最后再跟一个平均池化下采样和全连接层,sofmax作为输出。

COV2_x

这里需要注意,conv3_x,是3x3,128通道,也就是说经过conv2_x后得到的56x56,64通道,到conv3_x里面升维了,并且大小也变了,变成28x28了,这时候要注意一个问题,分支与主分支的结果就无法相加了,大小不一致,维度不一致,这是需要使用一个分支(如右图所示)。

5. Batch Normalization

批量归一化(Batch Normalization)作为深度学习领域的一项重要技术,通过对每一层网络的输入进行归一化处理来加速训练过程并提高模型性能。本文介绍了Batch Normalization的基本原理及其在ResNet中的实际应用位置(即放在卷积层与激活层之间),并强调了其对于缓解特征分布散乱问题、提升训练稳定性和收敛速度的重要作用。

真正的残差结构

建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias,所以说,我们实际上的残差网络块应该是如右图。

ResNet的优点

具体的优点如下:
(1)可以训练非常深的神经网络,避免了梯度消失问题,提高了模型的表达能力和性能。
(2)使用残差连接可以保留原始特征,使得网络的学习更加顺畅和稳定,进一步提高了模型的精度和泛化能力.
(3)训练时可以避免梯度消失和梯度爆炸问题,加速网络收敛。

6.实例分析

本项目使用了分类难度较大的数据集notMNIST(部分数据如左图),在训练集、测试集以及验证集的选择方面,本文在所有数据中随机选择50%作为训练集,30%作为验证集,剩下的20%作为测试集。

在参数设置层面,利用sgdm作为训练算法,最大迭代次数50次,每次进行73回运算,总运算3650次,设置学习率为0.01。

实验结果

在如上叙述的条件下,ResNet18对该数据集的分类结果如图所示。
ResNet18在该数据集上的分类准确率达94.00%,分类效果较好。

Python中VGG模型、自定义ResNet模型、Capsule Network模型分析MNIST数据集

数据集归一化:计算均值与标准差

在深度学习的数据预处理阶段,归一化是一个至关重要的步骤,它有助于提升模型的收敛速度和性能。归一化通常涉及计算数据集的均值(mean)和标准差(standard deviation, std),并将原始数据转换到具有零均值和单位标准差的范围内。以下代码段展示了如何对MNIST数据集进行归一化处理,并打印出归一化所需的均值和标准差。

import numpy as np# 加载数据集
trn_data = trn_data['arr_0'] / 255  # 将像素值归一化到[0, 1]区间# 计算均值和标准差
data_mean = trn_data.mean()
data_std = trn_data.std()# 打印结果
print(f'Mean: {data_mean}')
print(f'Std: {data_std}')# 接下来,我们可以使用这些均值和标准差来归一化训练集和测试集,以便后续模型的训练与评估。

模型加载与评估

在深度学习中,模型的选择与加载是实验过程中的重要环节。以下部分展示了如何加载预训练的VGG模型、自定义ResNet模型、Capsule Network模型,以及它们的集成模型,并验证模型是否成功加载。

VGG模型

from fastai.vision.all import *# 假设databunch已正确定义并包含训练与验证数据
learn = Learner(databunch, VGG(), metrics=accuracy)
learn.load('vgg_model_with_norm')  # 加载预训练模型
print('Model was loaded')

ResNet模型

# 假设MyResNet是基于ResNet的自定义模型,BasicBlock为残差块类型
learn = Learner(databunch, MyResNet(BasicBlock, [2, 2, 2, 2]), metrics=accuracy)
learn.load('resnet_model_with_norm')  # 加载预训练模型
print('Model was loaded')

VGG与ResNet-18的集成
集成模型通过结合多个单一模型的预测结果来提高整体性能。具体实现细节取决于集成策略,但这里仅展示集成模型的加载示意。

Capsule Network模型
Capsule Network是一种较新的网络架构,旨在通过胶囊(capsules)来捕捉数据的空间层次关系。

# 假设CapsNet和caps_accuracy, caps_loss已正确定义
learn = Learner(databunch, CapsNet(), metrics=caps_accuracy, loss_func=caps_loss)
learn.load('caps_net_model_with_norm')  # 加载预训练模型
print('Model was loaded')

VGG与Capsule Network的集成
集成VGG与Capsule Network的结果表明,其性能可能不如VGG与ResNet的集成。这可能是由于不同模型架构之间的互补性差异所导致的。


learn = Learner(databunch, VGG_Caps(), metrics=vgg_caps_accuracy, loss_func=vgg_caps_loss)
vgg_capsnet_load_model(learn, 'vgg_model_with_norm', 'caps_net_model_with_norm')

关于分析师

这里感谢Canglin Li对本文做出的贡献。他是拓端的分析师,在信息与计算科学领域拥有深厚背景,熟练掌握多种编程语言和技术工具,特别是在Matlab和Java方面展现出卓越的能力。他的专业领域广泛涉及深度学习等前沿技术。

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

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

相关文章

近期代码报错解决笔记

1.TypeError: ‘bool’ object is not callable 想print("Type of head:", type(entity_emb[head])),结果报如下错误: 源代码: 因为 print 仍然被当作一个布尔值处理,而不是作为函数调用。这个问题的根源在于 print …

Android SurfaceFlinger——纹理的绘制流程(二十八)

在系统开机动画的播放流程中,会从给定的资源文件中加载纹理数据并初始化一个 OpenGL 纹理对象,这里我们就来解析软件模拟纹理的绘制流程。 一、纹理概述 在 Android 的 SurfaceFlinger 系统组件中,纹理(Texture)是一个核心概念,特别是在涉及到图形渲染和显示的过程中。 …

关于TS(typescript)的理论知识

关于TS(typescript)的理论知识 TypeScript 是一种由微软开发的开源编程语言,它是 JavaScript 的一个超集,添加了可选的静态类型和基于类的面向对象编程。TypeScript 最终会被编译成纯 JavaScript 代码,以便在任何支持 …

Adobe Photoshop(Ps)安装包软件下载

一、Adobe Photoshop简介 Adobe Photoshop(简称PS)是由Adobe Systems公司开发的图像处理软件,它是一款集图像扫描、编辑修改、图像制作、广告创意、图像输入与输出于一体的图形图像处理软件。广泛应用于专业测评、平面设计、广告摄影、影像创…

MongoDB多数据源配置与切换

在MongoDB中配置和使用多数据源主要涉及以下几个步骤: 定义多个数据源的配置: 在应用程序的配置文件中,定义多个MongoDB的数据源,例如在Spring Boot中可以通过application.yml或application.properties文件进行配置。 创建多个Mo…

学习小型gpt源码(自用)

数据集构建_哔哩哔哩_bilibili (b站上有一系列课,从数据处理到模型构建和训练使用) 什么是batch? 为什么一个batch内的句子要一样长? 不同batch的长度可以不一样,但是同一个batch内长度一样!…

【MySQL进阶之路 | 高级篇】数据操作类型的角度理解共享锁,排他锁

1. 从数据操作的类型划分:读锁,写锁 对于数据库并发事务的读-读情况并不会引起什么问题。对于写-写,读-写操作或写-写操作这些情况可能会引起一些问题,需要使用MVCC或者加锁的方式来解决它们。在使用加锁的方式解决问题时&#x…

Vue3点击按钮实现跳转页面并携带参数

前提&#xff1a;有完整的路由规则 1.源页面 <template><div><h1>源页面</h1><!--通过js代码跳转--><template #default"scope"><button click"toTargetView(scope.row)">点击跳转携带参数</button><…

动态超参数优化:在Mojo模型中实现自定义搜索的艺术

动态超参数优化&#xff1a;在Mojo模型中实现自定义搜索的艺术 在机器学习领域&#xff0c;超参数的调整是提高模型性能的关键步骤。Mojo模型&#xff0c;作为机器学习模型的泛称&#xff0c;通常需要通过调整超参数来达到最优状态。然而&#xff0c;传统的超参数搜索方法往往…

3.3-LSTM的改进

文章目录 1改进点1.1多层化1.2 dropout1.2.1具体概念1.2.2应该插入到LSTM模型的哪里 1.3权重共享 2改进之后的LSTMLM的代码实现2.1初始化2.2前向计算2.3反向传播 3相应的学习代码的实现4总结 1改进点 1.1多层化 加深神经网络的层数往往能够学习更复杂的模式&#xff1b;因此这…

NOI大纲——普及组——素数筛法

素数筛的进化史 1.最为基础的筛法——试除法 时间复杂度 O ( n 2 ) O(n^2) O(n2) int a[10000],tot0,n; for (int i2;i<n;i){bool flagfalse;for (int j2;j<i;j){if (i%j0)flagtrue;}if (flagfalse){a[tot]i;tot;} } for (int i0;i<tot;i){cout<<a[i]<&l…

【0-1 架构问题集合】

常见问题 大数据量高并发情况下如何更新缓存二级目录三级目录 大数据量高并发情况下如何更新缓存 首先是查询的时候&#xff0c;一般先查询缓存&#xff0c;在查询数据库&#xff0c;同步的去更新缓存但是都是异步去更新&#xff0c;引入消息队列MQ 本质是个队列&#xff0c;F…

JVM之经典垃圾收集器

目录 Serial收集 ParNew收集器 Parallel Scavenge收集器 Serial Old收集器 Parallel Old收集器 CMS垃圾收集器&#xff08;重点&#xff09;&#xff1a; Garbage First 收集器&#xff08;重点&#xff09;&#xff1a; Serial收集 使用一个处理器或一条收集线程去完成垃…

利用换元法计算积分的常见题型(考研高数复习)

考研中常见的几种换元法积分计算题 (1)被积式仅包含一个根式&#xff1a;根号下为有 a a a 和 x x x 的平方和/平方差 此种类型的积分题型&#xff0c;可以通过构造单个锐角大小为 t t t 的直角三角形&#xff0c;利用勾股定理和三角函数进行代换。 平方和的情况 形如 ∫…

Java高级工程师应该怎样准备笔试?

哈哈&#xff0c;大早上&#xff0c;有个粉丝问&#xff1a;Java高级工程师应该怎样准备笔试&#xff1f; 这问题还真是小意思啊。Java高级工程师的笔试怎么准备&#xff1f;你问得好&#xff01;咱们混迹江湖这么久&#xff0c;什么风浪没见过&#xff0c;面试笔试这些东西&a…

Java:swagger/knife4j接口返回的json数据中文显示乱码问号???

目录 问题描述问题解决参考文章 问题描述 正常接口的中文返回是正确的 而只要发生异常处理&#xff0c;就会使用全局统一异常处理&#xff0c;输出包含中文字符的json字符串&#xff0c;发现&#xff0c;全都变成了问号?????? /*** 统一异常处理*/ ControllerAdvice Sl…

java学习----注释

简介 override介绍&#xff1a; 添加了这个注释其实是做了个语法校验的作用 override定义 Deprecated介绍&#xff1a; 源码&#xff1a; SuppressWarnings介绍&#xff1a; 源码&#xff1a; 元注解 Retention注解介绍&#xff1a; 案列 Target注解介绍&#xff1a; Documente…

LLM - 理解 Transformer 的位置编码 sin cos 的作用与原理

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140697827 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Transformer 模型中的位置编码是关键技术,通过为每个词嵌入向量添加位…

数据库第五次作业

1. 触发器 建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 建立触发器&#xff0c;实现功能:客户修改订单&#xff0c;商品…

【微软蓝屏】微软Windows蓝屏问题汇总与应对解决策略

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…