学习参考:
- 动手学深度学习2.0
- Deep-Learning-with-TensorFlow-book
- pytorchlightning
①如有冒犯、请联系侵删。
②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。
③非常推荐上面(学习参考)的前两个教程,在网上是开源免费的,写的很棒,不管是开始学还是复习巩固都很不错的。
深度学习回顾,专栏内容来源多个书籍笔记、在线笔记、以及自己的感想、想法,佛系更新。争取内容全面而不失重点。完结时间到了也会一直更新下去,已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。所有文章涉及的教程都会写在开头、一起学习一起进步。
推荐阅读、学习参考:
- https://blog.csdn.net/IronmanJay/article/details/128689946
- CNN笔记:通俗理解卷积神经网络
- 卷积神经网络原理【十分推荐】
- 卷积神经网络(CNN)详细介绍及其原理详解
1.从全连接层到卷积
多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。 对于表格数据,寻找的模式可能涉及特征之间的交互,但是不能预先假设任何与特征交互相关的先验结构。 此时,多层感知机可能是最好的选择,然而对于高维感知数据,这种缺少结构的网络可能会变得不实用。
例如,在之前猫狗分类的例子中:假设有一个足够充分的照片数据集,数据集中是拥有标注的照片,每张照片具有百万级像素,这意味着网络的每次输入都有一百万个维度。 即使将隐藏层维度降低到1000,这个全连接层也将有 106×103=109
个参数。 想要训练这个模型将不可实现,因为需要有大量的GPU、分布式优化训练的经验和超乎常人的耐心。
1.1不变性
想象一下,假设想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。 理想情况下,系统应该能够利用常识:猪通常不在天上飞,飞机通常不在水里游泳。 但是,如果一只猪出现在图片顶部,还是应该认出它。
可以从儿童游戏”沃尔多在哪里”中得到灵感:
在这个游戏中包含了许多充斥着活动的混乱场景,而沃尔多通常潜伏在一些不太可能的位置,读者的目标就是找出他。 尽管沃尔多的装扮很有特点,但是在眼花缭乱的场景中找到他也如大海捞针。 然而沃尔多的样子并不取决于他潜藏的地方,因此可以使用一个“沃尔多检测器”
扫描图像。 该检测器将图像分割成多个区域,并为每个区域包含沃尔多的可能性打分。
卷积神经网络正是将空间不变性(spatial invariance)的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。
- 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
- 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。
下面探究:以上两个原则是如何转化为数学表示的。
1.2多层感知机的限制
多层感知机(MLP)作为一种人工神经网络模型,在解决许多机器学习问题上表现出色。然而,它也有一些限制,包括:
- 需要大量数据集: MLP通常需要大量的标记数据来有效地训练模型,特别是在具有许多参数的大型网络中,过拟合是一个常见的问题。
- 需要调优的超参数: MLP具有许多超参数,如隐藏层的数量、每层的神经元数量、学习率等,需要仔细调优才能获得最佳性能。
- 对特征的敏感: MLP对输入数据的特征表示非常敏感,因此在训练之前可能需要对数据进行归一化或标准化,以避免不同特征值的影响不均衡。
- 容易过拟合: 由于MLP的参数数量较多,模型很容易过拟合训练数据,特别是在没有足够正则化措施的情况下。
- 计算资源需求高: 复杂的MLP可能需要大量的计算资源来训练,特别是当处理大规模的数据集时。
- 非线性关系的建模: 如果数据集包含复杂的非线性关系,MLP可能需要更多的层和神经元才能很好地捕捉这些关系,增加了模型的复杂性和训练难度。
- 黑盒模型: MLP作为深度学习模型,通常被认为是黑盒模型,难以解释其预测结果,这可能在需要透明决策过程的应用中造成一定的困扰。
多层感知机的输入是二维图像 𝐗 ,其隐藏表示 𝐇 在数学上是一个矩阵,在代码中表示为二维张量。 其中 𝐗 和 𝐇 具有相同的形状。 为了方便理解,可以认为无论是输入还是隐藏表示都拥有空间结构。
使用 [𝐗]𝑖,𝑗 和 [𝐇]𝑖,𝑗 分别表示输入图像和隐藏表示中位置( 𝑖 , 𝑗 )处的像素。 为了使每个隐藏神经元都能接收到每个输入像素的信息,将参数从权重矩阵替换为四阶权重张量 𝖶 。假设 𝐔 包含偏置参数,可以将全连接层形式化地表示为
其中,从 𝖶 到 𝖵 的转换只是形式上的转换,因为在这两个四阶张量的元素之间存在一一对应的关系。只需重新索引下标(𝑘,𝑙),使 𝑘=𝑖+𝑎 、 𝑙=𝑗+𝑏 ,此可得 [𝖵]𝑖,𝑗,𝑎,𝑏=[𝖶]𝑖,𝑗,𝑖+𝑎,𝑗+𝑏 。索引 𝑎 和 𝑏 通过在正偏移和负偏移之间移动覆盖了整个图像。 对于隐藏表示中任意给定位置( 𝑖 , 𝑗 )处的像素值 [𝐇]𝑖,𝑗 ,可以通过在 𝑥 中以 (𝑖,𝑗) 为中心对像素进行加权求和得到,加权使用的权重为 [𝖵]𝑖,𝑗,𝑎,𝑏 。
(1)平移不变性
引用上述的第一个原则:平移不变性。 这意味着检测对象在输入 𝐗 中的平移,应该仅导致隐藏表示 𝐇
中的平移。也就是说, 𝖵 和 𝐔 实际上不依赖于 (𝑖,𝑗) 的值,即 [𝖵]𝑖,𝑗,𝑎,𝑏=[𝐕]𝑎,𝑏 。并且 𝐔 是一个常数,比如 𝑢 。因此,可以简化 𝐇 定义为:
这就是卷积(convolution)。是在使用系数 [𝐕]𝑎,𝑏 对位置 (𝑖,𝑗) 附近的像素 (𝑖+𝑎,𝑗+𝑏) 进行加权得到 [𝐇]𝑖,𝑗 。 注意, [𝐕]𝑎,𝑏 的系数比 [𝖵]𝑖,𝑗,𝑎,𝑏 少很多,因为前者不再依赖于图像中的位置。这就是显著的进步!
(2)局部性
引用上述的第二个原则:局部性。如上所述,为了收集用来训练参数 [𝐇]𝑖,𝑗的相关信息,不应偏离到距 (𝑖,𝑗)很远的地方。这意味着在 |𝑎|>Δ 或 |𝑏|>Δ的范围之外,可以设置 [𝐕]𝑎,𝑏=0 。因此,可以将 [𝐇]𝑖,𝑗
重写为
上面该公式是一个卷积层(convolutional layer),而卷积神经网络是包含卷积层的一类特殊的神经网络。 在深度学习研究社区中, 𝐕 被称为卷积核(convolution kernel)或者滤波器(filter),亦或简单地称之为该卷积层的权重,通常该权重是可学习的参数。
1.3卷积
在数学中,两个函数(比如 𝑓,𝑔:ℝ(d)→ℝ )之间的“卷积”被定义为
也就是说,卷积是当把一个函数“翻转”并移位 𝐱时,测量 𝑓和 𝑔 之间的重叠。 当为离散对象时,积分就变成求和。例如,对于由索引为 ℤ 的、平方可和的、无限维向量集合中抽取的向量,得到以下定义:
对于二维张量,则为 𝑓 的索引 (𝑎,𝑏) 和 𝑔 的索引 (𝑖−𝑎,𝑗−𝑏)上的对应加和:
1.4通道
图像一般包含三个通道/三种原色(红色、绿色和蓝色)。 实际上,图像不是二维张量,而是一个由高度、宽度和颜色组成的三维张量,比如包含 1024×1024×3 个像素。 前两个轴与像素的空间位置有关,而第三个轴可以看作每个像素的多维表示。 因此,我们将 𝖷 索引为 [𝖷]𝑖,𝑗,𝑘 。由此卷积相应地调整为 [𝖵]𝑎,𝑏,𝑐 ,而不是 [𝐕]𝑎,𝑏 。
此外,由于输入图像是三维的,隐藏表示 𝖧 也最好采用三维张量。 换句话说,对于每一个空间位置,想要采用一组而不是一个隐藏表示。这样一组隐藏表示可以想象成一些互相堆叠的二维网格。 因此,可以把隐藏表示想象为一系列具有二维张量的通道(channel)。 这些通道有时也被称为特征映射(feature maps),因为每个通道都向后续层提供一组空间化的学习特征。 直观上可以想象在靠近输入的底层,一些通道专门识别边缘,而一些通道专门识别纹理。
为了支持输入 𝖷 和隐藏表示 𝖧 中的多个通道,可以在 𝖵 中添加第四个坐标,即 [𝖵]𝑎,𝑏,𝑐,𝑑 。
其中隐藏表示 𝖧 中的索引 𝑑 表示输出通道,而随后的输出将继续以三维张量 𝖧 作为输入进入下一个卷积层。 故而可以定义具有多个通道的卷积层,而其中 𝖵 是该卷积层的权重。
1.5总结(直接看这个)
全连接层在图像任务上的缺点:
- 参数量过大: 全连接层会将图像中的每个像素都连接到神经网络中,导致参数量巨大。对于高分辨率的图像,这样的连接方式会引起巨大的计算和内存负担。
- 位置信息丢失: 全连接层并不保留像素之间的位置信息,因为每个像素与所有神经元连接,使得网络无法捕捉到空间结构和位置信息,这在图像处理任务中通常是关键的。
- 过拟合风险高: 参数量巨大会增加模型的复杂性,容易过拟合训练数据,特别是在训练数据较少的情况下,容易导致泛化能力下降。
- 不适合大尺寸输入: 对于大尺寸输入的图像,全连接层的参数量迅速增长,会使得训练过程变得困难并且需要更多的计算资源。
- 计算开销大: 全连接层需要大量的计算资源和时间来训练模型,尤其是在处理大规模数据集时,会增加训练时间和成本。
以上这些缺点,导致了全连接网络无法胜任图片任务,为了克服全连接层在图像处理任务中的缺点,通常会使用卷积神经网络(CNN)来代替全连接层。CNN具有局部连接和权值共享的特性,可以更有效地处理图像数据,提取空间信息,并且减少参数量和计算开销。因此,在图像人物识别等任务中,CNN通常被认为是更有效和更适合的模型架构。
2.卷积通俗理解(直接从这里开始看)
卷积神经网络通过充分利用局部相关性和权值共享的思想,大大地减少了网络的参数量,从而提高训练效率,更容易实现超大规模的深层网络。
2.1什么是卷积?
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。
比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。(就是一个提取特征的过程)
中间滤波器filter与数据窗口做内积,其具体计算过程则是:40 + 00 + 00 + 00 + 01 + 01 + 00 + 01 + -4*2 = -8
卷积层有时被称为特征映射(feature map),因为它可以被视为一个输入映射到下一层的空间维度的转换器。 在卷积神经网络中,对于某一层的任意元素 𝑥 ,其感受野(receptive field)是指在前向传播期间可能影响 𝑥 计算的所有元素(来自所有先前层)。
2.2图像上的卷积
具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。
2.3卷积的过程
在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数:
- 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
- 步长stride:决定滑动多少步可以到边缘。
- 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。
2.4卷积网络之激励层与池化层
(1)激励层(激活函数层)
卷积网络使用ReLU激活函数,优点是收敛快,求梯度简单。
sigmoid激活函数容易饱和、造成终止梯度传递,且没有0中心化。
(2)池化pool层
池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)
上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。
池化就是这个意思,如果是取平均,那么就取这个区域内的平均。
2.5 特征映射和感受野
卷积层有时被称为特征映射(feature map),因为它可以被视为一个输入映射到下一层的空间维度的转换器。 在卷积神经网络中,对于某一层的任意元素 𝑥 ,其感受野(receptive field)是指在前向传播期间可能影响 𝑥 计算的所有元素(来自所有先前层)。
3.快速认识卷积网络的 层
3.1输入层
输入层比较简单,这一层的主要工作就是输入图像等信息,因为卷积神经网络主要处理的是图像相关的内容。对于输入图像,首先要将其转换为对应的二维矩阵,这个二位矩阵就是由图像每一个像素的像素值大小组成的。
上图又称为灰度图像,因为其每一个像素值的范围是0 ~ 255(由纯黑色到纯白色),表示其颜色强弱程度。
另外还有黑白图像,每个像素值要么是0(表示纯黑色),要么是255(表示纯白色)。
日常生活中最常见的就是RGB图像,有三个通道,分别是红色、绿色、蓝色。每个通道的每个像素值的范围也是0~255,表示其每个像素的颜色强弱。但是日常处理的基本都是灰度图像,因为比较好操作(值范围较小,颜色较单一),有些RGB图像在输入给神经网络之前也被转化为灰度图像,也是为了方便计算,否则三个通道的像素一起处理计算量非常大。当然,随着计算机性能的高速发展,现在有些神经网络也可以处理三通道的RGB图像。
3.2卷积层
卷积操作会为存在特征的区域确定一个高值,否则确定一个低值。这个过程需要通过计算其与卷积核(Convolution Kernel)的乘积值来确定。假设现在的输入图片是一个人的脑袋,而人的眼睛是需要提取的特征,那么就将人的眼睛作为卷积核,通过在人的脑袋的图片上移动来确定哪里是眼睛。
通过整个卷积过程又得到一个新的二维矩阵,此二维矩阵也被称为特征图(Feature Map),最后可以将得到的特征图进行上色处理(我只是打个比方,比如高值为白色,低值为黑色),最后可以提取到关于人的眼睛的特征。
如果每次计算的时候,边缘只被计算一次,而中间被多次计算,那么得到的特征图也会丢失边缘特征,最终会导致特征提取不准确,那为了解决这个问题,可以在原始的输入图像的二维矩阵周围再拓展一圈或者几圈,这样每个位置都可以被公平的计算到了,也就不会丢失任何特征,此过程可见下面情况,这种通过拓展解决特征丢失的方法又被称为Padding(填充)。Padding取值为2,拓展两圈:
如果使用两个卷积核去提取一张彩色图片呢?彩色图片都是三个通道,也就是说一个彩色图片会有三个二维矩阵。此时使用两组卷积核,每组卷积核都用来提取自己通道的二维矩阵的特征,只需要用两组卷积核的第一个卷积核来计算得到特征图就可以了。【注意,这里的3通道用一组也是可以的、根据自己需要来,用一组的话那就是删掉Filter W1,然后输出就只有一个矩阵。】
简而言之的总结:
如果是一个通道那就需要使用一个卷积核去操作(使用),三个通道需要使用3个卷积核去操作。处理多通道输入时,每个通道通常都会有对应的卷积核进行卷积操作。这个过程称为多通道卷积(Multi-channel Convolution)。当一个输入信号有多个通道时,每个通道都需要有相应的卷积核去提取特征。在每个通道上应用卷积核后,将每个通道的卷积结果求和,得到最终的输出特征图。
3.3池化层
有几个卷积核就有多少个特征图,现实中情况肯定更为复杂,也就会有更多的卷积核,那么就会有更多的特征图,当特征图非常多的时候,意味着我们得到的特征也非常多,但是这么多特征并不都是所需要的。
为了解决这个问题,可以利用池化层,池化层又称为下采样,也就是说,当进行卷积操作后,再将得到的特征图进行特征提取,将其中最具有代表性的特征提取出来,可以起到减小过拟合和降低维度的作用,这个过程如下所示:
其实这个过程类似于卷积的过程,就是一个正方形的小方块在图片上进行移动,每次取这个正方形方框中最具有代表性的特征,那么问题又来了,如何提取到最有代表性的特征呢,通常有两种方法:
- 最大池化:顾名思义,最大池化就是每次取正方形中所有值的最大值,这个最大值也就相当于当前位置最具有代表性的特征。
- 平均池化:平均池化就是取此正方形区域中所有值的平均值,考虑到每个位置的值对于此处特征的影响,平均池化计算也比较简单。
- 还可以实现加权形式的池化,对深色区域或者浅色区域,或者明显痕迹部分进行突出表达,比如加大权重的方式进行。
3.4全连接层
卷积和最大池化之后,得到最后的特征图,此时的特征都是经过计算后得到的,所以代表性比较强,最后经过全连接层,展开为一维的向量,再经过一次计算后,得到最终的识别概率,这就是卷积神经网络的整个过程。
3.5输出层
卷积神经网络的输出层理解起来就比较简单了,只需要将全连接层得到的一维向量经过计算后得到识别值的一个概率,当然,这个计算可能是线性的,也可能是非线性的。
在深度学习中,需要识别的结果一般都是多分类的,所以每个位置都会有一个概率值,代表识别为当前值的概率,取最大的概率值,就是最终的识别结果。在训练的过程中,可以通过不断地调整参数值来使识别结果更准确,从而达到最高的模型准确率。