深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数

news2024/9/25 8:28:33

想要入门深度学习的小伙伴们,可以了解下本博主的其它基础内容:
🏠我的个人主页
🚀深度学习入门基础CNN系列——卷积计算
🌟深度学习入门基础CNN系列——填充(padding)与步幅(stride)
😊深度学习入门基础CNN系列——感受野和多输入通道、多输出通道以及批量操作基本概念

池化(Pooling)

池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,其好处是当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。比如:当识别一张图像是否是人脸时,我们需要知道人脸左边有一只眼睛,右边也有一只眼睛,而不需要知道眼睛的精确位置,这时候通过池化某一片区域的像素点来得到总体统计特征会显得很有用。由于池化之后特征图会变得更小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。
**如下图所示:**将一个 2 × 2 2\times2 2×2的区域池化成一个像素点。通常有两种方法,平均池化和最大池化。

在这里插入图片描述

  • 如图(a):平均池化。这里使用大小为 2 × 2 2\times2 2×2的池化窗口,每次移动的步幅为2,对池化窗口覆盖区域内的像素取平均值,得到相应的输出特征图的像素值。
  • 如图(b):最大池化。对池化窗口覆盖区域内的像素取最大值,得到输出特征图的像素值。当池化窗口在图片上滑动时,会得到整张输出特征图。池化窗口的大小称为池化大小,用 k h × k w k_{h}\times k_w kh×kw表示。在卷积神经网络中用的比较多的是窗口大小为 2 × 2 2\times2 2×2,步幅为2的池化。

与卷积核类似,池化窗口在图片上滑动时,每次移动的步长称为步幅,当宽和高方向的移动大小不一样时,分别用 S w 和 S h S_w和S_h SwSh表示。也可以对需要进行池化的图片进行填充,填充方式与卷积类似,假设在第一行之前填充 p h 1 p_{h1} ph1行,在最后一行后面填充 p h 2 p_{h2} ph2行。在第一列之前填充 p w 1 p_{w1} pw1列,在最后一列之后填充 p w 2 p_{w2} pw2列,则池化层的输出特征图大小为:
H o u t = H + p h 1 + p h 2 − k h s h + 1 W o u t = H + p h 1 + p h 2 − k w s w + 1 H_{out}=\frac{H+p_{h1}+p_{h2}-k_h}{s_h}+1\\ W_{out}=\frac{H+p_{h1}+p_{h2}-k_w}{s_w}+1 Hout=shH+ph1+ph2kh+1Wout=swH+ph1+ph2kw+1
在卷积神经网络中,通常使用 2 × 2 2\times2 2×2大小的池化窗口,步幅也使用2,填充为0,则输出特征图的尺寸为:
H o u t = H 2 W o u t = W 2 \begin{aligned} H_{out}=\frac{H}{2}\\ W_{out}=\frac{W}{2} \end{aligned} Hout=2HWout=2W
通过这种方式的池化,输出特征图的高和宽都减半,但通道数不会改变。

Sigmoid和ReLU激活函数

前面介绍的网络结构中,普遍使用Sigmoid函数做激活函数。在神经网络发展的早期,Sigmoid函数用的比较多,而目前用的较多的激活函数是ReLU。这是因为Sigmoid函数在反向传播过程中,容易造成梯度的衰减。让我们仔细观察Sigmoid函数的形式,就能发现这一问题。
Sigmoid激活函数的定义如下:
y = 1 1 + e − x y=\frac{1}{1+e^{-x}} y=1+ex1
ReLU激活函数的定义如下:
y = { 0 , x < 0 x , x ≥ 0 y= \begin{cases} 0,\quad x< 0\\ x, \quad x\ge0 \end{cases} y={0,x<0x,x0
下面的程序画出了Sigmoid和ReLU函数的曲线图:

# ReLU和Sigmoid激活函数示意图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
plt.figure(figsize=(10, 5))

# 创建数据x
x = np.arange(-10, 10, 0.1)

# 计算Sigmoid函数
s = 1.0 / (1 + np.exp(0. - x))

# 计算ReLU函数
y = np.clip(x, a_min=0., a_max=None)

#####################################
# 以下部分为画图代码
f = plt.subplot(121)
plt.plot(x, s, color='r')
currentAxis=plt.gca()
plt.text(-9.0, 0.9, r'$y=Sigmoid(x)$', fontsize=13)
currentAxis.xaxis.set_label_text('x', fontsize=15)
currentAxis.yaxis.set_label_text('y', fontsize=15)

f = plt.subplot(122)
plt.plot(x, y, color='g')
plt.text(-3.0, 9, r'$y=ReLU(x)$', fontsize=13)
currentAxis=plt.gca()
currentAxis.xaxis.set_label_text('x', fontsize=15)
currentAxis.yaxis.set_label_text('y', fontsize=15)

下面是我再notebook上执行的结果:
在这里插入图片描述

梯度消失现象

在神经网络里,将经过反向传播之后,梯度值衰减到接近于零的现象称作梯度消失现象。
从上面的函数曲线可以看出,当 x x x为较大的正数的时候,Sigmoid函数数值非常接近于1,函数曲线变得很平滑,在这些区域Sigmoid函数的导数接近于零。当 x x x为较小的负数时,Sigmoid函数值也非常接近于0,函数曲线也很平滑,在这些区域Sigmoid函数的导数也接近于0。只有当 x x x的取值在0附近时,Sigmoid函数的导数才比较大。对Sigmoid函数求导数,结果如下所示:
d y d x = − 1 ( 1 + e − x ) 2 ⋅ d ( e − x ) d x = 1 2 + e x + e − x \frac{dy}{dx}=-\frac{1}{(1+e^{-x})^2}\cdot \frac{d(e^{-x})}{dx}=\frac{1}{2+e^{x}+e^{-x}} dxdy=(1+ex)21dxd(ex)=2+ex+ex1
从上面的可以看出,Sigmoid函数的导数 d y d x \frac{dy}{dx} dxdy的最大值为 1 4 \frac{1}{4} 41。在前向传播的时候, y = S i g m o i d ( x ) y=Sigmoid(x) y=Sigmoid(x);而在反向传播中, x x x的梯度等于 y y y的梯度乘以 S i g m o i d Sigmoid Sigmoid函数的导数,如下所示:
∂ L ∂ x = ∂ L ∂ y ⋅ ∂ y ∂ x \frac{\partial L}{\partial x}=\frac{\partial L}{\partial y}\cdot\frac{\partial y}{\partial x} xL=yLxy
得到 x x x的梯度数值最大不会超过 y y y的梯度的 1 4 \frac{1}{4} 41

由于最开始是将神经网络的参数随机初始化的, x x x的取值很有可能在很大或者很小的区域,这些地方都可能造成Sigmoid函数的导数接近于0,导致 x x x的梯度接近于0;即是 x x x取值在接近于0的地方,按上面的分析,经过Sigmoid函数反向传播之后, x x x的梯度不会超过 y y y的梯度的 1 4 \frac{1}{4} 41,如果有多层网络使用了Sigmoid激活函数,则比较靠后的那些层梯度将衰减到非常小的值。

ReLU函数则不同,虽然在 x < 0 x<0 x<0的地方,ReLU函数的导数为0。但是在 x > 0 x>0 x>0的地方,ReLU函数的导数为1,能够将 y y y的梯度完整的传递给 x x x,从而不会引起梯度消息。

附录:
在此附上Sigmoid的求导过程(字太丑,线条也不优美,往各路大神海涵😜),怕有的人时间太长忘记了怎么求导。
在这里插入图片描述

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

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

相关文章

Acwing - 算法基础课 - 笔记(数学知识 · 三)(补)

数学知识&#xff08;三&#xff09; 这一小节讲的是高斯消元&#xff0c;组合数。 高斯消元 高斯消元是用来解方程的&#xff0c;通常来说可以在 O(n3)O(n^3)O(n3) 的时间复杂度内&#xff0c;求出包含 n 个未知数的&#xff0c;n个方程的多元线性方程组的解。如下的方程组…

人机界面石油行业应用:一个设备构建石油罐区状态监测系统

一、应用背景 石油罐区是石油石化企业重要的生产设施&#xff0c;负责存储和输送各类油品&#xff0c;而石油罐区状态参数的监控是生产管理的重要部分&#xff0c;不仅可以及时准确地获取现场设备数据&#xff0c;保证罐区的正常运行&#xff0c;还可以防止安全事故的发生。 …

Python如何解决“快手滑块验证码”(4)

前言 本文是该专栏的第32篇,后面会持续分享python的干货知识,记得关注。 很多时候,我们打开一个页面还没开始进行浏览,就跳出一个滑块验证的图片,需要拖到滑块至缺口处,才可以正常浏览。这对于我们正常人浏览页面来说,几乎没什么难度,但是当我们需要用到脚本去实现的时…

本地服务器如何让外网远程桌面连接?

远程访问是远程办公和服务器管理常用的网络应用场景。那么&#xff0c;当我们需要面对远程目标主机是内网服务器电脑时&#xff0c;在不是同个局域网的跨网环境下&#xff0c;内网可以远程控制电脑吗&#xff1f;答案是可以&#xff0c;使用快解析内网映射方案就能实现将本地服…

MyBatis一级缓存 二级缓存

MyBatis一级缓存 二级缓存什么是缓存?一级缓存一级缓存失效的四种情况二级缓存怎样开启二级缓存使二级缓存失效的情况二级缓存相关配置缓存查询的数据顺序整合第三方缓存EHCache&#xff08;代替二级缓存&#xff09;什么是缓存? 这是一个地图软件上的根据城市查询模块,对于那…

Freemarker页面静态化开发

4.5 页面静态化 4.5.1 什么是页面静态化 根据课程发布的操作流程&#xff0c;执行课程发布后要将课程详情信息页面静态化&#xff0c;生成html页面上传至文件系统。 什么是页面静态化&#xff1f; 课程预览功能通过模板引擎技术在页面模板中填充数据&#xff0c;生成html页…

Mybatis Plus轻松上手

Mybatis Plus 今日目标&#xff1a; 了解mybatisplus的特点能够掌握mybatisplus快速入门能够掌握mybatisplus常用注解能够掌握mybatisplus常用的增删改查能够掌握mybatisplus自动代码生成 Mybatis: ✔需要程序员编写sql语句程序员可以干预sql对sql进行调优(优化) MybatisPlu…

强化学习笔记:基于价值的学习方法之价值估计(python实现)

目录 1. 前言 2. 数学原理 3. 代码实现 3.1 游戏设定 3.2 class State 3.3 class Action 3.4 Class Agent 3.5 Class Environment 4. 仿真结果及其分析 4.1 play() 4.2 value_evaluation_all_states(grid, max_steps) 4.3 value_evaluation_one_state(grid, s) 4.4…

ZYNQ FPGA嵌入式开发 - 小梅哥(二)

创建工程打开Xilinx SDK创建工程Next 创建Empty Application添加文件编写代码参考文档 UG585 Zynq 7000 Technical Reference Manual寄存器说明 Appx.B: Registe Detial查看帮助文档Import Examples跨平台使用&#xff1a;头文件&#xff1a;unistd.h 每个平台都会提供sleep() …

论文阅读笔记:Attention is All You Need

论文标题&#xff1a;Attention is All You Need 目录 论文标题&#xff1a;Attention is All You Need 1.摘要 2.前言 3.模型结构 自注意力机制 多头自注意力机制 注意力机制在Transformer中的应用 1.摘要 过去最优的模型是带有attention连接的encoder-decoder模型&…

string的应用和模拟实现(上)

目录 string的应用 insert插入元素 erase删除元素 assign赋值&#xff1a; replace代替函数的一部分 find&#xff1a;从string对象中找元素 c_str:得到c类型的字符串的指针 substr&#xff1a;取部分元素构建成新的string对象 rfind find_first_of:从string查找元素 stri…

JVM【类的加载过程(类的生命周期)详解】

概述 在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义&#xff0c;引用数据类型则需要进行类的加载。 按照 Java 虚拟机规范&#xff0c;从 class 文件到加载到内存中的类&#xff0c;到类卸载出内存为止&#xff0c;它的整个生命周期包括如…

软件测试之python学习

1、pycharm的常用配置 1.1修改主题配置 1、点击菜单file,选择settings选项2、选择editor&#xff0c;点击color scheme配色方案3、在右侧选择对应的主题配置1.2修改背景颜色 1、点击菜单file,选择settings选项2、选择appearance&#xff0c;点击Theme 1.3调整字体大小 1、点…

基于K8S+eureka的java应用快速上下线的WEB平台

刚进公司时&#xff0c;由于历史原因&#xff0c;应用发布通过&#xff1a;发布新版&#xff08;新老并存&#xff09;->下线老版->删除老版的方式&#xff0c;每次通过手工处理&#xff0c;蛋疼&#xff08;不方便且高风险&#xff09;。于是马上写了比较直观的脚本方案…

关于java移位运算的一点讨论

框架乱飞的年代&#xff0c;时常还得往框架源码里看&#xff0c;对内在原理没点理解&#xff0c;人家就会认为你不太行。平时开发你可能没咋用过位移运算&#xff0c;但往源码里一看&#xff0c;就时常能看到它。我也是看着看着&#xff0c;突然仔细一琢磨&#xff0c;又不由得…

C++缺省参数与函数重载

目录 一.缺省参数 1. 基本概念 2.多参函数中使用缺省参数的情形分类 二.函数重载 (1)形参类型不同构成的重载 (2)形参个数不同构成的重载 (3)形参类型顺序不同构成的重载 函数重载的注意事项&#xff1a; 三.C支持函数重载的底层原理--函数名修饰 编译器生成可执行程序…

选购自主可控全国产交换机时, IP防护等级多少比较合适?

本期武汉海翎光电的小编要为大家介绍的是《选购自主可控全国产交换机时IP防护等级多少比较合适&#xff1f;》首先我们要了解自主可控全国产交换机的工作场景&#xff0c;加固交换机会比工业交换机的IP等级更高一些&#xff0c;而工业交换机又会比普通交换机的IP等级要求高一些…

Unity 工具 之 Jenkins 打包自动化工具的下载/安装/基本操作/任务创建执行/Unity打包自动化简单搭建的相关整理

Unity 工具 之 Jenkins 打包自动化工具的下载/安装/基本操作/任务创建执行/Unity打包自动化简单搭建的相关整理 目录 Unity 工具 之 Jenkins 打包自动化工具的下载/安装/基本操作/任务创建执行/Unity打包自动化简单搭建的相关整理 一、简单介绍 二、Jenkins 的下载 三、Jenk…

代码随想录--链表相关题目整理

代码随想录–链表相关题目整理 1. LeetCode203 移除链表中指定元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val…

如何免费创建PDF文档?创建PDF文档的9个工具

PDF 创建器是一种程序、应用程序或软件&#xff0c;旨在制作或创建 PDF 文档。自可移植文档格式 ( PDF ) 出现以来&#xff0c;文档共享和存储变得更加容易。PDF 还使文件交换更加安全。由于 PDF 格式的众多优点&#xff0c;PDF 文档被全球范围内的人们广泛使用。因此&#xff…