深度学习基础——卷积神经网络的基础模块

深度学习基础——卷积神经网络的基础模块

卷积神经网络(Convolutional Neural Networks,CNN)是深度学习中一种非常重要的神经网络结构,它在图像识别、图像分类、目标检测等领域取得了巨大成功。本文将介绍卷积神经网络的几个基础模块,包括批归一化、全局平均池化、瓶颈结构和沙漏结构。我们将首先对这些基础模块进行概述,然后介绍其概念及公式,并通过Python实现示例代码进行可视化展示。

1. 概述

1.1 批归一化(Batch Normalization)

批归一化是一种用于神经网络中的技术,旨在减少训练过程中的内部协变量偏移,并且可以作为一个正则化项来降低网络的过拟合程度。通过对每个小批量输入进行归一化,使得网络的输入更加稳定,加快收敛速度,同时提高网络的泛化能力。

1.2 全局平均池化(Global Average Pooling)

全局平均池化是一种用于卷积神经网络中的池化操作,与传统的最大池化或平均池化不同,全局平均池化将输入特征图的每个通道进行平均,得到一个数值作为该通道的输出,从而降低了特征图的维度,减少了参数数量。

1.3 瓶颈结构(Bottleneck Structure)

瓶颈结构是一种用于深度残差网络(Residual Networks,ResNet)中的设计,通过采用三层卷积的结构,先减少维度再增加维度,有效地降低了网络的计算量和参数数量,提高了网络的性能和效率。

1.4 沙漏结构(Hourglass Structure)

沙漏结构是一种用于人体姿态估计等任务中的网络结构,采用了递归的编码-解码结构,旨在提高网络的特征提取能力和重建精度,同时减少了网络的参数数量和计算量。

2. 概念及公式介绍

2.1 批归一化

批归一化的计算公式如下:

BN ( x ) = x − μ σ 2 + ϵ ∗ γ + β \text{BN}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} * \gamma + \beta BN(x)=σ2+ϵ xμγ+β

其中 x x x 是输入特征, μ \mu μ是输入特征的均值, σ \sigma σ 是输入特征的标准差, γ \gamma γ β \beta β是可学习的参数, ϵ \epsilon ϵ 是一个很小的数,用于防止分母为零。

2.2 全局平均池化

全局平均池化的计算公式如下:

GAP ( x ) = 1 H × W ∑ i = 1 H ∑ j = 1 W x i , j \text{GAP}(x) = \frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} x_{i,j} GAP(x)=H×W1i=1Hj=1Wxi,j

其中 H H H W W W分别是输入特征图的高度和宽度。

2.3 瓶颈结构

瓶颈结构的计算公式如下:

y = F 3 ( F 2 ( F 1 ( x ) ) ) y = F_3(F_2(F_1(x))) y=F3(F2(F1(x)))

其中 F 1 F_1 F1 F 2 F_2 F2 F 3 F_3 F3 分别表示三个卷积层,(x) 是输入特征。

2.4 沙漏结构

沙漏结构的计算公式如下:

y = F 2 ( F 1 ( x ) ) + x y = F_2(F_1(x)) + x y=F2(F1(x))+x

其中 (F_1) 和 (F_2) 分别表示编码和解码部分的卷积层,(x) 是输入特征。

3

. 用Python实现示例代码(结果可视化)

import torch
import torch.nn as nn
import torch.nn.functional as Fclass BasicBlock(nn.Module):expansion = 1def __init__(self, in_planes, planes, stride=1):super(BasicBlock, self).__init__()self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(planes)self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(planes)self.shortcut = nn.Sequential()if stride != 1 or in_planes != self.expansion*planes:self.shortcut = nn.Sequential(nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(self.expansion*planes))def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = self.bn2(self.conv2(out))out += self.shortcut(x)out = F.relu(out)return outclass Bottleneck(nn.Module):expansion = 4def __init__(self, in_planes, planes, stride=1):super(Bottleneck, self).__init__()self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, bias=False)self.bn1 = nn.BatchNorm2d(planes)self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(planes)self.conv3 = nn.Conv2d(planes, self.expansion*planes, kernel_size=1, bias=False)self.bn3 = nn.BatchNorm2d(self.expansion*planes)self.shortcut = nn.Sequential()if stride != 1 or in_planes != self.expansion*planes:self.shortcut = nn.Sequential(nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(self.expansion*planes))def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = F.relu(self.bn2(self.conv2(out)))out = self.bn3(self.conv3(out))out += self.shortcut(x)out = F.relu(out)return outclass GlobalAveragePooling(nn.Module):def __init__(self):super(GlobalAveragePooling, self).__init__()def forward(self, x):return F.avg_pool2d(x, x.size()[2:]).view(x.size(0), -1)class ResNet(nn.Module):def __init__(self, block, num_blocks, num_classes=10):super(ResNet, self).__init__()self.in_planes = 64self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(64)self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1)self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2)self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2)self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2)self.linear = nn.Linear(512*block.expansion, num_classes)def _make_layer(self, block, planes, num_blocks, stride):strides = [stride] + [1]*(num_blocks-1)layers = []for stride in strides:layers.append(block(self.in_planes, planes, stride))self.in_planes = planes * block.expansionreturn nn.Sequential(*layers)def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = self.layer1(out)out = self.layer2(out)out = self.layer3(out)out = self.layer4(out)out = F.avg_pool2d(out, 4)out = out.view(out.size(0), -1)out = self.linear(out)return outdef ResNet18():return ResNet(BasicBlock, [2,2,2,2])def ResNet50():return ResNet(Bottleneck, [3,4,6,3])# 计算网络参数量
def count_parameters(model):return sum(p.numel() for p in model.parameters() if p.requires_grad)def main():# 创建ResNet模型model = ResNet18()print("ResNet18:")print(model)# 计算参数量parameters = count_parameters(model)print("Parameters:", parameters)# 计算FLOPsdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = model.to(device)inputs = torch.randn(1, 3, 32, 32).to(device)flops = torch.profiler.profile(model, inputs=(inputs,), use_cuda=torch.cuda.is_available())print("FLOPs:", flops)if __name__ == "__main__":main()

4. 总结

本文介绍了卷积神经网络的几个基础模块,包括批归一化、全局平均池化、瓶颈结构和沙漏结构,并通过Python实现了示例代码进行了可视化展示。这些基础模块在深度学习中起着重要的作用,能够提高网络的性能和效率,为各种计算机视觉任务提供了有力的支持。

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

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

相关文章

MYSQL之增删改查(中)

前言: 以下是MySQL最基本的增删改查语句,很多IT工作者都必须要会的命令,也 是IT行业面试最常考的知识点,由于是入门级基础命令,所有所有操作都建立在单表 上,未涉及多表操作。 4、“查”——之单表查询 My…

Gamba:将高斯溅射与Mamba结合用于单视图3D重建

Gamba: Marry Gaussian Splatting with Mamba for Single-View 3D Reconstruction Gamba:将高斯溅射与Mamba结合用于单视图3D重建 Qiuhong Shen11  Xuanyu Yi31 Zike Wu31  Pan Zhou2,42 Hanwang Zhang3,5 沈秋红 1 易轩宇 3 吴子可 3 潘周 2,4 2 张汉旺 3,5Shu…

C++11 新特性:多线程支持 - std::recursive_timed_mutex

std::recursive_timed_mutex允许同一线程多次获取锁,并提供了超时功能。 这种锁特别适合用在递归函数中,或者当一个操作可能在同一线程内多次尝试获取同一锁时使用。 与std::timed_mutex一样,std::recursive_timed_mutex也提供了try_lock_f…

C语言开源库iniparser解析ini文件

1 ini文件介绍 INI(Initialization File)文件是一种简单直观的数据存储格式,常用于配置应用程序的初始化设置。这种文件通常包含若干个节(section)和键值对(key-value pairs)。INI文件的每一部…

Spring AOP(面向切面编程)

1.Spring AOP 简介 1.1 AOP概述 AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程, 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是Spring框架中的一个重要内容,是函数式编程的一…

FPGA Quartus IP核 打开使用

两种Quartus版本下的IP核,从使用者的角度来看仅仅是配置界面不同,在参数设置和使用方法上基本一致。本文以“MegaWizard Plug-In Manager”中的FIR Compiler IP核使用为例。 Quartus的FIR IP核属于收费IP,如果是个人学习使用需要对IP核单独破…

linux设备树-of_parse_phandle_with_args

1.设备树实例 interrupt-controller1 { compatible "vendor,gic"; #interrupt-cells <2>; interrupt-controller; reg <0x01 0x1000>; }; deviceA { compatible "vendor,device-a"; reg <0x02 0x100>; interrupts <&interr…

C++ 深入理解 继承

本篇文章将谈谈一下几个问题&#xff1a; 1.基类和派生类对象赋值转换 2.继承中的作用域 3.派生类的默认成员函数 4.复杂的菱形继承及菱形虚拟继承 5.其他 1.基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切…

【电控笔记2.5】位置闭环回路设计

总结 List item 位置控制器 加入前馈 总结

SpringBoot基于JavaWeb的菜鸟驿站快递管理系统ssm

前端&#xff1a;vue.jsElementUI 编程语言: java 框架&#xff1a; ssm/springboot 详细技术&#xff1a;springboot springbootvueMYSQLMAVEN 数据库: mysql5.7 数据库工具&#xff1a;Navicat/SQLyog都可以 ide工具&#xff1a;IDEA 或者eclipse 对菜鸟驿站快递管理系统设计…

会议文字记录工具【钉钉闪记】

当开会时&#xff0c;需要文字记录会议内容&#xff0c;但是打字又慢&#xff0c;可以使用钉钉闪记。 钉钉工作台直接搜索-钉钉闪记

011 springboot整合mybatis-plus 首页加载热商品food评分前8的食物

文章目录 ConfigRegistCenter.javaMybatisplusConfig.javaRedisConfig.javaFoodController.javaFood.javaJwtInterceptor.javaFoodMapper.javaIFoodService.javaFoodServiceImpl.javaJwtUtil.javaServerResult.javaServletInitializer.javaSpringbootLoginApplication.javafood…

ADSP-21479的开发详解九(CCES开发详解)

硬件准备 ADSP-21479EVB开发板&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id38007…

js的map函数

在JavaScript中&#xff0c;map() 是一个数组方法&#xff0c;它创建一个新数组&#xff0c;其结果是该数组中的每个元素都调用一个提供的函数后的返回值。这个方法不会改变原数组。 map() 方法的基本语法如下&#xff1a; javascriptarray.map(function(currentValue, index,…

【PythonCode】力扣Leetcode16~20题Python版

【PythonCode】力扣Leetcode16~20题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C…

React【Day4下+5】

环境搭建 使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 Redux状态管理 - reduxjs/toolkit 、 react-redux路由 - react-router-dom时间处理 - dayjsclass类名处理 - classnames移动端组件库 - antd-mobile请求插件 - axios 配置别名路径 1. 背景知识…

【Linux 进程间通信】管道

文章目录 1.System V 标准介绍2.进程间通信的方式&#xff1f;3.管道&#xff08;匿名管道&#xff09; 1.System V 标准介绍 ①&#x1f34e; System V 实际上就是一个标准&#xff08;“ 行业领头羊制定出来的专利 " &#xff09; 2.进程间通信的方式&#xff1f; …

java中常用的6条设计模式及其设计原则

在Java中&#xff0c;设计模式是用于解决特定上下文中常见问题的最佳实践解决方案&#xff0c;广泛用于编写易于维护、扩展和理解的代码。这里我将介绍六种常用的设计模式及其对应的设计原则&#xff1a; 1. 单例模式 (Singleton) 设计原则: 确保一个类只有一个实例&#xff…

linux下摄像头设置固定的设备名

目录 2.热插拔udev机制 3.设置udev的规则 1.查看usb ID 2. 查看usb设备的信息 3.编译规则 4.拓展 1.问题的出现 通过我之前的文章配置完摄像头的开机自启动之后我们会发现有的时候会出现启动不了的情况&#xff0c;通过实验我发现是摄像头的设备名发生了改变&#xff0c;…

ADSP-21479的开发详解五(AD1939 C Block-Based Talkthru 48 or 96 kHz)音频直通

硬件准备 ADSP-21479EVB开发板&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id38007…