深度学习 精选笔记(12)卷积神经网络-理论基础2

学习参考:

  • 动手学深度学习2.0
  • Deep-Learning-with-TensorFlow-book
  • pytorchlightning

①如有冒犯、请联系侵删。
②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。
③非常推荐上面(学习参考)的前两个教程,在网上是开源免费的,写的很棒,不管是开始学还是复习巩固都很不错的。

深度学习回顾,专栏内容来源多个书籍笔记、在线笔记、以及自己的感想、想法,佛系更新。争取内容全面而不失重点。完结时间到了也会一直更新下去,已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。所有文章涉及的教程都会写在开头、一起学习一起进步。

1.填充 (padding)和 步幅(步长)(stride)

填充(Padding):

  • 填充是指在输入特征图周围添加额外的像素值(通常是0),以扩大特征图的尺寸。填充可以用来控制卷积层输出特征图的空间尺寸,避免信息丢失,同时有助于处理边界信息。
  • 填充可以是"valid"填充(即无填充)或"same"填充(使得输出特征图尺寸与输入特征图尺寸相同)。"valid"填充表示不使用填充,输出尺寸会减小;"same"填充表示使用足够的填充使得输出尺寸与输入尺寸相同。

步幅(Stride):

  • 步幅是指卷积核在对输入特征图进行卷积操作时的移动步长。步幅控制了卷积核每次滑动的距离,影响了输出特征图的尺寸。
  • 大步幅会导致输出特征图尺寸减小,而小步幅会导致输出特征图尺寸增大。
  • 通常情况下,步幅为1是比较常见的选择,可以保留更多空间信息。但在某些情况下,可以使用大步幅来减小特征图尺寸,提高计算效率。

填充和步幅的组合方式会影响卷积层的输出尺寸。通过调整填充和步幅的数值,可以控制卷积神经网络在不同层面提取特征的方式,从而更好地适应特定的任务和数据。填充和步幅的选择也与输入图像尺寸、卷积核大小等因素有关,需要根据具体情况进行调整。

假设以下情景: 有时,在应用了连续的卷积之后,最终得到的输出远小于输入大小。这是由于卷积核的宽度和高度通常大于 1 所导致的。比如,一个 240×240 像素的图像,经过 10 层 5×5 的卷积后,将减少到 200×200 像素。如此一来,原始图像的边界丢失了许多有用信息。而填充是解决此问题最有效的方法;

有时,可能希望大幅降低图像的宽度和高度。例如,如果发现原始的输入分辨率十分冗余。步幅则可以在这类情况下提供帮助。

1.1 填充

在应用多层卷积时,常常丢失边缘像素。 由于通常使用小卷积核,因此对于任何单个卷积,可能只会丢失几个像素。 但随着应用许多连续卷积层,累积丢失的像素数就多了。 解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是 0 )。

将 3×3输入填充到 5×5 ,那么它的输出就增加为 4×4 。阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素: 0×0+0×1+0×2+0×3=0 。
在这里插入图片描述

卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
此外,使用奇数的核大小和填充大小也提供了书写上的便利。对于任何二维张量X,当满足:

  • 卷积核的大小是奇数;
  • 所有边的填充行数和列数相同;
  • 输出与输入具有相同高度和宽度

则可以得出:输出Y[i, j]是通过以输入X[i, j]为中心,与卷积核进行互相关计算得到的。

例子:创建一个高度和宽度为3的二维卷积层,并(在所有侧边填充1个像素)。给定高度和宽度为8的输入,则输出的高度和宽度也是8。

import tensorflow as tf


# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是1
    X = tf.reshape(X, (1, ) + X.shape + (1, ))
    Y = conv2d(X)
    # 省略前两个维度:批量大小和通道
    return tf.reshape(Y, Y.shape[1:3])

# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = tf.keras.layers.Conv2D(1, kernel_size=3, padding='same')
X = tf.random.uniform(shape=(8, 8))
comp_conv2d(conv2d, X).shape
TensorShape([8, 8])

例子:当卷积核的高度和宽度不同时,可以填充不同的高度和宽度,使输出和输入具有相同的高度和宽度。在如下示例中,使用高度为5,宽度为3的卷积核,高度和宽度两边的填充自动分别为2和1。

conv2d = tf.keras.layers.Conv2D(1, kernel_size=(5, 3), padding='same')

comp_conv2d(conv2d, X).shape

填充可以增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。

1.2步幅

卷积窗口从输入张量的左上角开始,向下、向右滑动。 在上面的例子中,默认每次滑动一个元素。 但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。将每次滑动元素的数量称为步幅(stride)

下图是垂直步幅为 3 ,水平步幅为 2 的二维互相关运算。 着色部分是输出元素以及用于输出计算的输入和内核张量元素: 0×0+0×1+1×2+2×3=8、0×0+6×1+0×2+0×3=6 。

解释:为了计算输出中第一列的第二个元素和第一行的第二个元素,卷积窗口分别向下滑动三行和向右滑动两列。但是,当卷积窗口继续向右滑动两列时,没有输出,因为输入元素无法填充窗口(除非添加另一列填充)。
在这里插入图片描述

通常,当垂直步幅为 𝑠ℎ 、水平步幅为 𝑠𝑤 时,输出形状为:
在这里插入图片描述
更进一步,如果输入的高度和宽度可以被垂直和水平步幅整除,则输出形状将为
在这里插入图片描述
将高度和宽度的步幅设置为2,从而将输入的高度和宽度减半:

  • 1:代表该卷积层输出的特征图的数量为1,即只有一个输出通道。
  • kernel_size=3:指定卷积核的大小为3x3,即卷积核的高和宽都是3。
  • padding=‘same’:表示使用“same”填充方式,即在输入特征图的周围填充足够的0,使得卷积操作后输出特征图的尺寸与输入特征图的尺寸相同。
  • strides=2:表示卷积核在水平和垂直方向上移动的步幅为2,即每次移动2个像素。
conv2d = tf.keras.layers.Conv2D(1, kernel_size=3, padding='same', strides=2)
comp_conv2d(conv2d, X).shape

复杂例子:

  • 1:表示卷积核的数量,即输出的特征图的通道数量为1。
  • kernel_size=(3, 5):表示卷积核的大小为3x5,即卷积核的高为3,宽为5。
  • padding=‘valid’:表示使用“valid”填充方式,即不使用填充。
  • strides=(3, 4):表示卷积操作时卷积核在输入特征图上沿高和宽两个方向分别移动3和4个像素。
conv2d = tf.keras.layers.Conv2D(1, kernel_size=(3,5), padding='valid',strides=(3, 4))
comp_conv2d(conv2d, X).shape

步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的 1/𝑛 ( 𝑛 是一个大于 1 的整数)。

2.通道

2.1单通道输入和单卷积核

灰度图片只有灰度值一个通道,单个卷积核𝑐{out}= 1的情况。以输入X为5 ×5 的矩阵,卷积核为3 × 3的矩阵为例,如下图 10.12 所示。与卷积核同大小的感受野(输入X上方的绿色方框)首先移动至输入X最左上方,选中输入X上3 × 3的感受野元素,与卷积核(图片中间3 × 3方框)对应元素相乘:

在这里插入图片描述
完成第一个感受野区域的特征提取后,感受野窗口向右移动一个步长单位(Strides,记为𝑠,默认为 1),选中图 10.13 中绿色方框中的 9 个感受野元素,按照同样的计算方法,与卷积核对应元素相乘累加,得到输出 10,写入第一行、第二列位置.
在这里插入图片描述
按照上述方法,每次感受野向右移动𝑠 = 个步长单位,若超出输入边界,则向下移动𝑠 = 1个步长单位,并回到行首,直到感受野移动至最右边、最下方位置。
在这里插入图片描述

总结基本如下:
在这里插入图片描述

2.2多通道输入和单卷积核

多通道输入的卷积层更为常见,比如彩色的图片包含了 R/G/B 三个通道,每个通道上面的像素值表示 R/G/B 色彩的强度。以 3 通道输入、单个卷积核为例,将单通道输入的卷积运算方法推广到多通道的情况。

在多通道输入的情况下,卷积核的通道数需要和输入X的通道数量相匹配,卷积核的第i个通道和X的第i个通道运算,得到第i个中间矩阵,此时可以视为单通道输入与单卷积核的情况,所有通道的中间矩阵对应元素再次相加,作为最终输出。

如下所示:每个通道上面的感受野窗口同步落在对应通道上面的最左边、最上方位置,每个通道上感受野区域元素与卷积核对应通道上面的矩阵相乘累加,分别得到三个通道上面的输出 7、-11、-1 的中间变量,这些中间变量相加得到输出-5,写入对应位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述输入的每个通道处的感受野均与卷积核的对应 通道相乘累加,得到与通道数量相等的中间变量,这些中间变量全部相加即得到当前位置 的输出值。输入通道的通道数量决定了卷积核的通道数。一个卷积核只能得到一个输出矩 阵,无论输入X的通道数量。
在这里插入图片描述
一个卷积核只能完成某种逻辑的特征提取,当需要同时提取多种逻辑特征 时,可以通过增加多个卷积核来得到多种特征,提高神经网络的表达能力,这就是多通道 输入、多卷积核的情况。

2.3多通道输入和多卷积核

在这里插入图片描述
基本如下:
在这里插入图片描述

3.池化层(汇聚层)

池化层与卷积层一样,汇聚层也可以改变输出形状。和以前一样,可以通过填充和步幅以获得所需的输出形状。

通常当处理图像时,希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。

汇聚(pooling)层(池化层),它具有双重目的:降低卷积层对位置的敏感性,同时降低对空间降采样表示的敏感性。

实现池化层的前向传播:

import tensorflow as tf


def pool2d(X, pool_size, mode='max'):
    p_h, p_w = pool_size
    Y = tf.Variable(tf.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w +1)))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            if mode == 'max':
                Y[i, j].assign(tf.reduce_max(X[i: i + p_h, j: j + p_w]))
            elif mode =='avg':
                Y[i, j].assign(tf.reduce_mean(X[i: i + p_h, j: j + p_w]))
    return Y

3.1最大池化和平均池化

与卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。 然而,不同于卷积层中的输入与卷积核之间的互相关计算,汇聚层不包含参数。 相反,池运算是确定性的,我们通常计算汇聚窗口中所有元素的最大值或平均值。这些操作分别称为最大汇聚层(maximum pooling)和平均汇聚层(average pooling)。

在这两种情况下,与互相关运算符一样,汇聚窗口从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚层还是平均汇聚层。

例如:输出张量的高度为 2 ,宽度为 2 。这四个元素为每个汇聚窗口中的最大值:
在这里插入图片描述
在这里插入图片描述
最大池化:

X = tf.constant([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
pool2d(X, (2, 2))

平均池化:

pool2d(X, (2, 2), 'avg')

3.2池化层的填充和步幅

池化层与卷积层一样,汇聚层也可以改变输出形状。和以前一样,可以通过填充和步幅以获得所需的输出形状。

X = tf.reshape(tf.range(16, dtype=tf.float32), (1, 4, 4, 1))
X

(1)默认情况下,(深度学习框架中的步幅与汇聚窗口的大小相同)。 因此,如果我们使用形状为(3, 3)的汇聚窗口,那么默认情况下,我们得到的步幅形状为(3, 3)。

pool2d = tf.keras.layers.MaxPool2D(pool_size=[3, 3])
pool2d(X)

(2)填充和步幅可以手动同时一次性设定:

paddings = tf.constant([[0, 0], [1,0], [1,0], [0,0]])
X_padded = tf.pad(X, paddings, "CONSTANT")
pool2d = tf.keras.layers.MaxPool2D(pool_size=[3, 3], padding='valid',strides=2)
pool2d(X_padded)

(3)可以设定一个任意大小的矩形汇聚窗口,并分别设定填充和步幅的高度和宽度。

paddings = tf.constant([[0, 0], [0, 0], [1, 1], [0, 0]])
X_padded = tf.pad(X, paddings, "CONSTANT")
pool2d = tf.keras.layers.MaxPool2D(pool_size=[2, 3], padding='valid',strides=(2, 3))
pool2d(X_padded)

3.3 池化层处理多通道

在处理多通道输入数据时,汇聚层(池化层)在每个输入通道上单独运算,而不是像卷积层一样在通道上对输入进行汇总。 这意味着汇聚层的输出通道数与输入通道数相同,注意通道数是必定相同的,但是输入shape和输出的shape一般不相同。

如下所示,汇聚后输出通道的数量仍然是2,与输入通道一致。

X = tf.concat([X, X + 1], 3)

paddings = tf.constant([[0, 0], [1,0], [1,0], [0,0]])
X_padded = tf.pad(X, paddings, "CONSTANT")
pool2d = tf.keras.layers.MaxPool2D(pool_size=[3, 3], padding='valid',
                                   strides=2)
pool2d(X_padded)

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

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

相关文章

【leetcode】二叉树的前序遍历➕中序遍历➕后序遍历

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1. 二叉树的前序遍历2. 二叉树的中序遍历3. 二叉树的后序遍历 1. 二叉树的前序遍历 点击查看题目 根…

保护IP地址安全:维护网络安全

在今天的数字化时代,IP地址是互联网通信的基础,也是网络安全的重要组成部分。保护IP地址安全至关重要,因为恶意攻击者可能利用IP地址进行网络入侵、数据泄露、服务拒绝等攻击。因此,制定有效的保护措施,维护IP地址的安…

【算法】火柴排队(离散化、归并排序)

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ∑i(ai−bi)^2,其中 ai 表示第一列火柴中第 i个火柴…

网络工程师之路由交换协议篇

网络工程师之路由交换篇 路由交换静态路由RIPOSPFISISBGP 以下均为个人笔记,摘录到csdn做备份 路由交换 路由 优先级 RIP 100 OSPF ASE 150 OSPF NSSA 150 IBGP 255 EBGP 255 IS-IS 15 OSPF 10 静态 60 默认开销是0 路由算法类型 D-V: 距离矢量算法 RI…

正信晟锦:老板拖工资怎么说比较合适

在职场中,老板拖欠工资是一个敏感而棘手的问题。面对这一情况,员工应保持冷静与专业,采取合适的方式表达自己的合理关切,并寻求问题的解决。 私下与老板进行沟通。选择一个适当的时机,以尊重和理解的态度开场&#xff…

【小黑送书—第十三期】>>《ARM汇编与逆向工程 蓝狐卷 基础知识》(文末送书)

与传统的CISC(Complex Instruction Set Computer,复杂指令集计算机)架构相比,Arm架构的指令集更加简洁明了,指令执行效率更高,能够在更低的功耗下完成同样的计算任务,因此在低功耗、嵌入式等领域…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

Unity中PICO中手柄按键返回值

文章目录 前言一、我们看一下每个按键返回值获取按键返回值的方法 二、我们实现一个左摇杆控制平滑移动的功能1、创建一个左摇杆控制移动的脚本2、传入XR Origin对象,并且定义一个公开变量控制移动速度3、获取到摇杆是否移动,以及移动的偏移量4、如果摇杆…

一个简单的Vue2例子讲明白拖拽drag、移入dragover、放下drop的触发机制先后顺序

几个小细节说明: 执行顺序dragstart→dragover→drop被拖拽的物体必须要设置draggable"true"(实际上只需要draggable就可以了,默认就是true),否者默认一般是不允许被拖拽的(图片除外)…

WEB前端 HTML 列表表格

列表 有序列表 使用“ol”创建“有序列表”&#xff0c;使用“li”表示“列表项” <body><ol type"1"><li>列表1</li><li>列表2</li><li>列表3</li></ol><ol type"A"><li>列表A<…

GaussDB数据库的索引管理

目录 一、引言 二、GaussDB数据库中的索引基本概念 1. 什么是GaussDB索引&#xff1f; 2. GaussDB索引的作用 三、GaussDB支持的索引类型 1. B-Tree索引 2. GIN索引 3. GiST索引 4. SP-GiST索引 四、创建和管理GaussDB索引 1. 创建索引 2. 删除索引 3. 索引的优化…

‍掌握SQL魔法:用`ORDER BY RAND()`随机化返回你的SQL查询结果!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Redis实现分布式锁源码分析

为什么使用分布式锁 单机环境并发时&#xff0c;使用synchronized或lock接口可以保证线程安全&#xff0c;但它们是jvm层面的锁&#xff0c;分布式环境并发时&#xff0c;100个并发的线程可能来自10个服务节点&#xff0c;那就是跨jvm了。 简单分布式锁实现 SETNX 格式&…

多行业万能预约门店小程序源码系统 带完整的搭建教程以及安装代码包

在数字化转型的大趋势下&#xff0c;门店预约服务已经成为提升客户体验、优化资源配置的关键环节。然而&#xff0c;市面上的预约系统往往功能单一&#xff0c;难以满足多行业的需求。小编给大家分享一款多行业万能预约门店小程序源码系统。该系统不仅具备高度的可定制性&#…

图文并茂!在Oracle VM VirtualBox上安装Ubuntu虚拟机的详细步骤指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【php基础】输出、变量、

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量 1. 输出 echo: 输出 print: 输出&#xff0c;输出成功返回1 print_r(): 输出数组 var_dump(): 输出数据的详细信息&#xff0c;带有数据类型和数…

python-redis缓存装饰器

目录 redis_decorator安装查看源代码使用 redis_decorators安装查看源代码\_\_init\_\_.pycacheable.py 各种可缓存的类型cache_element.py 缓存的元素caching.py 缓存主要逻辑 使用 总结全部代码参考 redis_decorator 安装 pip install redis_decorator查看源代码 from io …

【LeetCode热题100】 226. 翻转二叉树(二叉树)

一.题目要求 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;…

做一个58要多少钱?

做一个58要多少钱&#xff1f; 好久都没遇到这种询盘客户了&#xff0c;要是默认客户也许我会简单的勾兑下&#xff1f; 1、有没有源代码&#xff1f; 2、预算多少钱&#xff1f; 3、大概的开发周期&#xff1f; 熟悉的客户我只有一个回复&#xff1a;不做。懂得都懂&#xff…

业务版图全面扩展:维谛技术Vertiv在艾默生网络能源时代后的持续增长

近年来&#xff0c;全球数字化转型、AI算力发展等等一系列全新的趋势&#xff0c;正在构建一个全新的数字世界&#xff0c;为关键基础设施市场提供了广阔的发展机遇。 维谛技术&#xff08;Vertiv&#xff0c;NYSE&#xff1a;VRT&#xff09;作为一家拥有全球视野的专业化厂商…
最新文章