卷积神经网络各层介绍

目录

1 卷积层

2 BN层

3 激活层

3.1 ReLU(Rectified Linear Unit)

3.2 sigmoid

3.3 tanh(双曲正切)

3.4 Softmax

4 池化层

5 全连接层

6 模型例子


1 卷积层

        卷积是使用一个卷积核(滤波器)对矩阵进行内积(相乘后求和)的操作,通过该操作可以获得输入矩阵(图片)的重要信息,在此基础上,更深层次的卷积操作会获得更重要的特征信息。

一个 padding = 1, stride = 2,kernel size = 3 的单通道卷积过程示意图如下:

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

参数:

  • in_channels (int): 输入通道数,即输入图像的深度。例如,对于 RGB 图像,这个值通常为 3。
  • out_channels (int): 输出通道数,即卷积核的数量。每个卷积核会提取一个特征图。
  • kernel_size (int 或 tuple): 卷积核的大小。如果是正方形,可以只用一个整数表示,例如 3 表示 3x3 的卷积核。
  • stride (int 或 tuple, 可选): 卷积操作的步长,默认为 1。
  • padding (int 或 tuple, 可选): 输入的每一边要填充的像素数量,默认为 0。
  • dilation (空洞卷积,int 或 tuple, 可选): 卷积核元素之间的间距,默认为 1。
  • groups (分组卷积,int, 可选): 控制输入和输出之间的连接方式,默认为 1。groups 值大于 1 时,相当于对输入进行组卷积。
  • bias (bool, 可选): 如果 True,添加一个学习偏置,默认为 True。
  • padding_mode (str, 可选): 填充模式,可以是 'zeros'(默认,零填充)、'reflect'(反射填充,矩阵边缘为对称轴)、'replicate'(复制矩阵边缘的值) 或 'circular'。

卷积操作输出图片大小的计算公式:

多通道输入

输入图片是多通道的,则卷积核对应也是多通道(多维)的,之后对卷积结果进行求和得到一个二维矩阵

参考文档

卷积操作原理解析与nn.Conv2d用法详解icon-default.png?t=O83Ahttps://blog.csdn.net/sazass/article/details/116790155

PyTorch Conv2d中的四种填充模式解析icon-default.png?t=O83Ahttps://www.jianshu.com/p/a6da4ad8e8e7

2 BN层

BN层的作用

  • 加快网络的训练和收敛的速度
  • 控制梯度爆炸防止梯度消失
  • 防止过拟合(存在争议)

注:BN层一般接在线性层和卷积层后面

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  • num_features: 整数,表示输入特征的数量,即输入通道数。例如,对于一个三通道的RGB图像,num_features 应该设置为3。对于卷积层的输出,这个值通常是卷积核的数量。
  • eps: 浮点数,一个非常小的值,用于数值稳定性。默认值为1e-5。在计算方差时,会加上这个值以避免除以零的情况。
  • momentum: 浮点数,动量因子,用于更新运行均值和方差。默认值为0.1。动量可以帮助稳定均值和方差的估计,特别是在小批量数据的情况下。
  • affine: 布尔值,是否使用可学习的仿射变换参数。如果设置为 True(默认值),则会学习缩放和平移参数。如果设置为 False,则不使用这些参数,仅进行标准化处理。

参考文档

神经网络中BN层的原理与作用icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_42080490/article/details/108849715

BN(Batch Normalization)层原理与作用icon-default.png?t=O83Ahttps://blog.csdn.net/chaipp0607/article/details/112853861

3 激活层

        为什么要用激活函数?激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

下图是使用sigmoid激活函数去逼近一个非线性函数

下图中不同的参数c、b、w构成的sigmoid函数(这里就这样表述吧)也不同

如下图所示,不同的sigmoid函数(蓝色显示)可以构成一个新的sigmoid函数(红色显示)

下图x是输入,y是输出,函数是我们训练的模型,其它的是训练得到的参数

3.1 ReLU(Rectified Linear Unit)

  • 公式:
  • 优点:
    • 计算简单,梯度下降时计算效率高。
    • 在正域内不会产生梯度消失问题。
  • 缺点:
    • 负域内的梯度为0,可能导致“神经元死亡”现象。
    • 不是以0为中心的输出。

3.2 sigmoid

  • 公式
  • 优点:
    • 求导容易,输出范围在0到1之间,可以作为概率解释。
  • 缺点:
    • 容易产生梯度消失问题。
    • 计算复杂度较高。

3.3 tanh(双曲正切)

  • 公式
  • 优点:
    • 输出范围在-1到1之间,适合作为初始化权重。
  • 缺点:
    • 同样容易产生梯度消失问题。
    • 计算复杂度比sigmoid高。

3.4 Softmax

公式:

  • 优点:
    • 概率解释性:Softmax函数将输入向量转换为一个概率分布,其中每个元素的值都在0到1之间,且所有元素的总和为1。这种特性使得Softmax函数在多分类问题中特别有用,因为可以直接将输出解释为属于各个类别的概率。
    • 非负性:Softmax函数的输出值介于0和1之间,确保了概率的非负性。
  • 缺点:
    • 易造成梯度消失:当输入值非常大或非常小时,Softmax函数的梯度可能会变得非常小,导致梯度消失问题。这会影响神经网络的训练效果,使得网络难以学习到有效的特征。
    • 幂运算复杂:Softmax函数涉及指数运算,这会增加训练时间。
    • 输出非零均值:Softmax函数的输出是非零均值的,这可能会导致后续层的神经元接收到的输入也是非零均值的,从而影响神经网络的收敛速度。

参考文档

激活函数 - 维基百科,自由的百科全书icon-default.png?t=O83Ahttps://zh.wikipedia.org/wiki/%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0盘点当前最流行的激活函数及选择经验icon-default.png?t=O83Ahttp://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E7%BB%BC%E8%BF%B0%E7%B1%BB/%E7%9B%98%E7%82%B9%E5%BD%93%E5%89%8D%E6%9C%80%E6%B5%81%E8%A1%8C%E7%9A%84%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0%E5%8F%8A%E9%80%89%E6%8B%A9%E7%BB%8F%E9%AA%8C/

4 池化层

        人类用眼睛识别物体时不是把眼睛所看到的所有信息全部传递入大脑进行处理,而是有重点的选择部分信息进行处理。池化操作也是类似。池化可以缩减模型的大小,减少冗余的信息,提高神经网络运算效率并防止过拟合,常用的池化有最大池化、平均池化。

        池化层的具体操作与卷积层类似,都是利用一个窗口在图像上滑动,它的参数包括 filter size (n) ,stride (s) 和跳跃步长 (s)。一般情况下设置 n=s,即每( n×n )个像素提取一个像素,这样图像尺寸为原先的 1/n。

最大池化,选择某个矩阵中的最大值;平均池化,取矩阵中所有值的平均值

参考文档

卷积神经网络中的池化(Pooling)层icon-default.png?t=O83Ahttps://0809zheng.github.io/2021/07/02/pool.html

5 全连接层

        全连接层(fully connected layers,FC)是神经网络的一种基本层类型,通常位于网络的最后几层,用于分类任务的输出层。在全连接层中,输入向量通过一个权重矩阵进行线性变换,然后加上一个偏置项,最后通过激活函数(如ReLU、Sigmoid、Tanh等)进行非线性变换。通常会将全连接层的维度设为类别数量或通过Softmax函数输出每个类别的概率分布(有时全连接层不需要加入激活函数,如使用CrossEntropyLoss损失函数计算损失时会用到Softmax激活函数),从而实现对输入数据的分类。另一种说法是,全连接可以是卷积核大小为输入特征大小的卷积运算,卷积的结果为一个节点,对应全连接层的一个点。如输入特征是3x3x5,那么需要一个3x3x5的卷积核进行运算,得到一个数值,对应全连接的一个神经元。

我们现在的任务是区别下面的这张图片是不是猫

假设猫有以下几个特征

红色的神经元表示这些被找到了(激活了),然后通过全连接将这些特征拼接起来,即卷积获取的是局部特征,全连接就是把这些局部特征连接起来。

参考文档

CNN 入门讲解:什么是全连接层(Fully Connected Layer)?icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/33841176

6 模型例子

import torch.nnclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = torch.nn.Sequential(# 5x5卷积核torch.nn.Conv2d(1, 10, kernel_size=5),# 激活函数torch.nn.ReLU(),# 最大池化torch.nn.MaxPool2d(kernel_size=2),)self.conv2 = torch.nn.Sequential(torch.nn.Conv2d(10, 20, kernel_size=5),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size=2),)self.fc = torch.nn.Sequential(#输入320,输出50的线性层torch.nn.Linear(320, 50),torch.nn.Linear(50, 10)# 未加入激活函数,计算损失时,CrossEntropyLoss损失函数会用到Softmax激活函数)def forward(self, x):batch_size = x.size(0)x = self.conv1(x)  # 一层卷积层,一层池化层,一层激活层(图是先卷积后激活再池化,差别不大)x = self.conv2(x)  # 再来一次x = x.view(batch_size, -1)  # flatten 变成全连接网络需要的输入 (batch, 20,4,4) ==> (batch,320), -1 此处自动算出的是320x = self.fc(x)return x  # 最后输出的是维度为10的,也就是(对应数学符号的0~9)

比如输入一个手写数字“5”的图像,它的维度为(batch,1,28,28)即单通道高宽分别为28像素。

  • 首先通过一个卷积核为5×5的卷积层,其通道数从1变为10,高宽分别为24像素;
  • 然后通过一个卷积核为2×2的最大池化层,通道数不变,高宽变为一半,即维度变成(batch,10,12,12);
  • 然后再通过一个卷积核为5×5的卷积层,其通道数从10变为20,高宽分别为8像素;
  • 再通过一个卷积核为2×2的最大池化层,通道数不变,高宽变为一半,即维度变成(batch,20,4,4);
  • 之后将其view展平,使其维度变为320(20*4*4)之后进入全连接层,用线性函数将其输出为10类,即“0-9”10个数字。

参考文档

用PyTorch实现MNIST手写数字识别(最新,非常详细)icon-default.png?t=O83Ahttps://blog.csdn.net/qq_45588019/article/details/120935828

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

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

相关文章

【工控】线扫相机小结 第四篇

背景 这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换&#xff0c;上一篇还遗留了一个Bug&#xff0c;在这一篇里进行订正&#xff01; 代码回顾 /// <summary>/// 其实就是打开触发/// </summary>void SetLineSacanWorkMode(){-----首先设置为帧…

AI 大模型重塑软件开发的未来

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【软考】系统架构设计师-计算机系统基础(4):计算机网络

计算机网络功能&#xff1a;数据通信、资源共享、管理集中化、分布式处理、负载均衡 5G高峰速率&#xff1a;10Gbit/s 广域网&#xff08;因特网&#xff09;/城域网/局域网&#xff08;以太网&#xff09; 总线型&#xff1a;利用率低&#xff0c;易冲突&#xff0c;干扰大…

Ultiverse 和web3新玩法?AI和GameFi的结合是怎样

Gamef 和 AI 是我们这个周期十分看好两大赛道之一&#xff0c;(Gamef 拥有极强的破圈效应&#xff0c;引领 Web2 用户进军 Web3 最佳利器。AI是这个周期最热门赛道&#xff0c;无论 Web2的 OpenAl&#xff0c;还是 Web3&#xff0c;都成为话题热议焦点。那么结合 GamefiA1双叙事…

Matlab多输入单输出之倾斜手写数字识别

本文主要介绍使用matlab构建多输入单输出的网络架构&#xff0c;来实现倾斜的手写数字识别&#xff0c;使用concatenationLayer来拼接特征&#xff0c;实现网络输入多个特征。 1.加载训练数据 加载数据&#xff1a;手写数字的图像、真实数字标签和数字顺时针旋转的角度。 lo…

R | 统一栅格数据的坐标系、分辨率和行列号

各位同学&#xff0c;在做相关性等分析时&#xff0c;经常会遇到各栅格数据间的行列号不统一等问题&#xff0c;下面的代码能直接解决这类麻烦。以某个栅格数据的坐标系、分辨率和行列号为准&#xff0c;统一文件夹内所有栅格并输出到新的文件夹。 代码只需要更改输入输出和ti…

UE5 第一人称射击项目学习(完结)

这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图&#xff0c;这里要引入C的面向对象思想&#xff0c;建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个print your name 在这里生成成员函数后&am…

三相正弦交流电的相序:揭秘正相序与反相序的奥秘

在电力系统中&#xff0c;三相正弦交流电的应用无处不在&#xff0c;从家庭用电到大型工业设备&#xff0c;都离不开它的稳定供电。然而&#xff0c;在三相交流电中&#xff0c;有一个概念常常让初学者感到困惑&#xff0c;那就是“相序”。今天&#xff0c;我们就来深入探讨一…

力扣面试题 - 24 插入

题目&#xff1a; 给定两个整型数字 N 与 M&#xff0c;以及表示比特位置的 i 与 j&#xff08;i < j&#xff0c;且从 0 位开始计算&#xff09;。 编写一种方法&#xff0c;使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域&#xff0c;不足之处用 0 补齐…

华为云容器监控平台

首先搜索CCE,点击云容器引擎CCE 有不同的测试&#xff0c;生产&#xff0c;正式环境 工作负载--直接查询服务名看监控 数据库都是走的一个 Redis的查看

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream&#xff1f; 我看很多回答都是“为了屏蔽消息队列的差异&#xff0c;使我们在使用消息队列的时候能够用统一的一套API&#xff0c;无需关心具体的消息队列实现”。 这样理解是有些不全面的&#xff0c;Spring Cloud Stream的核心是Stream&#xf…

Notepad++--在开头快速添加行号

原文网址&#xff1a;Notepad--在开头快速添加行号_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad怎样在开头快速添加行号。 需求 原文件 想要的效果 方法 1.添加点号 Alt鼠标左键&#xff0c;从首行选中首列下拉&#xff0c;选中需要添加序号的所有行的首列&#xff…

【ROS2】多传感器融合、实现精准定位:robot_localization

1、简述 robot_localization在SLAM建图、导航中常用于将多个传感器融合(IMU、里程计、深度相机、GPS等),以提高定位精度,为机器人提供了在三维空间中的非线性状态估计 robot_localization包含两个状态估计节点: ekf_localization_node:扩展卡尔曼滤波(EKF),缺点是非…

【智谱开放平台-注册_登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

永夜星河主题特效2(星河背景 + 闪烁文字+点击星星 + 文字弹出特效)

目录 图片展示 星河背景 闪烁文字点击星星 文字弹出特效 特效介绍&#xff1a; 使用方式&#xff1a; 图片展示 星河背景 闪烁文字点击星星 文字弹出特效 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">&l…

SAP Ariba Contracts_Author the Main Agreement

SAP Ariba Contracts_Author the Main Agreement Workspace Documents 从SAP Ariba 项目模板中继承的文档将自动出现在控件的“文档”选项卡中项目&#xff0c;Workspace Documents 管理所有合同相关文件的地方&#xff0c;如主要协议&#xff0c;附录&#xff0c;合同条款等…

C++练习题(5)

//函数打印素数 #include <iostream> using namespace std; int is_prime(int n){ for(int j2;j<n;j){ if(n%j0) return 0; } return 1; } int main(){ int i0; for(int i100;i<200;i){ if(is_prime(i)1) pr…

编程之路,从0开始:动态内存管理

Hello&#xff0c;大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路。 我们今天来学习C语言中的动态内存管理。 目录 1、为什么要有动态内存管理&#xff1f; 2、malloc和free &#xff08;1&#xff09;malloc函数 &…

【题解】AT_joisc2007_mall ショッピングモール (Mall)

原题传送门 温馨提示&#xff1a;岛国题要换行&#xff01; 需要求一个矩阵的和&#xff0c;考虑二维前缀和。 题目中不允许矩阵中有负数&#xff0c;结合求和的最小值&#xff0c;我们把负数赋为最大值不就行了吗。 接下来就是求二维前缀和了。 基于容斥原理&#xff0c;二…

Apifox软件Mock前端数据,帮忙生成API接口文档

Apifox是一款功能强大的接口调试软件&#xff0c;其特色功能丰富&#xff0c;且在前端mock数据生成方面表现出色。以下是对Apifox软件特色功能的详解&#xff0c;以及如何进行前端mock数据生成的步骤&#xff1a; https://apifox.com/help/api-docs/exporting-api https://www…