《动手学深度学习(PyTorch版)》笔记6.1

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过,同时对于书上部分章节也做了整合。

Chapter6 Convolutional Neural Network(CNN)

6.1 Basic Concepts

卷积神经网络将空间不变性(spatial invariance)这一概念系统化,并基于这个模型使用较少的参数来学习有用的表示,总结为以下两点:

  1. 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应。
  2. 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系。最终,可以聚合这些局部特征,以在整个图像级别进行预测。

为了方便理解,我们可以认为无论是输入还是隐藏表示都拥有空间结构。使用 [ X ] i , j [\mathbf{X}]_{i, j} [X]i,j [ H ] i , j [\mathbf{H}]_{i, j} [H]i,j分别表示输入图像和隐藏表示中位置( i i i, j j j)处的像素。为了使每个隐藏神经元都能接收到每个输入像素的信息,我们将参数从权重矩阵替换为四阶权重张量 W \mathsf{W} W。假设 U \mathbf{U} U包含偏置参数,我们可以将全连接层形式化地表示为

[ H ] i , j = [ U ] i , j + ∑ k ∑ l [ W ] i , j , k , l [ X ] k , l = [ U ] i , j + ∑ a ∑ b [ V ] i , j , a , b [ X ] i + a , j + b . \begin{aligned} \left[\mathbf{H}\right]_{i, j} &= [\mathbf{U}]_{i, j} + \sum_k \sum_l[\mathsf{W}]_{i, j, k, l} [\mathbf{X}]_{k, l}\\ &= [\mathbf{U}]_{i, j} + \sum_a \sum_b [\mathsf{V}]_{i, j, a, b} [\mathbf{X}]_{i+a, j+b}.\end{aligned} [H]i,j=[U]i,j+kl[W]i,j,k,l[X]k,l=[U]i,j+ab[V]i,j,a,b[X]i+a,j+b.

其中,实现从 W \mathsf{W} W V \mathsf{V} V的转换只需重新索引下标 ( k , l ) (k, l) (k,l),使 k = i + a k = i+a k=i+a l = j + b l = j+b l=j+b [ V ] i , j , a , b = [ W ] i , j , i + a , j + b [\mathsf{V}]_{i, j, a, b} = [\mathsf{W}]_{i, j, i+a, j+b} [V]i,j,a,b=[W]i,j,i+a,j+b.

6.1.1 Translation Invariance

平移不变性意味着检测对象在输入 X \mathbf{X} X中的平移,应该仅导致隐藏表示 H \mathbf{H} H中的平移。也就是说, V \mathsf{V} V U \mathbf{U} U实际上不依赖于 ( i , j ) (i, j) (i,j)的值,即 [ V ] i , j , a , b = [ V ] a , b [\mathsf{V}]_{i, j, a, b} = [\mathbf{V}]_{a, b} [V]i,j,a,b=[V]a,b,并且 U \mathbf{U} U是一个常数 u u u。因此,我们可以简化 H \mathbf{H} H定义为:

[ H ] i , j = u + ∑ a ∑ b [ V ] a , b [ X ] i + a , j + b . [\mathbf{H}]_{i, j} = u + \sum_a\sum_b [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}. [H]i,j=u+ab[V]a,b[X]i+a,j+b.

这就是卷积(convolution)。我们是在使用系数 [ V ] a , b [\mathbf{V}]_{a, b} [V]a,b对位置 ( i , j ) (i, j) (i,j)附近的像素 ( i + a , j + b ) (i+a, j+b) (i+a,j+b)进行加权得到 [ H ] i , j [\mathbf{H}]_{i, j} [H]i,j
注意, [ V ] a , b [\mathbf{V}]_{a, b} [V]a,b的系数比 [ V ] i , j , a , b [\mathsf{V}]_{i, j, a, b} [V]i,j,a,b少很多。

6.1.2 Locality

局部性要求,为了收集用来训练参数 [ H ] i , j [\mathbf{H}]_{i, j} [H]i,j的相关信息,我们不应偏离到距 ( i , j ) (i, j) (i,j)很远的地方。这意味着在 ∣ a ∣ > Δ |a|> \Delta a>Δ ∣ b ∣ > Δ |b| > \Delta b>Δ的范围之外,我们可以设置 [ V ] a , b = 0 [\mathbf{V}]_{a, b} = 0 [V]a,b=0。因此,我们可以将 [ H ] i , j [\mathbf{H}]_{i, j} [H]i,j重写为

[ H ] i , j = u + ∑ a = − Δ Δ ∑ b = − Δ Δ [ V ] a , b [ X ] i + a , j + b . (1) [\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}.\tag{1} [H]i,j=u+a=ΔΔb=ΔΔ[V]a,b[X]i+a,j+b.(1)

式(1)是一个卷积层(convolutional layer),而卷积神经网络是包含卷积层的一类特殊的神经网络。 V \mathbf{V} V被称为卷积核(convolution kernel)或者滤波器(filter),亦或简单地称之为该卷积层的权重,通常该权重是可学习的参数。
卷积操作原理如图:
在这里插入图片描述

输入大小为 n h × n w n_h \times n_w nh×nw,卷积核大小 k h × k w k_h \times k_w kh×kw,输出大小为 ( n h − k h + 1 ) × ( n w − k w + 1 ) . (n_h-k_h+1) \times (n_w-k_w+1). (nhkh+1)×(nwkw+1).输出的卷积层有时被称为特征映射(feature map),因为它可以被视为一个输入映射到下一层的空间维度的转换器。在卷积神经网络中,对于某一层的任意元素 x x x,其感受野(receptive field)是指在前向传播期间可能影响 x x x计算的所有元素(来自所有先前层),因此感受野可能大于输入的实际大小。
当图像处理的局部区域很小时,卷积神经网络与多层感知机的训练差异可能是巨大的:多层感知机可能需要数十亿个参数来表示网络中的一层,而卷积神经网络通常只需要几百个参数,而且不需要改变输入或隐藏表示的维数。参数大幅减少的代价是,我们的特征现在是平移不变的,并且当确定每个隐藏活性值时,每一层只包含局部的信息。以上所有的权重学习都将依赖于归纳偏置,当这种偏置与现实相符时,我们就能得到样本有效的模型,并且这些模型能很好地泛化到未知数据中,但如果这偏置与现实不符时(比如当图像不满足平移不变),我们的模型可能难以拟合训练数据。

注:在数学中,两个函数(比如 f , g : R d → R f, g: \mathbb{R}^d \to \mathbb{R} f,g:RdR)之间的“卷积”被定义为

( f ∗ g ) ( x ) = ∫ f ( z ) g ( x − z ) d z . (f*g)(\mathbf{x}) = \int f(\mathbf{z}) g(\mathbf{x}-\mathbf{z}) d\mathbf{z}. (fg)(x)=f(z)g(xz)dz.

对于离散对象时,积分就变成求和。例如,对于由索引为 Z \mathbb{Z} Z的、平方可和的、无限维向量集合中抽取的向量,我们有以下定义:

( f ∗ g ) ( i ) = ∑ a f ( a ) g ( i − a ) . (f*g)(i) = \sum_a f(a) g(i-a). (fg)(i)=af(a)g(ia).

对于二维张量,则为:

( f ∗ g ) ( i , j ) = ∑ a ∑ b f ( a , b ) g ( i − a , j − b ) . (f*g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b). (fg)(i,j)=abf(a,b)g(ia,jb).

上式看起来类似于式(1),但有一个主要区别:这里不是使用 ( i + a , j + b ) (i+a, j+b) (i+a,j+b),而是使用差值。我们在式(1)中其实定义了互相关(cross-correlation)而非数学上的卷积,但是两种运算的结果是相同的,在互相关运算中卷积核的元素与(i,j)右下角的元素对应相乘,而卷积中卷积核的元素对应的是(i,j)左上角的元素。为了与深度学习文献中的标准术语保持一致,我们将继续把“互相关运算”称为卷积运算。

6.1.3 Channels

我们之前忽略了图像一般包含三个通道/三种原色(红色、绿色和蓝色)。因此,我们将 X \mathsf{X} X索引为 [ X ] i , j , k [\mathsf{X}]_{i, j, k} [X]i,j,k。由此卷积相应地调整为 [ V ] a , b , c [\mathsf{V}]_{a,b,c} [V]a,b,c,而不是 [ V ] a , b [\mathbf{V}]_{a,b} [V]a,b。此外,由于输入图像是三维的,隐藏表示 H \mathsf{H} H也最好采用三维张量。换句话说,对于每一个空间位置,我们想要采用一组而不是一个隐藏表示,这样一组隐藏表示可以想象成一些互相堆叠的二维网格,因此我们可以把隐藏表示想象为一系列具有二维张量的通道(channel),这些通道有时也被称为特征映射(feature maps),因为每个通道都向后续层提供一组空间化的学习特征。直观上可以想象在靠近输入的底层,一些通道专门识别边缘,而一些通道专门识别纹理。

为了支持输入 X \mathsf{X} X和隐藏表示 H \mathsf{H} H中的多个通道,我们可以在 V \mathsf{V} V中添加第四个坐标,即 [ V ] a , b , c , d [\mathsf{V}]_{a, b, c, d} [V]a,b,c,d。综上所述,

[ H ] i , j , d = ∑ a = − Δ Δ ∑ b = − Δ Δ ∑ c [ V ] a , b , c , d [ X ] i + a , j + b , c , [\mathsf{H}]_{i,j,d} = \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} \sum_c [\mathsf{V}]_{a, b, c, d} [\mathsf{X}]_{i+a, j+b, c}, [H]i,j,d=a=ΔΔb=ΔΔc[V]a,b,c,d[X]i+a,j+b,c,

其中隐藏表示 H \mathsf{H} H中的索引 d d d表示输出通道,而随后的输出将继续以三维张量 H \mathsf{H} H作为输入进入下一个卷积层。

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

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

相关文章

Python循环语句——for循环的基础语法

一、引言 在Python编程的世界中,for循环无疑是一个强大的工具。它为我们提供了一种简洁、高效的方式来重复执行某段代码,从而实现各种复杂的功能。无论你是初学者还是资深开发者,掌握for循环的用法都是必不可少的。在本文中,我们…

第三百一十回

文章目录 1. 概念介绍2. 实现方法2.1 hintText2.2 labelText2.3 controller 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中处理光标"相关的内容,本章回中将介绍如何添加输入框默认值.闲话休提,让我们一起Talk Flutter吧。 1.…

【C++从0到王者】第四十一站:特殊类的设计

文章目录 一、设计一个类,不能被拷贝1.C98方法2.C11方法 二、设计一个类,只能在堆上创建对象1.析构函数私有化2.构造函数私有化 三、请设计一个类,只能在栈上创建对象四、设计一个类不能被继承1.C98方式2.C11方式 五、设计一个类,…

【JS逆向学习】今日头条

逆向目标 目标网页:https://www.toutiao.com/?wid1707099375036目标接口:https://www.toutiao.com/api/pc/list/feed目标参数:_signature 逆向过程 老规矩先观察网络请求,过滤XHR请求观察加密参数,发现Payload的_s…

c#cad 创建-直线(五)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是用于在AutoCAD中创建一条直线。首先获取当前活动文档和数据库的引用,然后创建一个编辑器对象用于提示用户输入。接下来,在一个事务中获取模型空间的块表记录,并定义直线的长度…

图灵之旅--二叉树堆排序

目录 树型结构概念树的表示形式 二叉树概念特殊的二叉树二叉树性质二叉树的存储二叉树的遍历前中后序遍历 优先级队列(堆)概念 优先级队列的模拟实现堆的性质概念堆的存储方式堆的创建 堆常用接口介绍PriorityQueue的特性PriorityQueue常用接口介绍优先级队列的构造插入/删除/获…

没有联合和枚举 , C语言怎么能在江湖混 ?

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

QT:界面上重写鼠标事件(画框,鼠标更改)

前言 接上一篇的rtsp播放器,有需要在播放界面手动跟踪,就需要在播放界面绘制矩形框,并把当前鼠标绘制区域的宽高坐标进行换算发送给3559,做进一步处理。绘制矩形框共分为两种,第一种是左键拖动绘制,第二种是…

Z函数的原理和应用:以Python为例

Z函数 也就是,它想找前缀和以s[i]开头的后缀的LCP 思想 维护一个右端点最右的z-box 结合z[i - l]的结果和朴素算法进行优化 Z函数Python模版 def sumScores(self, s: str) -> int:n len(s)z [0] * nl r 0 # 右端点最右的z-boxfor i in range(1, n):if i &…

Etsy做什么店铺比较靠谱? 什么叫做真人店?

作为Etsy是美国最大的原创手工在线销售平台之一,以其店铺利润高、平台佣金低、平台同质化不严重的优点在跨境电商里颇具竞争力。然而Etsy开店却不是件容易事,原因是Etsy真人店对于环境以及卖家的运营操作要求较高,下面就给各位有意入局Etsy的…

Linux Shell编程系列--变量的定义与使用

一、目的 上一篇我们简单介绍了shell脚本的组成以及如何运行一个shell脚本,本篇将详解讲解shell中的变量。在Shell脚本中,变量是用来存储和处理数据的基本结构。 二、介绍 1、定义变量 变量名与等号()后跟值来定义一个变量&#…

Java入门之JavaSe(韩顺平p1-p?)

学习背景: 本科搞过一段ACM、研究生搞了一篇B会后,本人在研二要学Java找工作啦~~(宇宙尽头是Java?)爪洼纯小白入门,C只会STL、python只会基础Pytorch、golang参与了一个Web后端项目,可以说项目小…