自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 深度学习八股

RMSprop将学习率分解成一个平方梯度的指数衰减的平均。Adam中动量直接并入梯度的一阶矩估计。其次,相比缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSprop,Adam还包括偏置修正,修正从原点初始化的一阶矩估计和二阶矩估计。本质上是带有动量的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要是经过偏置校正后,每一次迭代学习率都有一个确定范围,使得参数比较平稳。对图像和滤波矩阵做内积的操作就是卷积操作其中图像是指不同的数据窗口数据;

2024-09-09 16:27:05 1764

原创 直方图均衡

原始效果问题:过曝光图像的灰度级集中在高亮度范围内,而曝光度不足将使图像灰度级集中在低亮度范围内。过亮过暗的图像经过直方图均衡化,使得图像变得清晰。缺点:全局处理方式,对处理的数据不加选择,可能会增加背景干扰信息的对比度并且降低有用信号的对比度。均衡后的图像灰度级减少,某些细节会消失。解决:采用直方图均衡化会变换为均匀分布的形式,增加了像素之间灰度值差别的动态范围,从而达到增强图像对比度的效果。对在图像中像素个数多的灰度值进行展宽,对像素个数少的灰度值进行归并,从而增大对比度,使图像清晰,达到增强的目的。

2024-09-05 15:34:53 223

原创 C++基础语法21-40

编译:define是在编译的预处理阶段;const是在编译、运行的时候进行的安全性:define只做替换,不进行类型检查,const有数据类型,进行类型安全性检查内存:define宏定义的数据不分配空间,const只是变量的值不能改变,但是要分配空间24.C++中const和static的作用宏定义只做简单字符串替换;内联函数进行参数类型检查内联函数直接嵌入到代码中,减少函数调用开销,并且进行参数类型检查,具有返回值,可以实现重载。适用场景:使用宏定义的地方都可以使用inline。

2024-07-24 11:16:43 827

原创 卷积加速算法img2col、Winograd、FFT

空间域中矩阵的卷积算子,实际等于频率域中两个矩阵元素相乘。但卷积的方向是相反的。通常情况下,feature的尺寸要比卷积的尺寸大很多,如果对两者进行快速傅里叶变换的话,得出来的两个矩阵大小不一样,不能进行对应位置相乘。为了可以让他们对应位置相乘,必须要对卷积核进行扩充,将其扩充到feature尺寸大小相同。也正是扩充过程,限制了方法的使用,只有当feature尺寸和卷积核尺寸大小差不多的时候,才会采用这种方法。通常有三种卷积方式:full、same、valid。

2024-07-16 14:27:02 997

原创 校准器Calibration

通过计算KL散度(度量两个概率分布之间的差异程度),KL散度越大,两者差异越大,KL散度越小,两者差异越小。两者相同,KL散度为0。设定两个概率分布分别为P和Q,在设定为连续随机变量的前提下,他们对应的概率密度函数分别为p(x)和q(x)。如果我们用q(x)去近似p(x),则KL散度可以表示为:当且仅当P=Q时,KL=0。KL具备非负性,KL散度不具备对称性,P对Q的散度并不等于Q对P的KL散度,KL散度并不是一个度量,即并非距离。

2024-07-14 19:43:01 366

原创 912.排序组合

采用“分治”思想,选择一个基准元素base,通常选择第一个元素或者最后一个元素,通过第一轮扫描,比base小的元素都在base左边,比base大的元素在base右边,再有同样的方法递归排序这两部分,直到序列中所有数据均有序为止。

2024-07-13 10:44:14 137

原创 15.三数之和

去重 这个数要和前一个数一样,如果nums[i] == nums[i-1]并且保证i>0,continue。如果和>0 right--;和<0 left++;保证left>right nums[right] == nums[right--], right--保证left<right nums[left] == nums[left++],left++不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。

2024-07-12 09:36:52 231

原创 多光谱和高光谱及光谱仪成像原理

多光谱遥感涉及获取可见光、近红外、短波红外图像。多光谱图像捕获电磁光谱特定波长范围内的图像数据。捕获的不同材料在这些不同波长下反射和吸收不同。在这种成像方法中,可以通过在这些遥感图像中观察到的光谱反射特征来区分材料。高光谱遥感是一种分析宽光谱条带的技术,不仅仅是为每个像素分配原色,主要目标是从场景图像中每个像素获取光谱,查找对象、检测过程或识别材料。高光谱遥感对光谱中的各种带宽进行采样,旨在提供丰富的数据集并检测单带宽成像传感器不可见的感兴趣对象。1.波段数多光谱成像遵循低地球轨道和太阳同步。

2024-07-11 17:24:13 1414

原创 二刷 动态规划

什么是动态规划 Dynamic Programming DP如果某一问题有很多重叠子问题,使用动态规划时最有效的动态规划中每一个状态是由上一个状态推导出来的。动规五部曲1.确定dp数组以及下标的含义2.确定递归公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组

2024-07-02 21:37:21 994

原创 二刷 回溯算法

回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案。回溯解决的问题:组合问题:N个数里面按一定规则找到k个数的集合切割问题:一个字符串按一定规则有几种分割方式子集问题:一个N个数的集合里面有多少种符合条件的子集排列问题:N个数按一定规则全排列,有几种排列方式棋盘问题

2024-07-01 23:42:22 553

原创 二刷 二叉树

二叉树理论基础二叉树的种类:满二叉树和完全二叉树满二叉树:如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。深度为k,有2^k - 1个节点的二叉树。完全二叉树:除了最底层节点没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。二叉搜索树:一个有序树若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

2024-06-30 23:58:11 828

原创 李沐深度学习知识点—数值稳定性、模型激活函数、全连接层到卷积、卷积层

全连接层到卷积一张图片中找信息,不能所有点都检查一遍。需要满足两个原则。

2024-06-27 16:51:12 351

原创 YOLO系列改进

采用结构重参数化,(1)训练时,使用ResNet-style的多分支模型(特点:增加模型的表征能力)(2)测试时,转化成VGG-style的单线路模型(特点:速度更快、更省内存并且更加的灵活)Backbone:每个ResX包含1+2*X个卷积层,Darknet=1+(1+2×2)+(1+2×8)+(1+2×8)+(1+2×4)+FC全连接层(不包含)=53。Backbone:每个CSPX包含5+2*X个卷积层,1+(5+2×1)+(5+2×2)+(5+2×8)+(5+2×8)+(5+2×4)=72。

2024-06-25 15:13:54 1132

原创 小林图解系统-五.进程管理

线程是进程当中的一条执行流程。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。线程的优缺点?一个进程中可以同时存在多个线程;各个线程之间可以并发执行;各个线程之间可以共享地址空间和文件等资源;当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃举个例子,对于游戏的用户设计,则不应该使用多线程的方式,否则一个用户挂了,会影响其他同个进程的线程。

2024-06-25 09:54:14 693

原创 小林图解系统-九.网络系统 9.1什么是零拷贝?

早期 I/O 操作,内存与磁盘的数据传输的工作都是由 CPU 完成的,而此时。

2024-06-24 15:40:08 607

原创 小林图解系统-五.进程管理 5.5什么是悲观锁、乐观锁?

开发过程中,最常见的就是互斥锁的了,互斥锁加锁失败时,会用「线程切换」来应对,当加锁失败的线程再次加锁成功后的这一过程,会有两次线程上下文切换的成本,性能损耗比较大。如果我们明确知道被锁住的代码的执行时间很短,那我们应该选择开销比较小的自旋锁,因为自旋锁加锁失败时,并不会主动产生线程切换,而是一直忙等待,直到获取到锁,那么如果被锁住的代码执行时间很短,那这个忙等待的时间相对应也很短。如果能区分读操作和写操作的场景,那读写锁就更合适了,它允许多个读线程可以同时持有读锁,提高了读的并发性。

2024-06-24 13:46:24 899

原创 小林图解系统-五.进程管理 5.4.怎么避免死锁?

简单来说,死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。

2024-06-21 16:09:19 399

原创 小林图解系统-四.内存管理 4.1 为什么要有虚拟内存?

为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。

2024-06-21 10:27:15 991

原创 小林图解系统-三、操作系统结构

像微内核,内核里面会有一个最小版本的内核,其他模块在这个基础上搭建,实现的时候会跟宏内核类似,也就是把整个内核做成一个完成的程序,大部分服务都在内核中,像是宏内核包裹着一个微内核。微内核内核功能少,可移植性高,由于驱动程序不在内核,驱动程序会频繁调用底层能力,驱动和硬件设备交互就需要频繁切换到内核态,会带来损耗,华为的鸿蒙操作系统的内核架构就是微内核。宏内核和微内核的结合体,内核中抽象除了微内核的概念,也就是内核中会有一个小型的内核,其他模块在这个基础上搭建,整个内核是个完整的程序。

2024-06-20 20:44:51 754

原创 小林图解系统-二.硬件结构 2.7为什么0.1+0.2不等于0.3?

double尾数部分52位,float尾数部分23位,同事都带有一个固定隐含位,所以double有53个二进制有效位,float有24个二进制有效位,所以精度在十进制分别是log10(2^53)约等于15.95和log10(2^24)约等于7.22位,double有效数字式15~16位,float是7-8位,有效位包含整数和小数。不是所有的小数都可以用[完整]的二进制来表示的,比如十进制0.1在转换成二进制小数的时候,是一串无限循环的二进制数,计算机是无法表达无限循环的二进制数的。

2024-06-20 14:42:25 930

原创 小林图解系统-二.硬件结构 2.6什么是软中断?

Linux系统为了解决中断处理程序执行过长和中断丢失问题,将中断过程分为了两个阶段,分别是[上半部和下半部]。上半部用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。[打电话告诉配送员我正在下楼]下半部用来延迟处理上半部未完成的工作,一般以[内核线程]的方式运行。[下楼后跟配送员说其他事情]举例:网卡接受网络包,通过DMA方式将接收到的数据写入内存,通过硬件中断。

2024-06-20 10:22:18 867

原创 小林图解系统-二.硬件结构 2.5CPU是如何执行任务的?

5.2号核心修改变量B,发现2号核心的Cache 对应的Cache Line已失效,另外1号核心也有相同数据,且为已修改,所以要先把1号核心的Cache 对应的Cache Line写回内存,然后2号核心再从内存读取Cache line大小的数据到Cache,最后把变量B修改到2号核心的Cache,并标记为已修改。SCHED_RR:对于相同优先级的任务,轮流的运行,每个任务有一定的时间片,当完成时间片的任务会被放到队列尾部,保证相同优先级任务的公平性,但是高优先级的任务依然可以插队。

2024-06-19 15:14:37 577

原创 小林图解系统-二.硬件结构 2.4CPU缓存一致性

CPU 在读写数据的时候,都是在 CPU Cache 读写数据的,原因是 Cache 离 CPU 很近,读写性能相比内存高出很多。对于 Cache 里没有缓存 CPU 所需要读取的数据的这种情况,CPU 则会从内存读取数据,并将数据缓存到 Cache 里面,最后 CPU 再从 Cache 读取数据。写直达,只要有数据写入,都会直接把数据写入到内存里面,这种方式简单直观,但是性能就会受限于内存的访问速度;

2024-06-19 13:48:22 842

原创 二刷 栈与队列

栈提供push和pop等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。所以STL 队列也不被归类为容器,而被归类为container adapter(容器适配器)STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。都是可以的,主要就是数组和链表的底层实现。

2024-06-18 15:05:55 685

原创 BatchNormalization和Layer Normalization解析

是google团队2015年提出的,能够加速网络的收敛并提升准确率1.Batch Normalization原理图像预处理过程中通常会,如下图所示,对于Conv1来说输入的就是满足某一分布的特征矩阵,但对于Conv2而言输入的feature map就不一定满足某一分布规律了(而我们BN的目的就是使feature map满足均值为0,方差为1的分布规律。对于一个拥有d维的输入x,我们将对它的每一个维度进行标准化处理。

2024-06-17 18:17:07 1151

原创 Vision Transformer

模型由三个模块组成Linear Projection of Flattened Patches(Embeddind层)Transformer Encoder(编码层)MLP Head(最终用于分类的层结构)Embedding层结构详解对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[num_token, token_dim],如下图,token0-9对应的都是向量,以ViT-B/16为例,每个token向量长度为768.

2024-06-17 14:42:57 849

原创 Transformer中的Self-Attention和Multi-Head Attention

2017 Google 在Computation and Language发表当时主要针对于自然语言处理(之前的RNN模型记忆长度有限且无法并行化,只有计算完ti时刻后的数据才能计算ti+1时刻的数据,但Transformer都可以做到)文章提出Self-Attention概念,在此基础上提出Multi-Head Atterntion下面借鉴霹雳吧啦博主的视频进行学习:假设输入的序列长度为2,输入就两个节点x1,x2,然后通过Input Embedding也就是图中的f(x)将输入映射到a1,a2。

2024-06-17 11:47:28 795

原创 小林图解系统-二.硬件结构 2.3如何写出让CPU跑的更快的代码?

由于随着计算机技术的发展,CPU 与 内存的访问速度相差越来越多,如今差距已经高达好几百倍了,所以 CPU 内部嵌入了 CPU Cache 组件,作为内存与 CPU 之间的缓存层,CPU Cache 由于离 CPU 核心很近,所以访问速度也是非常快的,但由于所需材料成本比较高,它不像内存动辄几个 GB 大小,而是仅有几十 KB 到 MB 大小。用来标记对应的CPU Cache Line中的数据是否是有效的,如果有效位是0,无论CPU Cache Line中是否有数据,CPU都会直接访问内存,重新加载数据。

2024-06-16 23:56:59 933

原创 小林图解系统-二.硬件结构 2.2磁盘比内存慢几万倍?

CPU需要访问内存中某个数据,如果寄存器有这个数据,CPU直接从寄存器中取数据,如果没有,继续查询L1高速缓存,如果还没有,继续依次查询L2 L3,如果还没有,才去内存中取数据。从寄存器,CPU高速缓存,内存,硬盘,访问速度越来越慢,存储容量越来越大,造价越来越便宜,而且每个存储器只和相邻的一层存储设备打交道,于是行程了存储器的层次结构。一个bit的数据需要6个晶体管,所以存储密度不高,同样的物理空间,能存储的数据是有限的,不过也因为电路简单,所以访问速度快。如果寄存器的速度太慢,会拉长指令的处理周期。

2024-06-16 21:58:23 789

原创 小林图解系统-二.硬件结构 2.1CPU是如何执行程序的?

如果一个32位CPU的地址总线是32位,那么该CPU最大寻址能力是4G,及时加了8G大小的物理内存,也还是只能寻址到4G大小的地址,而如果一个64位CPU地址总线是458位,那么该CPU最大寻址能力是2^48,远超过32位CPU最大寻址能力。第一步,CPU读取程序计数器中的值,这个值是指令的内存地址,通过控制单元操作地址总线指定要访问的内存地址,接着通知内存设备准备数据,数据准备好后通过数据总线将指令数据传送给CPU,CPU收到内存传来的数据后,将指令数据存入指令寄存器。

2024-06-15 15:25:23 715

原创 CUDA算子优化:矩阵乘GEMM优化(三)

举例来说,要计算C矩阵1,2,3,4,5的元素的值,正常的顺序是调用FFMA指令先算1,再算2等。一般而言,如果并行策略不太行,那么计算指令的占比会很低,这样的话,访存所导致的latency很难被计算指令掩盖,计算效率会非常差。scott的sgemm在maxwell产生的汇编代码如下图左,为了比较,我们将GEMM(二)中的代码sgemm_v2最后生成的SASS码放在一起用比较。这里面有两个优化技巧,一个是寄存器的重映射,另一个是调整FFMA顺序,尽可能地在指令中使用.reuse标识以及提高双发射的效率。

2024-06-14 11:42:11 1023

原创 CUDA算子优化:矩阵乘GEMM优化(二)

A_TILE_ROW_START代表在这个维度为bm*bk的数据块中,当前线程需要搬运的数据的竖向坐标,而A_TILE_COL代表需要搬运的数据的横向坐标。那么我们需要开启(2048/128)*(2048/128)=256个block,每个block里面有(128/8)*(128/8)=256个线程,每个线程需要负责计算C矩阵中8*8=64个元素的结果,每个block负责256*64=16384个元素的结果。在一轮迭代中需要使用bm*bk的数据,为了加快后续的访存,所以需要进行一次转置。

2024-06-13 17:05:05 1434

原创 CUDA算子优化:矩阵乘GEMM优化(一)

采用最navie的GEMM算法,在GPU中,一共开启m*n个线程,每个线程需要读取矩阵A的一行和矩阵B的一列,而后将计算结果写回矩阵C中。其中,M=m/bm,N=n/bn,K=k/bk。当进行K轮迭代中某一轮迭代时,GPU将维度为bm*bk,bk*bn的小矩阵块存储到shared memory中,而后各个线程将shared memory中的数据存入register中进行计算。在完成以上的过程后,对于一个线程而言,它现在拥有:rm个A矩阵的寄存器值,rn个B矩阵的寄存器值,一级rm*rn个C矩阵的寄存器值。

2024-06-12 10:51:45 1052

原创 CUDA 算子优化:Softmax

把输入映射为0-1之间的实数,并且归一化保证和为1。max非黑即白,soft,输出是每个分类被取到的概率。定义:该元素的softmax值就是该元素的指数和所有元素指数和的比值定义的原因:1.softmax设计的初衷是希望特征对概率的影响是乘性的。2.多类目标分类问题的目标函数常常选为cross-entropy。

2024-06-11 16:43:37 1597

原创 二刷 字符串

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]

2024-06-06 10:45:52 420

原创 CUDA算子:reduce优化

现有问题。

2024-06-04 20:40:28 1169

原创 二刷 哈希表:数组 set map

当使用集合来解决哈希问题的时候,有限使用unordered_set,因为查询和增删效率最优。首先将数组排序,有一层for循环,i从下标0的地方开始,同时定一个下标left定义在i+1的位置,定义right在数组结尾的位置。map:是一个key val的数据结构,map中对key是有限制的,对value没有限制,因为key的存储方式是用红黑树实现的。实质:数组就是一张哈希表,哈希表中关键码就是数组的索引下标,通过下标直接访问数组中的元素。,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则。

2024-05-28 15:10:45 1012

原创 二刷 链表.移除链表元素;链表增删改查;链表翻转;两两交换链表中的节点;删除链表的倒数第N个节点;链表相交;环形链表

具体:两步走:1.fast两步,slow一步,在环内相遇点相遇,相遇后进行第二步,设置index1从此处出发,设置index2从head出发,在入口点相遇,就找到了入口点。:是一种通过指针串联在一起的线性结构,每一节点由两部分组成:数据域和指针域(存放指向下一节点的指针),最后一个节点的指针域指向null,链表的入口节点称为头节点:head。当n=1,x=z说明:从头节点出发一个指针,从相遇节点也出发一个指针,这两个指针每次只走一个节点,那么当这两个指针相遇的时候就是环形入口的节点。

2024-05-23 16:32:04 788 1

原创 数组6.螺旋矩阵

所有元素,且元素按顺时针顺序螺旋排列的。

2024-05-22 21:32:01 218 1

原创 三线性插值pytorch+cuda加速

CPU中呼叫Kernel-->GPU中的Grid-->n*Block(上限2^31 * 2^8)-->细分为n*nThread(上限1024)创建include文件夹,创建utils.h保存头文件, 引入声明,函数头和magicline CHECK INPUT是不是可用的tensor。C++加入后,要在utils.h头文件里声明trilinear_bw_cu函数, pip install .,完成build。feats:(N,8,F) N个正方体,8个顶点,每个顶点对应的特征。

2024-05-19 21:43:29 644 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除