ResNet论文翻译和精读

news2024/11/28 18:52:07

1:论文原文

论文原文: ResNet 

2:该论文解决了什么问题?

改论文解决了深层的神经网络训练时的梯度消失和梯度爆炸的问题;

3:该论文的创新点?

  1. 将快捷连接应用到了网络中构建成了残差网络块;
  2. 由传统的网络每层直接学习底层映射改为了每一层学习一点最后累加为底层映射。

4:训练策略?

每个卷积后或者激活函数前均采用BN,当错误率达到平稳,将学习率乘0.1;

5:代码地址?

6:论文还有什么改进之处?

导读

AlexNet提出网络的深度直接影响准确度,但是对于一个较深的网络来说,训练起来是十分困难的,往往会存在梯度消失或者梯度爆炸的问题,这也导致了深层网络的表现可能还不如浅层的网络,如下图所示,为了解决该问题,本文提出了残差块结构来构建网络,每个残差块包含了一条快捷链接,允许梯度直接通过网络层进行反向传播,从而避免了深度网络中梯度消失的问题,使得训练一个较深的网络并提高精度成为了可能。

摘要

更深的神经网络更难训练。我们提出了一种残差学习框架,以简化训练比以前使用的网络深得多的模型。我们明确地重新构造层,将其表达为相对于层输入的残差函数,而不是学习无参考的函数。我们提供了全面的实证证据,表明这些残差网络更容易优化,并且可以通过显著增加深度来提高准确性。在ImageNet数据集上,我们评估了深度为152层的残差网络,比VGG网络[41]深8倍,但仍然具有较低的复杂性。一组这些残差网络在ImageNet测试集上达到了3.57%的错误率。这个结果赢得了ILSVRC 2015分类任务的第一名。我们还对具有100和1000层的CIFAR-10进行了分析。

对于许多视觉识别任务来说,表示的深度至关重要。仅仅因为我们的表示非常深,我们在COCO目标检测数据集上取得了28%的相对改进。深度残差网络是我们在ILSVRC和COCO 2015竞赛中的提交的基础,我们在ImageNet检测、ImageNet定位、COCO检测和COCO分割任务中也赢得了第一名。

1:由AlexNet提出网络的深度会影响网络的精度,但是越深的网络往往越难以训练,针对这个问题,该问题出了残差结构,可以训练一个更深的网络;

2:虽然网络很深,但是仍然具有较低的复杂度。

介绍

深度卷积神经网络[22, 21]在图像分类[21, 50, 40]方面取得了一系列突破。深度网络自然地集成了低/中/高级特征[50]和分类器,以端到端的多层方式进行,并且“层次”特征可以通过堆叠的层数(深度)进行丰富。最近的证据[41, 44]表明网络深度至关重要,而在具有挑战性的ImageNet数据集[36]上的领先结果[41, 44, 13, 16]都利用了“非常深”的[41]模型,深度为十六[41]到三十[16]。许多其他非平凡的视觉识别任务[8, 12, 7, 32, 27]也从非常深的模型中受益匪浅。

由于深度的重要性,一个问题出现了:学习更好的网络是否就像堆叠更多的层那样简单?回答这个问题的障碍是臭名昭著的梯度消失/爆炸问题[1, 9],这从一开始就阻碍了收敛。然而,这个问题已经在初始化时进行了规范化[23, 9, 37, 13]和中间规范化层[16]的很大程度上得到解决,这使得具有数十层的网络可以开始收敛梯度下降(SGD)和反向传播[22]。

当更深的网络能够开始收敛时,就暴露出了一个退化问题:随着网络深度的增加,准确性达到饱和(这可能并不奇怪),然后迅速下降。令人意外的是,这种退化不是由过拟合引起的,向一个足够深的模型添加更多层会导致更高的训练错误,正如[11, 42]所报告的,并且经过我们的实验证实。

退化(训练准确性的下降)表明,并非所有系统都同样容易优化。让我们考虑一个较浅的架构及其在其上添加更多层的深层对应物。存在一个构建深层模型的解决方案:添加的层是恒等映射,而其他层是从学到的较浅模型复制的。存在这个构建的解决方案表明,深层模型的训练错误不应比其较浅对应物更高。但是实验证明,我们手头上的当前求解器无法找到与构建的解决方案相当好或更好的解决方案(或者无法在合理的时间内这样做)。

在本文中,我们通过引入深度残差学习框架来解决退化问题。我们不再希望每个堆叠的层直接拟合所需的底层映射,而是明确地让这些层拟合残差映射。形式上,我们将所需的底层映射表示为H(x),我们让堆叠的非线性层拟合另一个映射F(x) := H(x)−x。原始映射重新构造为F(x)+x。我们假设优化残差映射比优化原始的无参考映射更容易。极端情况下,如果恒等映射是最优的,将残差推向零将比通过一系列非线性层拟合恒等映射更容易。

F(x)+x的表述可以通过具有“快捷连接”(图2)的前馈神经网络来实现。快捷连接[2, 34, 49]是那些跳过一个或多个层的连接。在我们的情况下,快捷连接简单地执行恒等映射,它们的输出与堆叠层的输出相加(图2)。恒等快捷连接既不添加额外的参数也不增加计算复杂性。整个网络仍然可以通过带有反向传播的SGD进行端到端训练,并且可以在不修改求解器的情况下轻松使用常见库(例如,Caffe [19])进行实现。

我们在ImageNet [36]上进行了全面的实验来展示退化问题并评估我们的方法。我们表明:1)我们的极深残差网络易于优化,但对应的“普通”网络(仅堆叠层)在深度增加时表现出更高的训练错误;2)我们的深度残差网络可以轻松地从大幅增加的深度中获得准确性提升,产生比以前的网络更好的结果。

类似的现象在CIFAR-10数据集上也得到展示,这表明优化困难和我们的方法的效果不仅仅类似于特定的数据集。我们在这个数据集上展示了成功训练的模型,具有超过100层,并探索了具有超过1000层的模型。

在ImageNet分类数据集[36]上,我们通过极深的残差网络获得了卓越的结果。我们的152层残差网络是迄今为止在ImageNet上展示的最深的网络,而仍:然比VGG网络[41]更简单。我们的集成在ImageNet测试集上有3.57%的top-5错误率,在ILSVRC 2015分类竞赛中获得了第一名。这种极深的表示还在其他识别任务上具有出色的泛化性能,并使我们在ILSVRC&COCO 2015竞赛中进一步获得了ImageNet检测、ImageNet定位、COCO检测和COCO分割的第一名。这些强有力的证据表明,残差学习原则是通用的,并且我们期望它在其他视觉和非视觉问题中也能够应用。

1:目前影响网络深度的最大问题就是梯度消失或梯度爆炸;

2:目前的深层神经网络往往存在一种退化现象,增加层数反而导致准确度下降,这其中的原因不是过拟合造成的,而可能是深层的神经网络优化较困难存在梯度消失和梯度爆炸等问题导致网络无法学习,添加的层仅仅只是复制了前一层的输出。

3:梯度消失:在反向传播时,较深网络的的梯度信息不断减少最终归为0,这也就导致了底层的权重停止更新,也就难以学习深层的特征表示;应对策略可以使用Relu等非饱和激活函数有助于缓解梯度消失,或者通过Batch normalization来规范化输入以缓解梯度消失;

Batch normalization:具体操作步骤如下:通过对每个小批量数据计算均值和方差再进行归一化,接着使用缩放和偏移对归一化后的数据进行线性变换,最后在训练时通过反向传播更新均值和方差的移动平均值来达到BN;由于对输入数据进行了归一化,使得网络更容易被训练,加速了收敛,可以通过在深度学习框架中添加Batch Normalization层来实现

梯度爆炸:由于使用了过大的学习率或者权重初始化过大导致在反向传播时梯度信息变得异常的大,权重更新步幅变大,网络发散;解决方法可以采用梯度裁剪、降低学习率、使用合适的初始化参数进行缓解;

梯度裁剪:当梯度的范数(或某个方向的梯度值)超过预定的阈值时,梯度裁剪会将梯度缩放到一定的范围内,以防止梯度爆炸对模型训练的影响

4:引入残差网络来解决退化的问题,传统的深度网络希望将每一层直接去拟合底层的映射H(x),深层网络在直接学习映射的过程中,需要通过多个非线性激活函数的组合来建模复杂的非线性映射。在梯度传播的过程中,这些非线性函数可能引起梯度的指数级衰减或增长,从而导致梯度消失或梯度爆炸问题。在深度残差学习中,每一层的任务是学习将输入 x 映射为底层映射 H(x)的残差 F(x),其中F(x)=H(x)’−x,每一层的输出 H(x)’ 会成为下一层的输入,继续传递给网络的后续层。这种逐层的残差学习方式使得网络更容易学习到底层映射 H(x),并且有助于缓解训练时的梯度问题,这样使得每一层都可以学习部分,最后累加为H(x)。表示为H(x)’+........+H’’’(x)=H(x)。

相关工作

残差表示

在图像识别中,VLAD[18]是一种表示方法,通过相对于字典的残差向量进行编码,而Fisher Vector [30]可以被公式化为VLAD的概率版本[18]。它们都是图像检索和分类的强大的浅层表示方法[4, 48]。对于矢量量化,编码残差向量[17]被证明比编码原始向量更有效。

在低级视觉和计算机图形学中,用于解决偏微分方程(PDEs)的广泛使用的Multigrid方法[3]将系统重新表述为多个尺度的子问题,其中每个子问题负责在较粗和较细的尺度之间的残差解。Multigrid的一种替代方法是分层基础预处理[45, 46],它依赖于表示两个尺度之间的残差向量的变量。已经证明[3, 45, 46],这些求解器的收敛速度比那些不了解解的残差特性的标准求解器要快得多。这些方法表明,良好的重新制定或预处理可以简化优化过程。

快捷链接

长期以来一直研究导致快捷连接的实践和理论[2, 34, 49]。训练多层感知器(MLPs)的早期实践是添加一个从网络输入连接到输出的线性层[34, 49]。在[44, 24]中,一些中间层直接连接到辅助分类器,以解决消失/爆炸梯度问题。[39, 38, 31, 47]的论文提出通过快捷连接实现对层响应、梯度和传播误差进行中心化的方法。在[44]中,一个“inception”层由一个快捷分支和几个更深的分支组成。与我们的工作同时进行,“highway networks” [42, 43] 提出了带有门控函数的快捷连接[15]。这些门是数据相关的,并且具有参数,与我们的无参数身份快捷连接形成对比。当门控制快捷连接“关闭”时(接近零),highway networks中的层代表非残差函数。相反,我们的公式总是学习残差函数;我们的身份快捷连接从不关闭,所有信息始终通过,还有额外的残差函数需要学习。此外,highway networks并没有展示在极度增加深度(例如,超过100层)时的准确性增益。

1:Multigrid(多重网格)是一种用于求解偏微分方程的数值方法,能够更快地收敛到解,其主要思想是将问题重新表述为多个尺度上的子问题,其中每个子问题负责在较粗和较细的尺度之间解决残差

2:残差表示(F(x)=H(x)−x)指的是相对于某个基准值的差异或残差,用于更有效地捕捉数据的特征;

3:Shortcut连接已经经过了很长的一段实践和理论研究过程,证明是有效的。

深度残差学习

3.1. 残差学习

让我们将H(x)视为要由几个堆叠的层(不一定是整个网络)拟合的基础映射,其中x表示这些层的第一个输入。如果假设多个非线性层可以渐近地逼近复杂的函数[2],那么等价于假设它们可以渐近地逼近残差函数,即H(x) − x(假设输入和输出具有相同的维度)。因此,我们不是期望堆叠的层逼近H(x),而是明确让这些层逼近一个残差函数F(x) := H(x) − x。原始函数因此变为F(x)+x。尽管这两种形式应该能够渐近地逼近所需的函数(如所假设的那样),但学习的容易程度可能会有所不同。

这个改写是由关于退化问题的反直觉现象驱动的(图1,左侧)。正如我们在介绍中讨论的那样,如果添加的层可以构造为恒等映射,那么深层模型的训练误差不应该超过其较浅的对应物。退化问题表明,求解器可能在通过多个非线性层逼近恒等映射方面存在困难。通过残差学习的改写,如果恒等映射是最优的,那么求解器可能简单地将多个非线性层的权重驱动到零,以接近恒等映射。

在实际情况下,恒等映射不太可能是最优的,但我们的改写可能有助于预处理问题。如果最优函数更接近恒等映射而不是零映射,那么对于求解器来说,通过参考恒等映射查找扰动应该更容易,而不是将函数学习为新函数。我们通过实验证明(图7),学到的残差函数通常具有较小的响应,这表明恒等映射提供了合理的预处理。

1:在ResNet中,传递给下一层的输入变为H(x)=F(x)+x,即拟合残差F(x)=H(x)-x;

2:实验证明学到的残差函数通常具有较小的响应,这表明恒等映射提供了合理的预处理。这意味着通过参考恒等映射查找扰动可能更容易,而不是将函数学习为全新的函数。

3:加了残差结构后,如果该层参数冗余,那么将通过快捷线跳过该层。

3.2. 通过快捷方式实现恒等映射

我们对每几个堆叠的层采用残差学习。建筑块如图2所示。形式上,在本文中,我们将建筑块定义为:

\[y = F(x, {Wi}) + x.\]

这里x和y是考虑的层的输入和输出向量。函数\(F(x, {Wi})\)表示要学习的残差映射。对于图2中具有两个层的示例,\(F = W2\sigma(W1x)\),其中\(\sigma\)表示ReLU[29],为简化符号而省略了偏差。通过快捷连接和逐元素相加执行F + x。我们在添加后采用第二个非线性(即\(\sigma(y)\),见图2)。公式(1)中的快捷连接既不引入额外的参数也不引入计算复杂性。这不仅在实践中具有吸引力,而且在普通和残差网络之间的比较中也很重要。我们可以公平地比较同时具有相同数量的参数、深度、宽度和计算成本(除了可以忽略的逐元素添加之外)的普通/残差网络。在公式(1)中,x和F的维度必须相等。如果不是这种情况(例如,当更改输入/输出通道时),我们可以通过快捷连接执行线性投影\(Ws\)来匹配维度:

\[y = F(x, {Wi}) + Ws x.\]

在公式(1)中,我们还可以使用方阵\(Ws\)。但我们将通过实验证明,对于解决退化问题和经济性而言,恒等映射已经足够,因此只有在匹配维度时才使用\(Ws\)。

残差函数F的形式是灵活的。本文的实验涉及具有两层或三层的函数F(图5),但更多

的层是可能的。但如果F只有一个单一的层,公式(1)类似于线性层:\(y = W1x+x\),我们没有观察到优势。我们还注意到,尽管上述符号是为了简单起见而关于全连接层的,但它们也适用于卷积层。函数\(F(x, {Wi})\)可以表示多个卷积层。逐元素相加是在两个特征图上逐通道执行的。

1:恒等映射在数学上就是F(x)=x;

3.3. 网络架构

我们已经测试了各种plain/残差网络,并观察到了一致的现象。为了提供讨论的实例,我们描述了ImageNet的两个模型。

普通网络

我们的plain基线(图3,中间)主要受到VGG网络[41](图3,左侧)的哲学启发。卷积层大多使用3×3的滤波器,并遵循两个简单的设计规则:(i)对于相同的输出特征图大小,层具有相同数量的滤波器;(ii)如果特征图大小减半,则滤波器的数量加倍,以保持每层的时间复杂度。我们直接通过具有步幅2的卷积层进行下采样。网络以全局平均池化层和具有softmax的1000路全连接层结束。在图3(中间)中,加权层的总数是34。

值得注意的是,我们的模型比VGG网络[41](图3,左侧)具有更少的滤波器和更低的复杂性。我们的34层基线有36亿的FLOPs(乘法-加法运算),仅为VGG-19(196亿的FLOPs)的18%。

残差网络

基于上述plain网络,我们插入了快捷连接(图3,右侧),将网络变成其残差版本。恒等快捷连接(公式(1))在输入和输出具有相同维度时可以直接使用(图3中的实线快捷方式)。当维度增加时(图3中的虚线快捷方式),我们考虑两个选项:(A)快捷方式仍然执行恒等映射,为增加的维度填充额外的零条目。此选项不引入额外的参数;(B)使用公式(2)中的投影快捷方式来匹配维度(由1×1卷积完成)。对于这两个选项,当快捷方式穿过两个大小的特征图时,它们会以步幅2执行。

1:plain网络基于VGG,同时特征图大小减半,滤波器增加一倍。模型相较于VGG有更少的计算复杂度;

2:在plain的基础上插入了快捷链接使其变成了残差网络,实线代表维度一样,直接相加 。虚线代表维度不一样(出现了下采样,步长为2的卷积),残差网络调整维度有两种方式,一是zero padding,二是利用逐点卷积升维;

3:ZeroPadding:在输入数据的周围添加零值,以扩展数据的尺寸,可以避免信息在卷积过程中的丢失,提高模型对输入数据的捕捉能力;

逐点卷积:1*1卷积,在深度残差网络中,逐点卷积经常用于网络的瓶颈结构,可以通过逐点卷积减小通道数,再通过逐点卷积增加通道数,以达到维度变换和非线性映射的目的;

3.4. 实现

我们在ImageNet上的实现遵循[21, 41]中的实践。为了进行尺度增强[41],图像被调整大小,其较短的一侧在[256, 480]范围内进行随机采样。从图像或其水平翻转中随机采样一个224×224的裁剪,减去每像素均值[21]。使用[21]中的标准颜色增强。我们在每个卷积层之后和激活之前采用批量归一化(BN)[16],按照[16]的做法。我们将权重初始化为[13]中的值,并从头开始训练所有普通/残差网络。我们使用小批量大小为256的SGD。当错误达到平稳状态时,学习速率从0.1开始,每次除以10,模型最多训练60×104次迭代。我们使用0.0001的权重衰减和0.9的动量。我们不使用[14]中的dropout,遵循[16]的实践。

在测试中,为了进行比较研究,我们采用标准的10-crop测试[21]。为了获得最佳结果,我们采用与[41, 13]相同的完全卷积形式,并在多个尺度上平均分数(调整图像大小,使较短的一侧在{224, 256, 384, 480, 640}中)。

1:图片被随机压缩至[256,480]范围内再进行图像增强;

2:每个卷积后或者激活函数前均采用BN,当错误率达到平稳,将学习率乘0.1;

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

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

相关文章

【嘉立创EDA-PCB设计指南】3.网络表概念解读+板框绘制

前言:本文对网络表概念解读板框绘制(确定PCB板子轮廓) 网络表概念解读 在本专栏的上一篇文章【嘉立创EDA-PCB设计指南】2,将设计的原理图转为了PCB,在PCB界面下出现了所有的封装,以及所有的飞线属性&…

代码随想录算法训练营29期|day 22 任务以及具体安排

235. 二叉搜索树的最近公共祖先 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root null) return null;//向左遍历if(root.val > p.val && root.val > q.val){TreeNode left lowestCommonAncestor(roo…

Redis和MySQL如何保持数据一致性

前言 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键…

基于springboot+vue的在线拍卖系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

redis数据安全(四)复制

关系数据库通常会使用一个主服务器向多个从服务器发送更新,并使用从服务器来处理所有读请求,Redis也采用了同样的方法来实现自己的复制特性,并将其用做扩展性能的一种手段。 一、特点: 1、异步复制:Redis默认使用的是…

Liunx:线程

我们先说一个程序是怎么执行的: 我们编写好一个代码,经过预编译,编译,汇编,连接,形成一个二进制文件被写进磁盘中,通常我们把他叫做可执行程序。 我们可以双击运行,运行需要经过几个…

Modern C++ std::mutex底层原理

前言 我时常有这样的疑问: std::mutex怎么就能保证后面的语句100%安全哪?CPU reordering就不会把这些语句重排到mutex前面执行?而且各个CPU都是有L1、L2缓存的,如果mutex后面要访问的的变量在这些缓存中怎么办? 带着…

sqlilabs第五十七五十八关

Less-57(GET - challenge - Union- 14 queries allowed -Variation 4) 手工注入 Less-58(GET - challenge - Double Query- 5 queries allowed -Variation 1) 手工注入 报错注入就可以(布尔注入的话次数不够)(所以我们前面需要做够足够的数据支持) 最后…

whistle代理+mock轻松解决“页面端“测试接口没数据难题

0、whistle是什么?怎么用? 自行百度,此处不再赘述! 1、示例演示(交易订单测试) 背景和痛点最近在测试一个小需求,需要涉及订单侧服务商品库侧服务库存侧服务财务侧线下交易服务。痛点主要在订…

abap 将xstring转换成PDF展示

收到外围系统的xstring之后,如何在sap中将其打开呢 1.创建一个屏幕 2.绘制一个customer control 3.创建流逻辑 4.流逻辑如下: DATA: go_html_container TYPE REF TO cl_gui_custom_container, go_html_control TYPE REF TO cl_gui_html_viewer, lv_u…

66.Go从零搭建一个orm框架【简版】

文章目录 一:前置学习1、 为什么要用orm2、Golang里面是如何原生连接MySQL的3、ORM框架构想 二: 开始造1、连接Connect2、设置/读取表名Table/GetTable3、新增/替换Insert/Replace4、条件Where5、条件OrWhere6、删除Delete7、修改Update8、查询9、设置查询字段Field…

序列到序列模型

一.序列到序列模型的简介 序列到序列(Sequence-to-Sequence,Seq2Seq)模型是一类用于处理序列数据的深度学习模型。该模型最初被设计用于机器翻译,但后来在各种自然语言处理和其他领域的任务中得到了广泛应用。 Seq2Seq模型的核…

介绍下Redis?Redis有哪些数据类型?

一、Redis介绍 Redis全称(Remote Dictionary Server)本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性…

Spring框架的背景学习

Spring 的前世今生 相信经历过不使用框架开发 Web 项目的 70 后、80 后都会有如此感触,如今的程序员开发项目太轻松了,基本只需要关心业务如何实现,通用技术问题只需要集成框架便可。早在 2007 年,一个基于 Java语言的开源框架正…

Python环境下基于自适应滤波器的音频信号(wav格式)降噪方法

Python的集成环境我一般使用的是Winpython,Winpytho脱胎于pythonxy,面向科学计算,兼顾数据分析与挖掘;Anaconda主要面向数据分析与挖掘方面,在大数据处理方面有自己特色的一些包;Winpytho强调便携性&#x…

Python Tkinter Grid布局管理器用法

很多时候 Tkinter 界面编程都会优先考虑使用 Pack 布局,但实际上 Tkinter 后来引入的 Grid 布局不仅简单易用,而且管理组件也非常方便。 Grid 把组件空间分解成一个网格进行维护,即按照行、列的方式排列组件,组件位置由其所在的行…

MySQL、Oracle 生成随机ID、随机数、随机字符串

目录 1 MySQL 生成随机ID1.1 生成 唯一的随机ID:UUID()1.2 生成随机数:RAND()1.2.1 RAND():返回一个介于0和1之间的随机浮点数1.2.2 FLOOR(RAND() * 100):返回一个介于0和99之间的随机整数1.2.3 LPAD(FLOOR(RAND() * 99999999), 8…

行为型设计模式——中介者模式

中介者模式 中介者模式主要是将关联关系由一个中介者类统一管理维护,一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即…

【上分日记】第380场周赛(数位dp+ KMP + 位运算 + 二分 + 双指针 )

文章目录 前言正文1.3005. 最大频率元素计数2.3007.价值和小于等于 K 的最大数字3.3008. 找出数组中的美丽下标 II 总结尾序 前言 本场周赛,博主也只写出两道题(前两道, hhh菜鸡勿喷),第三道涉及位运算 ,数位dp,第四道涉及KMP。 下…

c语言[]优先级大于*优先级

本博文源于笔者正在学习的c语言[]优先级大于*优先级.在定义二维数组时&#xff0c;a1与[]号结合后&#xff0c;谁的优先级更高&#xff0c;是本博文探讨的话题 博文来源 想要看看*与[]谁的优先级更高 博文代码 #include<stdio.h> #include<stdlib.h> int main(…