【视频讲解】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.mfbz.cn/a/870319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DLMS/COSEM中公开密钥算法的使用_椭圆曲线加密法

1.概述 椭圆曲线密码涉及有限域上的椭圆曲线上的算术运算。椭圆曲线可以定义在任何数字域上(实数、整数、复数),但在密码学中,椭圆曲线最常用于有限素数域。 素数域上的椭圆曲线由一组实数(x, y)组成,满足以下等式: 方程的所有解的集合构成…

ForCloud赢战攻防 无惧突发0day漏洞 ForCloud虚实结合快速处置

攻防演练前夕,亚信安全威胁情报中心监测到一个存在于Nacos Derby中的0day漏洞,漏洞利用代码为公开状态,攻击者利用此漏洞可在目标服务器上执行任意代码。 造成的破坏程度?你可能正在使用! Nacos(Dynamic …

【MySQL】记录MySQL加载数据(LOAD DATA)

MySQL LOAD DATA 一、背景二、模拟生成用户信息三、加载到mysql表3.1、建表语句3.2 加载数据3.3、查看结果 一、背景 现在有个需求是将用户信息存入student.data文件中,在现在load到数据库中 二、模拟生成用户信息 假设用户信息,包含姓名,…

ITK-中值滤波

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 中值滤波原理 中值滤波是一种常用的非线性滤波技术,用于去除图像中的噪声,特别是椒盐噪声和脉冲噪声。它…

15现代循环神经网络—GRU与LSTM

目录 1.门控循环单元 GRU关注一个序列门候选隐状态(candidate hidden state)隐状态总结从零开始代码实现代码简洁实现2.长短期记忆网络 LSTM门候选记忆单元(candidate memory cell)记忆单元隐状态代码1.门控循环单元 GRU GRU 是最近几年提出来的,在 LSTM 之后,是一个稍微简…

科普文:后端性能优化的实战小结

一、背景与效果 ICBU的核心沟通场景有了10年的“积累”,核心场景的界面响应耗时被拉的越来越长,也让性能优化工作提上了日程,先说结论,经过这一波前后端齐心协力的优化努力,两个核心界面90分位的数据,FCP平…

删除的视频怎样才能恢复?详尽指南

在日常生活中,我们有时会不小心删除一些重要的视频文件,或者在整理存储空间时不慎丢失了珍贵的记忆片段。这时候,我们可以通过一些数据恢复工具和技巧,找回这些被删除的视频。本文将详细介绍几种常见且有效的视频恢复方法&#xf…

C#,.NET常见算法

1.递归算法 1.1.C#递归算法计算阶乘的方法 using System;namespace C_Sharp_Example {public class Program{/// <summary>/// 阶乘&#xff1a;一个正整数的阶乘Factorial是所有小于以及等于该数的正整数的积&#xff0c;0的阶乘是1&#xff0c;n的阶乘是n&#xff0…

《操作系统》(学习笔记)(王道)

一、计算机系统概述 1.1 操作系统的基本概念 1.1.1 操作系统的概念 1.1.2 操作系统的特征 1.1.3 操作系统的目标和功能 1.2 操作系统的发展与分类 1.2.1 手工操作阶段&#xff08;此阶段无操作系统&#xff09; 1.2.2 批处理阶段&#xff08;操作系统开始出现&#xff0…

前端知识--前端访问后端技术Ajax及框架Axios

一、异步数据请求技术----Ajax Ajax是前端访问后端的技术&#xff0c;为异步请求&#xff08;不刷新页面&#xff0c;请求数据&#xff0c;只更新局部数据&#xff09;。 例如&#xff1a;在京东网站中搜索电脑&#xff0c;就会出现一些联想搜索&#xff0c;但此时页面并没有…

WEB开发-HTTP认证

1 需求 2 接口 3 示例 HTTP Authentication&#xff08;HTTP认证&#xff09;是Web服务器用来验证客户端请求的一种机制。它通常用于保护需要用户凭据&#xff08;如用户名和密码&#xff09;才能访问的资源。HTTP认证有几种不同的分类或方法&#xff0c;以下是其中一些主要的分…

手机怎么设置不同的ip地址

在数字化日益深入的今天&#xff0c;智能手机已成为我们生活、工作和学习中不可或缺的设备。然而&#xff0c;随着网络应用的广泛和深入&#xff0c;我们有时需要为手机设置不同的IP地址来满足特定需求。比如&#xff0c;避免网络限制、提高网络安全、或者进行网络测试等。本文…

解决R语言找不到系统库导致的报错

1、基本需知 1.1、系统库 系统库&#xff08;System library&#xff09;是一组预先编写和编译好的软件模块集合&#xff0c;用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供&#xff0c;并且在系统安装过程中被预装或者用户可以额…

分享 2 个 .NET EF 6 只更新某些字段的方法

前言 EF 更新数据时&#xff0c;通常情况下&#xff0c;是更新全部字段的&#xff0c;但实际业务中&#xff0c;更新全部字段的情况其实很少&#xff0c;一般都是修改其中某些字段&#xff0c;所以为了实现这个目标&#xff0c;很多程序员通常会这样作&#xff1a; 先从数据库…

数据治理之“财务一张表”

前言 信息技术的发展&#xff0c;伴随企业业务系统的纷纷建设&#xff0c;提升业务处理效率的同时&#xff0c;也将企业的整体主价值链流程分成了一段一段的业务子流程&#xff0c;很多情况下存在数据上报延迟、业务协作不顺畅、计划反馈不及时、库存积压占资多……都可以从数据…

力扣94题(java语言)

题目 思路 使用一个栈来模拟递归的过程&#xff0c;以非递归的方式完成中序遍历(使用栈可以避免递归调用的空间消耗)。 遍历顺序步骤&#xff1a; 遍历左子树访问根节点遍历右子树 package algorithm_leetcode;import java.util.ArrayList; import java.util.List; import…

VirtualBox 安装Centos 7 避坑指南 SSH连不上 镜像失效 静态网络配置等

背景 几乎每次安装Centos 7 时&#xff0c;都会遇到各种各样的问题&#xff0c;毕竟每次安装动辄就是半年几年&#xff0c;几乎都是在换工作时&#xff0c;有了新机器才会倒腾一次&#xff0c;时间久远&#xff0c;就会忘记一些细节&#xff0c;这次整理一下&#xff0c;避免以…

C语言 | Leetcode C语言题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; int hIndex(int* citations, int citationsSize) {int left 0, right citationsSize - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > citationsSize - mid) {right mid - 1;} else {left mi…

Nacos 2.x 新增 grpc 端口,Nginx 需要配置TCP端口转发的注意事项

Nacos 2.x 开始&#xff0c;最大的变化就是端口。在默认主端口 8848 之外又新增了三个端口&#xff0c;新增端口是在配置的主端口 server.port 的基础上&#xff0c;进行一定偏移量自动生成。 8848&#xff08;主端口&#xff0c;默认8848&#xff09;web页面端口及相关http接口…

Spring Security认证授权介绍

一、目标 真正控制系统权限的&#xff0c;需要引入专门的安全框架才行&#xff0c;所以&#xff0c;我们今天重点来学习Spring家族中的一员Spring Security安全框架。最终呢&#xff0c;我们会使用Spring Security框架来控制养老项目的后台管理系统 能够熟悉常见的权限控制的方…