【论文阅读】AlexNet——深度学习奠基作之一
原文链接
Step 1
1. title+abstract
-
第一句:告诉我干了什么事情
我们训练了一个很大很深的卷积神经网络,用来对120w个图片作分类,这里面有1000个类 -
第二句:结果
在测试集上面,top-1 error=37.5%,top-5=17.0%,比前面的结果都要好(这里的前两句是一种很少见的写法)
-
第三句:介绍
这个神经网络有6千万个参数和65w个神经元
神经网络有5个卷积层,一些MaxPooling层,三个全连接层,最后有一个100层的softmax -
第4、5句:训练方式
为了训练快一点,我们使用了非饱和神经元和能高效进行卷积运算的GPU实现(GPU的使用在2012年左右已经算是比较正常了,2007年NVIDIA出了CUDA库之后,12年往后GPU在机器学习界使用的很多,当时很多还是用matlab,里面有很多GPU的加速包)
为了减少全连接层的过拟合,我们应用了最近在发展的正则化方法“dropout”,这被证实非常有效 -
第6句:成果
我们把这个墨西哥放到了2012年的竞赛中,top-5=15.3%,这里第二名是26.2%
(这里的15.3开始会感觉和上面17.0有点矛盾,往后看)
不是一个非常好的摘要,更像一个技术报告
好处是很明确的告诉读者数据好,看到数据有需要的话就继续看
2. discussion
看完前面直接跳到最后
这篇文章是没有结论的,这只有一个讨论
讨论一般是吐吐槽,看看未来要干什么;结论一般是和摘要的一一对应
(所以没有结论通常说是比较少见的一个事)
- 总结一下是
- 深度卷积神经网络的表现:研究表明,使用纯监督学习的大型深度卷积神经网络在一个具有挑战性的数据库上取得了突破性的结果。
- 卷积层的作用:网络性能在去除任何一个卷积层后都会下降,尤其是去除中间层时,网络的top-1表现会下降约2%。这表明网络的深度对于取得这些结果至关重要。
(最后这个结论没错,但是前面,把一层conv拿掉然后数据降了2%,并不能说明深度一定是最重要的,也可能是参数没调好。AlexNet去掉一些层&更改中间参数,还是有办法达到同样效果的)
(除了深度很重要,宽度也是很重要的,不能很深2且很窄) - 无监督预训练的潜力:尽管实验中没有使用无监督预训练,但研究者认为无监督预训练有助于提升网络表现,尤其是在计算能力足够的情况下,能够增加网络规模而不增加标注数据的需求。
(深度神经网络的训练在当时是很难的,所以会用一些无标签的数据让他预热) - 未来方向:尽管当前实验结果随着网络规模和训练时间的增加而有所提高,但仍有许多进步空间,目标是接近人类视觉系统的推理时间路径。最终,研究者希望能在视频序列上使用非常大且深的卷积网络,利用时间结构来提供缺失或不明显的信息。
图表公式
(因为是看完discussion往上翻的,所以这里是倒着翻的)
左边展示测试结果
右边把神经网络最后的图片在倒数第二层的输出拿出来得到一个长的向量,给定一张图片,看一下这个向量上最近的图片是谁(横行),可以看出来找出来的内容都是和输入的图片是同一类的
(这篇文章没有讨论这个结果的重要性,但实际上这是整个实验里最重要的一个结果:深度神经网络的一个图片训练出来的最后的那个向量,在语义空间的表示特别好)
我的结果和其他结果的对比
上面是2个当前最好的结果,可以看到top1和top5的错误率都比这个文章要高的
视觉里面常见图
第一遍可能看不懂这张图,这里的细节可以放到最后一边来看
总结
第一遍读下来可以知道,这篇文章的工作结果特别好,是用神经网络做的
(具体为什么好,具体怎么做的,因为背景知识还不够,所以在第一遍可以跳过)
这个时候可以来决定要不要继续往下读
(在当时看到这篇文章的话,如果不是做这一部分可能就不看了,但是如果做图片分类领域,要继续看)
Step 2
第二遍:从头到尾读一遍,不懂的可以留到第三遍,主要目的是知道细节在做什么,去了解作者是怎么想的,作者是怎么表述内容的
(每篇文章都是有自己的观点的,每个作者对这个问题的认识是有一定的角度的,所以通过读论文我们可以清晰的感受到作者对整个问题的看法、他的角度、他是怎么认为的)
(经典论文现在看的时候会去看当时对技术的选择、对技术的描述在现在来看还是不是这个样子)
(其实里面对一个技术的描述、为什么做东西,在现在的观点来看都是错误的;而且里面有大量的细节在现在的角度来看是没有必要的)
1 Introduction
已经看过摘要和结论了,所以这里直接从intro往下读
一篇论文的第一段通常是在讲一个故事:
我们在做什么研究,在做哪个方向,这个方向有什么东西,他为什么很重要
这里介绍了 我们要用机器学习方法做目标识别,为了提升他的性能,我们要收集更大的数据集,学习更强的模型。使用更好的技术来避免过拟合(这基本是机器学习的正常途径,在之前大数据年代,大家一直关心收集更大的数据)
(过拟合代表了深度学习的一个派别,深度学习一般讲我可以用很大很大的模型,然后通过正则来使他不要过拟合–这是深度学习界在当时的认知–在当时很长一段时间大家都是这么做的,但是现在来看,正则好像没那么重要,不是最关键的,现在比较关键的是神经网络的设计)
后面开始讲数据,过渡到ImageNet数据集(这里因为title写的就是针对这个数据集,那一定要吹一波ImageNet特别好,因为他数据量大且类别多)
–第二段
直接讲如何做神经网络:这里用CNN来做(因为CNN在处理这类问题上是一个很好的模型),如何将CNN做的特别大(CNN做大不容易,会overfitting或者训练不动)
NT:这种写法有点问题,因为在当时主流大家不用CNN,大家用其他的模型,所以这里半句话不提别人的算法,直接只提CNN,是一个非常窄的视角
写论文的时候不要只说我这个领域这个小方向大概怎么样
– 第三段
CNN虽然很好,但是很难训练,训练不动(但是现在有GPU了,算力能跟上了)
– 第四段
我们的贡献:
- 我们训练了一个最大的神经网络,取得了特别好的结果,实现了一个GPU上2d的卷积
- 网络有一些新的和不常见的特性,能提升他的性能,降低他的训练时间,在第三章
- 如何避免过拟合,在第四章
- 我们的网络有5个卷积层,3个全连接层,并且发现深度很重要
2 The Dataset
这篇文章第二章就讲了dataset,毕竟标题第一个词就是ImageNet,卖点就是ImageNet的结果
第二段提到,2010年时公开测试集的,但是她们参加的2012年的竞赛不公开测试集,所以只能在网上提交,提交之后看到结果,所以只能报告一些结果(这也就是为什么摘要里面出现了两个不一样的top5)
第三段实际是非常重要的(但是在当时读的时候可能感觉不出来),这里提到ImageNet他的图片的分辨率是很不一样的,很多数据集是把图片裁好的,但是ImageNet没有,所以这里的处理是把每个图片做成256*256的图片
- 做法
- 将短边缩短到256,同时保证高宽比,长边也相应往下降(这时可能还是多于256的)
- 如果长边多于256,以中心为界把2个边裁掉
这里没有做图像的预处理,只做了裁剪,训练是在raw RGB values of the pixels上做的
(这篇文章没有将这里作为主要卖点,但是在之后的工作中,卖点就落在了end to end上,即原始数据直接输入,不做任何特征提取)
3 The Architecture(文章主要贡献1)
fig2是网络架构,包含8个学习层:5个conv+3个fully
后面描述网络里新的、不常见的特性,3.1-3.4小节按重要性降序排序
3.1 ReLu Nonlinearity
首先最重要的是使用了ReLu非线性函数
在标准的神经网络模型中,激活函数用的是tanh和sigmoid函数,但是这些饱和的非线性激活函数 要比非饱和的非线性激活函数要慢(这里没写原因,因为这是前人的成果,可以看引用20)
(现在的情况是不一定用relu,换别的激活函数也可以,但是现在也用relu,主要是因为简单)
3.2 多GPU训练
这部分第二遍可以不看这里(因为大概看不懂)
这种非常工程的细节可以放在第三遍或者后面浮现的时候再看
3.3 Local Response Normalization
第二遍可以忽略掉这里的公式(公式不复杂,但是对记号不熟悉的话 可以先忽略)
知道这里是一个normalization的东西,然后他能避免饱和
(放在现在看,这个东西不重要,几乎没人用到它,不是一个非常有必要的方案,且现在有更好的normalization技术)
3.4 overlapping Pooling
pooling层把前面的输出总结一下
一般来讲两个pooling之间是不会overlap的,但现在要overlap
这里要知道它对传统的pooling做了改动,改动不大但是他说效果会更好(知道他改的东西就ok)
3.5 Overall Architecture
(看原文)
这里存在的问题是,还是没有和其他工作的对比(比如强调卖点,我们和别人是不一样的,不需要预处理图片),所以这篇文章从文章上来讲就是一个技术报告,就讲了我做了什么东西,不讲我和别人的区别,也没有将为什么是这样为什么重要
但是工作重要一样可以是奠基之作哈哈
从现在的角度看这部分内容
一般讲神经网络的时候,经常会截Fig2来展示整个网络架构,但是这个图有点过分扣细节,不太好看懂
这里仔细看,第一张图往后都有上下两部分,这里实际是作者有2块GPU,他把图像横着切了一刀,一部分放到了GPU0,一部分放到了GPU1
在第三个卷积层的时候有一次输入的交叉
随着层数的增加,输入的宽高在减小,通道数在增加,后面可以理解为每一个通道识别输入的一种特定的模式(比如是识别毛腿还是边界等)——空间信息压缩,语义空间慢慢增加
最后(第五层)卷积完之后,进入全连接层
全连接层又有了两个GPU之间的通信
全连接层的输入 是 每个GPU在第五层卷积之后的输出 合并起来,合并成一个大的,但是在GPU上每个全连接层还是个做个的(每个做一个2048的全连接,但是最后的结果是两个GPU上的全连接要拼起来成一个4096的)
也就是说,全连接在进入最后一个分类层的时候,表示成了一个4096的向量
-
存在问题:
大家很多时候都没看过这个模型长设什么样子,因为他太复杂了,有两个原因- Alex在做这个工作的时候,为了能在当时的2块卡上训练这个模型,他强行把这个模型切开,切成了一个上下都有的(他觉得这是一个贡献,因为大概花了很多时间写了很多代码才实现这个切分)但是在现代角度来看,这事一个过于复杂的技术细节(因为即使是3GB的内存,把代码实现好一点一样能训练,如caffe)
- 把模型做到了2个GPU上,那后面有3个or4个GPU怎么切分(所以这个仅仅是一个数据集在自己的机器上是这么训练的,没有一定的通用性)
所以也就导致在未来一段时间大家都忽略掉整个这一部分的工作了(模型并行,model parallel)
但是近几年随着模型规模的增长(如BERT的出现),现在大家发现模型又训练不动了,大家又回到了要把模型切成几块的部分,使得能训练100亿、1000亿甚至10000亿的模型
(在当时觉得没用,但是近几年发现又有用了)
(在CV领域用的不多,但是NLP领域现在又称为了一个主流的一个方法)
4 Reducing Overfitting(文章主要贡献2)
提到了处理过拟合的几个方法
这里提到他是在CPU上做模型,在GPU上跑训练
但是这放在现在是不可行的,GPU的发展远超CPU的速度
所以这就导致,要是把这个东西用python写在CPU上跑,此时做数据增强可能是最花时间的东西,模型训练要比他快很多了
所以这个结论在当时看是成立的,但是现在看起来,数据增强很可能成为性能的瓶颈,很有可能要把他搬到GPU上或者用很好的C++来实现
4.1 Data Augmentation
最简单最常见的处理图像数据过拟合的方法是人工的将数据集变大。
- 这里使用了两个方法,是用的别人的工作
- 空间上抠图
图片进来是256256,在里面随机的扣一块224224的区域出来,这样大小就会变成原来的2048倍 - 变色
把整个RGB的channel,在颜色通道上做一些改变
这用的是一个PCA的方法(后面有讲PCA是怎么做的,这里第二遍可以先忽略,但是要知道第二个方案是在颜色通道上做改变)这一遍没看懂的地方可以先标记,等后面确定要继续看的时候再返回来看,可以去看一下这里引用的文章
- 空间上抠图
4.2 Dropout
为了减少测试误差,把多个模型放起来是很有用的(model ensemble)
但是这对深度学习消耗太大了(神经网络本来就很贵了,还搞模型融合)
所以这里用了Dropout技术(这是另外一篇文章,引用10,虽然也是这拨人做的)
这里随机的把一些隐藏层的输出 有50%的概率设成0
这相当于这个模型就变了,就每一次得到一个新的模型,但是这些模型之间的权重是共享的(除了那些设成0的层,非0层大家都是一样的)
作者的思路是,这样每一次都能得到一个新的模型,然后等价于是很多模型做融合
但是后来大家发现,Dropout好像也不是在做模型融合,更多时候Dropout就是一个正则项
(几年之后她们又重新写了一篇文章,来说明Dropout在线性模型上等价于一个L2正则项,在更复杂的模型上也等价于是一个正则的效果,但是无法构造出跟他相等的一个正则的东西)
文章把dropout放到了前面2个全连接层上,如果没有dropout的话,过拟合会非常严重;如果有dropout,训练回避别人慢2倍
所以这里,AlexNet用了3个全连接,最后一个输出是必须有的,中间2个很大的4096的全连接,是他的一个大瓶颈——>这是当时设计的一个缺陷,所以导致整个模型特别大,根本放不进GPU中
现在CNN的设计不会用这么大的全连接,所以dropout就显得没那么重要;而且GPU、内存也没那么吃紧了
不过dropout在全连接上还是非常有用的,在RNN、Attention相关内容中 dropout用的非常多
5 Details of learning
讲述模型是如何训练的
这里用了SGD(随机梯度下降)进行训练——>在这个文章之后SGD基本上在机器学习界称为了最主流的一个优化算法
(现在大家都知道SGD是训练深度学习很常用的方法,但是在当年不是,因为SGD调参相对来说比较难调,大家更愿意用一些更稳定的方法,比如L-BFGS甚至是GD来计算,相对调参更容易些。但是后来发现SGD里面的噪音对模型泛化是有好处的,所以现在都用SGD了)
这里提了几个参数,然后提到发现用了一点点weight decay在模型学习过程中是非常重要的(后面也提到了weight decay是怎么实现的)
weight decay当时在机器学习界主流上应该叫做L2 regularization,但是这篇文章以及整个神经网络里面喜欢用weight decay,这样这个东西他不是加在模型上,而是加在优化算法上。虽然她们两个是等价的关系,但是因为深度学习的觉醒,所以现在大家都交weight decay了
momentum参数:当优化的表面非常不平滑的时候,这个冲量使得不要被当下的梯度太多的去误导,可以保持一个冲量,从过去的方向沿着一个平缓的方向往前走。这样就不容易陷入到因为表面不那么平滑,掉到坑里面去
权重是用均值=0,方差=0.01的高斯随机变量来初始化的
0.01的取值是大家发现这个值还不错,也不大也不小,而且对很多网络都可以。
不过对一些很深的网络肯定还是要做更多优化,AlexNet从现在角度来看 是一个比较简单的神经网络,0.01是一个不错的选项。
像现在比较大的BERT,也就用了0.02
在第2、4、5的卷积层以及全连接层,将偏移初始化为1,剩下的初始化为0
这里就比较奇怪了,因为偏移本质上来说如果数据比较平衡的话一般是初始化为0的,但是他这里发现1比较好(后面发现初始化为0也可以,所以这个技术在后面用的是比较少的)
文章每一层用同样的学习率,学习率设置从0.01开始,发现验证误差不往下降了,就手动的将学习率降10倍
(在后面很长一段时间,都是这么做的;但是后来发现也没那么复杂,比如resnet,训练120轮,就每30个epoch下降0.1;还有一种主流做法,前面可以做更长一点,必须能够60轮或者100轮,再在后面再下降)
(不过现在不直接这么用了,一般采用更平缓的方式 比如cos曲线来降低学习率)
而且0.01的选择也很重要,太大会爆炸,太小学不动
所以现在的主流做法是,从0开始,然后慢慢上去,再慢慢下去。从曲线上看,随着epoch增加,初始是很小的值,然后先线性上去到一个很大的值之后,再cos曲线下降
AlexNet的做法是阶梯下降,每次下降10倍,但是什么时候下降是手动选的
后面提到他训练了90个cycle(也即90 epoch),每一遍是用ImageNet完整的120w张图片,需要5-6天在2个NVIDIA GTX上训练
(这个时间在当时算是比较长的了,调一次参需要等5-6天才能知道结果)
6 result
主要理解和别人相比的优势
这里看原文就可以
我们在看的时候很多时候并不关注实验是怎么做的,更多关注实验的结果
因为除非你是这个领域的专家,看一眼就大概能懂;如果是刚进入这个领域,很多时候不需要太关心这些细节,除非要去重复他的实验
只有在需要重复他的实验、审论文或者你是这一领域专家的时候,才会大概去看一下他的实验
这里比较有意思的是他报告了他在完整ImageNet上运行的时间
完整Image有890w个数据,10184个分类
对于表2,之前有提只有2010年时提供了测试数据,后面需要到网上提交他的数据才可以
所以这张表中只报告了5层和7层CNN的相对结果,其余两个是空掉了
右边他把2012的称测试集,把中间2010的叫验证集
这是文章非常好的一点,因为现在机器学习里面,很多时候大家是搞混测试集和训练集还有验证集的
(验证集可以一直测用来调参,测试集相对来说应该就测那么1次)
ImageNet也允许每天提交几次,所以也不是真正意义上的测试集
6.1 Qualitative Evaluation
来对网络进行评估
这里提到发现了一个比较奇怪的现象,因为他是在2个GPU上训练的(这样就是,比如卷积输出通道是256的话,两个GPU各算128),GPU1上学习到的基本都是和颜色无关的特征,GPU2上都是和颜色相关的特征
选择要不要接着看
这样看完一遍会比看博客等看到更多的细节
后面就可以选择要不要继续往下看
继续看的话里面还有很多东西不是很懂,这里就可以去看一下里面引用的那些文章(所以记得做标记!)看一下这些技术是怎么描述的,再回来看这里是怎么用的
相关文章:
【论文阅读】AlexNet——深度学习奠基作之一
原文链接 Step 1 1. titleabstract 第一句:告诉我干了什么事情 我们训练了一个很大很深的卷积神经网络,用来对120w个图片作分类,这里面有1000个类 第二句:结果 在测试集上面,top-1 error37.5%,top-517.0…...
【云原生技术】编排与容器的技术演进之路
一、编排与容器的技术演进之路 1.1 DockerClient 此时 K8s 只是编排领域的一个选择,而 Docker 此时一家独大,所以 K8s 的客户端只 是作为 Docker 的客户端来调用 Docker 引擎来完成服务。 1.2 RUNC&Shim OCI催生 runcrunc,剥离 Docke…...
鸿蒙编译框架插件HvigorPlugin接口的用法介绍
鸿蒙系统中HvigorPlugin接口实现自定义编译插件,实现编译前后自定义功能。 在鸿蒙(HarmonyOS)开发中,HvigorPlugin 是用于扩展 Hvigor 构建工具功能的接口。通过实现此接口,开发者可以自定义构建任务、修改构建流程或…...
Springboot+mybatis实现增删改查操作
继续写一下删除操作,删除有些不一样,首先在controller里面,我们需要改一下路由,我们后面要写/{id}传入路径参数,用PathVariable注解绑定id,剩下的都一样,传入id,然后写service和mapp…...
Java中的I/O
1.I/O流 1.1I/O概述 1.2.基本用法 1.3.字节输出流写数据的细节 1.4.FileOutPutStream写数据的三种方式 明天再更~~~~,先混个流量券。...
前端组件封装艺术:设计原则与最佳实践指南
文章目录 一、组件封装的核心原则1.1 设计原则概览1.2 组件生命周期 二、组件设计准则2.1 单一职责原则2.2 高内聚低耦合 三、组件接口设计3.1 Props设计规范3.2 代码示例 四、组件状态管理4.1 状态设计原则4.2 代码示例 五、组件样式处理5.1 样式方案对比5.2 代码示例 六、组件…...
SpringMVC(五)拦截器
目录 拦截器基本概念 一 单个拦截器的执行 1 创建拦截器 2 SpringMVC配置,并指定拦截路径。 3 运行结果展示: 二 多个拦截器的执行顺序 三 拦截器与过滤器的区别 拦截器基本概念 SpringMVC内置拦截器机制,允许在请求被目标方法处理的…...
jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.
无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样,还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…...
【红黑树】—— 我与C++的不解之缘(二十五)
前言 学习了avl树,现在来学习红黑树。 一、什么是红黑树 红黑树是一颗平衡二叉搜索树,它每一个节点增加了一个存储位表示节点的颜色,可以是红色或者黑色。 相比较于AVL树,红黑树也是一个自平衡二叉搜索树,但是它与AVL树…...
机器学习 Day05 pandas库
1.pandas介绍和优点 Pandas 是 2008 年由 Wes McKinney 开发的开源 Python 库 。它专门用于数据挖掘和数据分析,具有以下特点: 数据结构独特:核心数据结构为 Series(一维)和 DataFrame(二维) …...
布达佩斯召开 | 2025年第五届能源与环境工程国际会议(CoEEE 2025)
会议简介 Brief Introduction 2025年第五届能源与环境工程国际会议(CoEEE 2025) 会议时间:2025年7月25日-27日 召开地点:匈牙利布达佩斯 大会官网:www.coeee.org CoEEE 2025将围绕“能源与环境工程”的最新研究领域而展开,为研究人…...
[C语言日寄] qsort函数的练习
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
单引号与双引号在不同编程语言中的使用与支持
在编程语言中,单引号和双引号是常见的符号,它们通常用来表示字符和字符串。然而,如何使用这两种符号在不同的编程语言中有所不同,甚至有一些语言并不区分单引号和双引号的用途。本文将详细介绍不同编程语言中单引号与双引号的支持…...
Next.js项目实战——MindAI
我的整个毕业论文,是基于Next.js搭建完成的。项目的搭建过程分为多个章节,循序渐进: 1.环境准备与项目初始化 Node.js和npm的安装配置创建Next.js 14项目TypeScript配置项目目录结构说明Git初始化和.gitignore配置 2.基础架构搭建 Tailwi…...
MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。
2025-03-13,由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架,通过合成自挑战问题来增强视觉-语言模型(VLMs)的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练,显著提升了模型在推理深度和广度上的表…...
WPS的Excel文档如何利用VB脚本批量替换超链接的内容
准备知识 关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】 https://blog.csdn.net/wenhao_ir/article/details/146212767 激活WPS的Excel文档中的VB编辑器功能 没有激活前的截图如下: 原因是我们的电脑中缺乏VBA插件,我们点击“开发工具”:…...
phpstudy+phpstorm+xdebug【学习笔记】
配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接::https://blog.csdn.net/m0_60571842/article/details/133246064...
(包清楚解疑)ES6中__dirname和__filename不见了吗?,到底怎么用
我们知道,在commonJs中,__dirname和__filename分别表示当前js文件所在目录路径和所在路径的绝对路径。可以直接使用,但是在ES6和Node v20.11.0之后,不能直接用了。 首先明确一下这两个变量为什么会用到: 当我们在使用…...
3.4 基于TSX的渲染函数类型安全实践
文章目录 1. TSX与类型安全的核心价值1.1 TSX的独特优势1.2 类型安全的核心收益2. 基础类型安全实践2.1 组件Props类型约束2.2 子元素类型校验2.3 事件类型系统3. 高级类型安全模式3.1 泛型组件设计3.2 高阶组件类型3.3 类型守卫应用4. 类型操作工具集4.1 实用类型工具4.2 类型…...
vue-draggable-plus实现某些子元素不被拖拽
在使用vue-draggable-plus时倘若只是节点里面所有元素都可以拖拽倒还好实现,但遇到某些子元素是作为其他作用不可拖拽或者可拖拽不可替换这些情况,则比较头疼了 解决: 1. 绑定移动事件 2. 处理移动世界并对对应情况返回false //移动事件 co…...
基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别
【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目,以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别(应该还有好多种其他方式是我不知道的,主要应该就是要知道关键的流程步骤ÿ…...
二进制数(十进制转二进制)
二进制数 #include<stdio.h> int main(){int n;while(scanf("%d",&n)!EOF){int a[10000];int i0;if(n0){printf("0\n");continue;}while(n){a[i]n%2;i;nn/2;}for(int ji-1;j>0;j--){printf("%d",a[j]);}printf("\n");}…...
一周学会Flask3 Python Web开发-SQLAlchemy添加数据操作-班级模块
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy提供session.add()方法添加model实体数据,以及提供session.commit()提交事务。 首先list.html加一个添…...
【python】OpenCV—Hough Circle Transform
文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考 更多有趣的代码示例,可参考【Programming】 1、功能描述 2、代码实现 载入必要的库 import sys import cv2 as cv import numpy as np函数入口 if __name__ "__main__&qu…...
1216走迷宫
1216走迷宫 ⭐️难度:简单 🌟考点:bfs 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {public static void main(String[] …...
Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测
SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…...
医疗资源联动,广州长泰医院与海南德雅医院共筑地贫防治新篇章
为贯彻落实"健康中国"战略关于出生缺陷综合防治的部署要求,推动地中海贫血防治体系建设。2025年3月15日,广州长泰医院与海南德雅医院联合主办的“地中海贫血生殖遗传干预大型义诊暨合作签约仪式”在广州正式启动,活动以“爱与希…...
栈区、堆区、静态区
一、栈区(Stack) 1.栈区是什么 •栈区(Stack)是计算机内存中的一部分,用于存储程序运行时的临时数据。 2.栈区的有关性质 (1)存储临时数据 • 栈区主要用于存储局部变量(比如函…...
SpringBoot整合Swagger (Springfox 3.0.0)
Maven依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> 配置文件设置 # 解决"Unable to infer base url"错误的关键配…...
ShenNiusModularity项目源码学习(16:ShenNius.Admin.Mvc项目分析-1)
ShenNius.Admin.Mvc项目是MVC模式的启动项目,包括了MVC模式下所需的所有的页面、控制器类、资源、js文件等数据,该项目仅依赖ShenNius.Admin.API项目,主要使用后者的ShenniusAdminApiModule模块类及一些依赖项目中定义的辅助类等。本文学习Sh…...
Flutter PopScope对于iOS设置canPop为false无效问题
这个问题应该出现很久了,之前的组件WillPopScope用的好好的,flutter做优化打算“软性”处理禁用返回手势,出了PopScope,这个组件也能处理在安卓设备上的左滑返回事件。但是iOS上面左滑返回手势禁用,一直无效。 当然之…...
第十次CCF-CSP认证(含C++源码)
第十次CCF-CSP认证 分蛋糕满分题解 学生排队满分题解 Markdown语法题目解读满分代码 结语 分蛋糕 题目链接 满分题解 基本思路:我们需要保证除了最后一个小朋友之外的所有人,分得的蛋糕都大于等于给定的K值,为什么是大于等于,是…...
leetcode51.N 皇后 回溯算法求解 + 效率优化
🎯 这篇文章探讨了解决经典N皇后问题的方法,采用回溯算法在标准棋盘上放置皇后,确保它们之间不能相互攻击。文中首先介绍了基本的思路和实现方式,通过递归尝试每个可能的位置并回退错误选择。为了提升效率,进一步提出了…...
使用 PerformanceObserver 实现网页性能优化的最佳实践
前言 在当今的网页开发中,性能监控已经成为确保用户体验的一个关键部分。用户对网站的速度和响应性越来越敏感,性能问题可能直接影响用户的满意度和留存率。因此,了解并使用合适的工具来监控和优化网页性能显得尤为重要。 今天,我…...
单口路由器多拨号ADSL实现方法
条件是多拨号场景,公司路由器接口不够用...
HW基本的sql流量分析和wireshark 的基本使用
前言 HW初级的主要任务就是看监控(流量) 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 (我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…...
Vue 过滤器深度解析与应用实践
文章目录 1. 过滤器概述1.1 核心概念1.2 过滤器生命周期 2. 过滤器基础2.1 过滤器定义2.2 过滤器使用 3. 过滤器高级用法3.1 链式调用3.2 参数传递3.3 动态过滤器 4. 过滤器应用场景4.1 文本格式化4.2 数字处理4.3 数据过滤 5. 性能优化与调试5.1 性能优化策略5.2 调试技巧 6. …...
基于 Docker 搭建 FRP 内网穿透开源项目
有些配置项不知道该不该用,不知道该在哪用,不知道怎么用,所以我自己写个文章简单记录一下做个笔记 本文介绍的是基于 Docker 运行 frps 和 frpc,并通过 TCP 协议简单穿透 SSH 和 HTTP,在观看本文之前请确保你的机器已经安装 Docker 服务端搭建 frps# 连接拥有公网 IP 的…...
【Git学习笔记】Git结构原理及其分支管理模型分析
【Git学习笔记】Git结构原理及其分支管理模型分析 🔥个人主页:大白的编程日记 🔥专栏:Git学习笔记 文章目录 【Git学习笔记】Git结构原理及其分支管理模型分析前言一.认识工作区、暂存区、版本库1.1 版本回退1.2 撤销修改1.3 删…...
找工作、创业的思考和出路
最近有几位朋友在找工作,以及探索职场出路,与他们聊了一些关于找工作和职业发展的话题。而这些话题对大多数职场人来说,都是必须考虑和面对的问题。今天就基于这两个话题展开聊聊。 首先,初入职场时,工作是相对容易找…...
2024山东大学计算机复试上机真题
2024山东大学计算机复试上机真题 2024山东大学计算机复试机试真题 历年山东大学计算机复试上机真题 历年山东大学计算机复试机试真题 在线评测:传动门:pgcode.cn 最长递减子序列 题目描述 输入数字 n,和 n 个整数,输出该数字…...
FLASK和GPU依赖安装
1. 安装所有依赖包 在终端运行以下命令(如果使用 GPU,请确保已安装 CUDA 驱动): # 安装 Flask 和其他依赖 pip install flask sentence-transformers torch# 如果是 GPU 环境,推荐安装 CUDA 版本的 PyTorchÿ…...
【图论】并查集的学习和使用
目录 并查集是什么? 举个例子 组成 父亲数组: find函数: union函数: 代码实现: fa[] 初始化code: find code: 递归实现: 非递归实现: union code : 画图模拟: 路径压缩:…...
3.9/Q2,Charls最新文章解读!
文章题目:Association between remnant cholesterol and depression in middle-aged and older Chinese adults: a population-based cohort study DOI:10.3389/fendo.2025.1456370 中文标题:中国中老年人残留胆固醇与抑郁症的关系࿱…...
用Python和Pygame实现打砖块游戏
标题:用Python和Pygame实现打砖块游戏 摘要: 本文将介绍如何使用Python和Pygame库实现一个经典的打砖块游戏。通过这个项目,你将学习到Pygame的基本用法、游戏循环、碰撞检测等知识。 1. 打砖块游戏简介(完整代码在末尾) 打砖块是一款经典的…...
自动化测试-网页聊天室
项目介绍: 针对基于WebSocket协议的网页端即时通讯系统,主导设计并实施全流程自动化测试方案。通过构建模块化测试框架,完成对核心业务场景(用户登录鉴权、消息同步、实时聊天等)的自动化验证,最终达成测试…...
Linux第三次练习
1、创建根目录结构中的所有的普通文件 首先在根目录下面新创建一个test目录,然后将查找到的普通文件新建到test目录下 2、列出所有账号的账号名 3、将/etc/passwd中内容按照冒号隔开的第三个字符从大到小排序后输出所有内容 4、列出/etc/passwd中的第20行-25行内容…...
Redis学习
最开始使用的是MySQL,其使用的是磁盘IO方式较慢,无法满足一分钟成千上万次的访问,而使用内存IO的Redis就可以较好的满足。 Redis是NOSQL(Not Only SQL)中的键值存储数据库,性能好较灵活,是在内存中进行存储。 可以通…...
【CSS3】化神篇
目录 平面转换平移旋转改变旋转原点多重转换缩放倾斜 渐变线性渐变径向渐变 空间转换平移视距旋转立体呈现缩放 动画使现步骤animation 复合属性animation 属性拆分逐帧动画多组动画 平面转换 作用:为元素添加动态效果,一般与过渡配合使用 概念&#x…...
【C/C++算法】从浅到深学习--- 前缀和算法(图文兼备 + 源码详解)
绪论:冲击蓝桥杯一起加油!! 每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章将使用八道题由浅到深的带你了解并基本掌握前缀和思想,以及前缀和的基…...