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

news2024/9/21 0:40:08

全文链接: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.coloradmin.cn/o/1953349.html

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

相关文章

学习记录701@org.hibernate.MappingException: No Dialect mapping for JDBC

使用spring data jpa 时报错:javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 0。 但是在数据库中sql是可以执行的。 我是用的是原生查询: Query query entityManager.createNativeQuer…

ElasticSearch(七)— 相关性检索和组合查询

一、 相关性评分 全文检索与数据库查询的一个显著区别, 就是它并不一定会根据查询条件 做完全精确的匹配。除了模糊查询以外,全文检索还会根据查询条件给文档的相关性打分并排序,将那些与查询条件相关性高的文档排在最前面。 相关性( Relev…

计算机二级题--结构体及链表 章节

之前写的有结构体全部的知识点,这一篇主要针对计算机二级真题的整理。 需要备考计算机二级的小伙伴们先收藏起来吧。整理不易,不过有帮助记得点赞哦 高频考点(容易出错,附有例题) 1.结构体传参,传值的区…

PyQt ERROR:ModuleNotFoundError: No module named ‘numpy‘

ERROR:ModuleNotFoundError: No module named numpy Solution:打开cmd,输入指令下载numpy库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy//或者尝试这个指令 pip install numpy

C++学习 const相关

🤔 今天回顾C 时候 发现遇到关于const的变量类型(底层const 顶层const 常量指针 指针常量 常量引用…)又有点懵懵的了,然后又仔细复盘了一下 最后整理了一下 也方便记忆 文章目录 引入顶层const和底层const顶层const底层const 总结…

[Windows CMD] 查看网络配置 ipconfig

ipconfig 是一个网络命令工具,用于显示所有适配器(网络接口)的 IPv4 和 IPv6 配置信息。这个命令在 Windows 操作系统中非常常用,也存在于其他一些基于 IP 的网络系统中,如 macOS 和 Linux(在这些系统中通常…

自动曝光Flicker现象分析

1、sensor Flicker现象 相机输出画面会出现频闪,尤其是对着日光灯管场景,画面中有水波纹渐变或者阴影纹路,如下图所示。 所展示的现象为: 1、同一帧的不同行的亮度各不相同,存在亮暗变化的条纹; 2、不同…

睿抗题解集

睿抗 2023国赛RC-u1 睿抗,启动!RC-u2 桌游猜谜RC-u3 兰州拉面派餐系统RC-u4 拆积木RC-u5 栈与数组总结2023国赛 RC-u1 睿抗,启动! #include<bits/stdc++.h> using namespace std; const int N=1e6+10; char a[26],b[26]; string s;int change(int op,int idx){if(op…

Docker安装oracle19c

文章目录 Docker安装oracle19c1. 拉取镜像2. 创建目录并赋权3. 构建容器并启动4. 查看日志5. 登录docker容器里面6. 登录sqlplus 创建PDB用户7. 查看show pdbs7. 切换数据库8. 创建用户9. 授权10. 使用navicat连接11. 参考和感谢 Docker安装oracle19c 1. 拉取镜像 docker pul…

SQLite3(3):Qt中使用SQLite3

目录 一、前言 二、Qt相关类 2.1 QSqlDatabase 2.2 QSqlQuery 2.3 QSqlQueryModel 三、Qt基本应用实现 3.1 mainwindow.h 3.2 mainwindow.cpp 3.3 应用界面 四、总结 一、前言 本文进行在Qt中实现SQLite3的基本功能实现演示。 在Qt中不论我们连接的何种类型的关系型…

尝鲜免费文生视频!【智谱清影】

&#x1f680;&#x1f680;震撼发布&#xff01;你还在为制作短视频头疼吗&#xff1f;耗时太长&#xff1f;技术门槛高&#xff1f;别怕&#xff0c;AI生成视频神器——清影&#xff08;Ying&#xff09;来啦&#xff01;只需30秒&#xff0c;就能get到一段6秒的炫酷视频&…

vue2实现el-tab的内容框右击关闭除了首页的其他所有页面

效果图 <!-- 右键功能 --><div v-show"contextMenuVisible"><ul :style"{left:menuLeft px,top:menuToppx}" class"contextmenu"><li><el-button type"text" click"closeAll" size"mini&qu…

分类预测 | Matlab实现CNN-LSSVM多特征故障诊断/分类预测

分类预测 | Matlab实现CNN-LSSVM多特征故障诊断/分类预测 目录 分类预测 | Matlab实现CNN-LSSVM多特征故障诊断/分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机故障诊断/分类预测&#xff08;Matlab完…

springboot高等职业院校实验室信息管理-计算机毕业设计源码24015

摘 要 本文旨在设计并实现一个基于Spring Boot框架的高等职业院校实验室信息管理系统。该系统采用B/S体系结构&#xff0c;以MySQL作为数据库管理平台&#xff0c;结合前端技术如HTML、CSS和JQuery&#xff0c;为用户提供一个功能全面、操作便捷的实验室信息管理平台。 在系统设…

Keras入门:一维线性回归问题

目录 一、一维变量线性回归 1. 数据生成 2. 建立训练模型 3. 作图 4. 完整代码 一、一维变量线性回归 1. 数据生成 import keras import numpy as np import matplotlib.pyplot as plt #matplotlib inline xnp.linspace(0, 100, 30) #0~100之间&#xff0c;生成30个数 y…

xLua | xLua Framework | 2 加载

0. 基础 0.1 不同加载模式 测试用 编辑器模式&#xff1b;打包模式&#xff1b;更新模式 public enum GameMode {EditorMode,PackageBundle,UpdateMode, } 0.2 加载资源步骤与接口 private void LoadAsset(string assetName, Action<Object> action) {if (AppConst.G…

vue3使用递归组件渲染层级结构

先看看是不是你想要的&#xff1a; 当有层级去渲染的时候&#xff0c;嵌套的层级不明确&#xff0c;这时只能通过递归组件去渲染。 数据如下&#xff1a; 通过判断subCatalog这个字段的长度是否大于0来确定是否有下级。 上代码&#xff1a;(代码是使用uniapp开发的&#xff0…

visual studio 问题总结

一. Visual Studio: 使用简体中文&#xff08;GB2312&#xff09;编码加载文件, 有些字节已用Unicode替换字符更换 解决方法&#xff1a;vs 工具-》选项-》文本编辑器

24年第三届钉钉杯大学生大数据挑战赛浅析

需要完整资料&#xff0c;请关注WX&#xff1a;“小何数模”&#xff01; 本次钉钉杯大数据挑战赛的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&#xf…

【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator

ERROR: Failed building wheel for jupyter-nbextensions-configurator 目录 ERROR: Failed building wheel for jupyter-nbextensions-configurator 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我…