自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树基本操作

在构造函数的初始化列表中,将节点的值 `val` 初始化为参数 `x`,并将左右子节点的指针 `left` 和 `right` 初始化为 `nullptr`,表示初始时没有左右子节点。}`:如果当前节点不是叶子节点,则递归地统计左子树和右子树中度为0的节点个数,并返回它们的和。- `int count_Node_0(TreeNode* T) { ... }`:这是一个名为 `count_Node_0` 的函数,接受一个指向二叉树根节点的指针 `T`,返回度为0的节点个数。

2024-04-25 17:36:21 503 1

原创 树与二叉树

/ 定义二叉树节点结构体int val;// 节点值// 左子节点指针// 右子节点指针// 构造函数// 创建二叉树节点示例// 创建根节点,节点值为 1// 创建左子节点,节点值为 2// 创建右子节点,节点值为 3// 打印节点值// 释放内存,防止内存泄漏return 0;

2024-04-24 19:34:11 750

原创 leetcode--1--两数之和

尽管该方法时间复杂度较高,但对于小规模的问题或输入规模不大的情况下,仍然可以使用。但对于大规模的问题或输入规模较大的情况下,该方法的效率会较低,因此需要考虑使用其他更优化的方法来解决该问题,如哈希表等,来优化时间复杂度。因此,不随输入大小变化,空间复杂度为 O(1),即常数级别的额外空间消耗。因此,暴力求解法总体的时间复杂度为O(n^2),其中n是数组的长度。外层循环从索引0遍历到n-1,其中n是数组的长度,因此有n次迭代。除了存储输入数组和输出结果的空间外,该算法没有使用额外的空间。

2024-04-23 19:54:58 446

原创 图像处理相关知识 —— 椒盐噪声

椒盐噪声会影响图像的视觉质量和信息可读性,因此在图像处理中需要采取相应的去噪方法来恢复图像的清晰度和准确性。这些方法通过在图像中的像素周围计算滤波器内像素的统计数据来平滑图像,从而减少噪声的影响。椒盐噪声是一种常见的图像噪声类型,它会在图像中随机地添加黑色(椒)和白色(盐)的像素点,使图像的质量降低。这种噪声模拟了在图像传感器中可能遇到的问题,例如损坏的像素或传输过程中的干扰。最后,我们通过调用这个函数来生成带有椒盐噪声的图像,并使用。左图为原图,右图为加入椒盐噪声后的图像。显示原始图像和带有噪声的图像。

2024-04-09 18:26:06 410

原创 AI论文精读之CSPNet—— 一种加强CNN模型学习能力的主干网络

神经网络已经使得在计算机视觉任务如目标检测方面实现了令人难以置信的成果。然而,这样的成功在很大程度上依赖于昂贵的计算资源,这使得拥有廉价设备的人们无法享受到这一先进技术的好处。在本文中,我们提出了交叉阶段部分网络(CSPNet),以从网络架构的角度缓解之前的工作需要进行大量推断计算的问题。我们将问题归因于网络优化中的重复梯度信息。所提出的网络通过在网络阶段的开始和结束集成特征图来注重梯度的变化。

2024-04-09 15:55:55 941

原创 PANet网络

3. **路径聚合模块:** PANet引入了路径聚合模块来有效地融合不同尺度的特征信息。2. **自顶向下的信息传递:** PANet引入了自顶向下的信息传递路径,通过上采样或插值操作将高层特征传递到低层,以提高低层特征的分辨率和语义信息。值得注意的是,PANet 的设计结构提供了一种通用的多尺度信息聚合方法,可用于各种基于CNN的目标检测模型,并在许多竞赛和实际应用中取得了良好的效果。1. **多尺度特征提取:** PANet采用了自底向上的特征提取路径,从底层到高层逐步提取多尺度的特征表示。

2024-04-08 22:32:33 329

原创 FPN网络

的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量,但是不同的层次的特征图有巨大的语义差距,高分辨率的特征图只有低级特征,损害了表示能力,不利于目标识别。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。这些特征信息的提取是通过卷积操作和池化操作等方式来实现的。在自顶向下的过程中,最初的输入是来自网络的高层特征,这些特征通常具有较高的语义信息和较低的分辨率。

2024-04-08 22:12:46 762

原创 PyTorch-----torch.nn.Softmax()函数

是 PyTorch 中的一个类,用于计算 softmax 函数。softmax 函数常用于多分类问题中,将一个具有任意实数值的向量转换为一个概率分布,使得每个元素都在 (0, 1) 之间,并且所有元素的和为 1。其中,zi 是 logits 向量 z 的第 i 个元素,n 是 logits 向量 z 的长度(即类别的数量),e 是自然对数的底(约等于 2.71828)。Softmax 函数的一个关键特性是它的输出是一个概率分布,即所有输出值的和为 1,因此可以用于表示多个互斥的类别的概率。

2024-03-27 16:27:08 660 1

原创 PyTorch-----torch.flatten()函数

函数会将输入张量的指定维度范围内的所有元素展平到一个一维张量中。展平后的张量保持与原始张量相同的数据顺序。例如,如果输入张量是一个 3x4x5 的三维张量,然后你使用。函数将它展平,那么结果将是一个包含 60 个元素的一维张量,其中包含原始张量中所有的元素。是 PyTorch 中的一个函数,用于将输入张量展平为一维张量。函数将其展平为一个一维张量,并打印出了结果张量的大小。是一个形状为 (3, 4, 5) 的三维张量,使用。

2024-03-27 16:12:28 555

原创 Python中的解包操作----- * 的使用

【代码】Python中的解包操作----- * 的使用。

2024-03-27 10:05:31 103

原创 PyTorch----torch.nn.init.kaiming_normal_

具体而言,对于ReLU激活函数,Kaiming初始化方法使用了激活函数的非线性属性,将权重初始化为以0为中心、标准差为sqrt(2 / fan_in)的正态分布,其中fan_in表示输入的数量。Kaiming初始化方法用正态分布中采样的值初始化权重,该正态分布的均值为0,标准差根据层中使用的特定非线性计算。传统的初始化方法,如Xavier初始化,是根据输入和输出层的连接数来初始化权重的,但在使用ReLU激活函数时,这种方法可能导致梯度在反向传播过程中逐渐消失,尤其是在深度网络中。该参数影响如何计算标准差。

2024-03-27 09:31:30 1020

原创 PyTorch----torch.nn.Linear()函数

在这个例子中,linear_layer表示一个具有5个输入特征和3个输出特征的完全连接层。我们通过这一层传递一批形状为(2,5)的输入数据,得到一个形状为(2,3)的输出张量(批大小为2,3个输出特征)。线性层的权重和偏置在层创建时自动初始化,并在训练过程中进行更新,以最小化损失。torch.nn.Linear是PyTorch中的一个模块,用于在神经网络中实现完全连接层。bias(可选):如果设置为True(默认),层将学习一个附加的偏置项。它对应于输入张量中特征的个数。它对应于层中神经元的数量。

2024-03-26 21:05:48 271

原创 PyTorch----torch.nn.AdaptiveAvgPool2d()自适应平均池化函数

与输出大小由内核大小和步数决定的传统池层不同,在AdaptiveAvgPool2d中,您可以直接指定所需的输出大小。可以将其指定为单个整数output_size(结果为正方形输出)或元组(output_height, output_width)。在这个例子中,AdaptiveAvgPool2d用于将输入张量的大小调整为(5,5)的固定大小,而不考虑其原始维度。这个平均值成为相应的输出像素。取一个形状为(N, C, H, W)的输入张量,其中N为批大小,C为通道数,H和W分别为输入特征映射的高度和宽度。

2024-03-26 20:29:23 454

原创 PyTorch-----torch.randn()函数详解

requires_grad(可选):如果为True,则在反向传播期间将计算此张量的梯度。pin_memory(可选):如果为True,张量将被固定,从而使数据更快地传输到支持cuda的gpu。这将生成一个3x2张量,其中充满从标准正态分布中采样的随机数。dtype(可选):输出张量所需的数据类型。layout(可选):输出张量的内存布局。out(可选):输出张量。如果提供,结果将被写入这个张量,而不是创建一个新的张量。device(可选):分配张量的设备。size:指定输出张量维度的列表或元组。

2024-03-26 20:14:17 386 1

原创 python-当调用对象成员的时候,会和对象本身动态关联

同样,b对象调用B类中的sum方法,由于B类中没有sum方法,但又因为B类与A类构成继承关系,且A类中有sum方法,因此在执行b.sum()时会调用A类中的sum方法,A类中的sum方法返回的是 self.getI()+10,由于A类、B类中都存在getI()方法,那么此时,调用的是哪个类中的 getI() 方法呢?getI()方法,主要取决于self是哪个类型,那么我们就可以知道,此时这个self表示的就是B类这个类型,因此调用的这个getI()方法就是B类中的getI()方法,那么此时会返回30。

2024-03-20 17:47:57 193

原创 Python面向对象三大特征(封装、继承、多态)

在Python中,继承是面向对象编程中的一个重要概念,它允许一个类(称为子类)继承另一个类(称为父类)的属性和方法。通过继承,子类可以复用父类的代码,并且可以在不改变原有代码的情况下添加新的功能或修改已有功能。字面意思就是,一个类是另一个类的子类,那么这个类就可以拥有和父类一样的属性、方法。这就好比是现实当中,儿子会遗传父亲的性格、长相等。举一个现实中的例子,同样的一件事情,不同的人处理起来,他们的实现过程是完全不同的,会表现出不同的形态。

2024-03-20 17:03:41 652

原创 面向对象编程练习

编写类Book,定义方法update_price,实现更改某本书的价格,具体:如果价格大于150,则更改为150,如果价格大于100,则更改为100,否则不变。方法:def sum_ab(self)、def sub_ab(self)、def mul_ab(self)、def div_ab(self)update_price 完成功能:如果价格大于150,则更改为150,如果价格大于100,则更改为100,否则不变。定义一个圆类Circle,定义属性:半径,提供显示圆周长功能的方法,提供显示圆面积的方法。

2024-03-19 11:51:47 371

原创 Python--构造方法

由上图可以得知,程序在第22行给出 Redeclared '__init__' defined above without usage 警告,意思是说,上面的__init__方法还没有使用,又重新声明了上面定义的__init__方法。我们发现,程序会直接报错,错误的原因是,__init__()方法需要两个参数但是给了3个 ,也就是说,程序默认执行后一个__init__()方法。我们发现,self的地址与当前创建的对象的地址一样,则表明,self就是当前创建的对象p1。构造方法(构造器)基本语法。

2024-03-19 09:39:38 329

原创 Python--类中作用域

若将局部变量用于其他的成员方法中,程序会报错,如下图所示。其中,result是cal方法中的局部变量,若将该变量用于cry成员方法中,则会报错。4、属性和局部变量可以重名,访问时带上self,表示访问的属性,没有带self,则是访问局部变量。2、作用域的分类:属性作用域为整个类。即在整个类中,所有的成员方法都可以使用到属性。1、在面向对象编程中,主要的变量就是成员变量(属性)和局部变量。3、局部变量:成员方法中定义的变量,作用域在它的方法中。

2024-03-18 22:20:31 390

原创 Python对象作为参数传递到函数/方法的机制

我们先创建了一个Person类,类中有两个属性,分别为name属性和age属性,随后在Person类外创建了一个 f1 函数。随后通过执行下述代码创建了一个对象p1,相当于在我们的主栈区有了p1对象,这个p1指向数据区的一个空间,假设该空间的地址为0x1122。接下来执行代码,即我们给p1对象的name属性赋值为“jordan”,给age属性赋值为21,那么我们的内存图应如下所示。接下来,执行。

2024-03-18 21:29:57 813

原创 Python--成员方法、@staticmethod将成员方法静态化、self参数释义

在类中定义成员方法和定义函数基本一样(原理和运行机制一样),但还是有点不同(形式上有不同)

2024-03-18 17:04:55 775

原创 Python装饰器

在这个示例中,`my_decorator` 是一个装饰器函数,它将传入的函数在前后分别打印一些信息。通过 `@my_decorator` 将 `say_hello` 函数进行装饰,最终调用 `say_hello` 实际上是调用了经过装饰后的函数,输出了额外的信息。在 Python 中,装饰器(Decorator)是一种高级函数,用于修改其他函数的功能。装饰器可以在不改变原函数代码的情况下,添加额外的功能。通常情况下,装饰器是一个闭包,它接收一个函数作为参数,并返回一个新的函数。

2024-03-18 15:02:12 417

原创 YOLOv1预测阶段后处理----Non-maximum suppression(NMS非极大值抑制)

在目标检测中,不论是最初的region proposal,还是后来的anchor box,不可避免的一个问题就是对于同一个物体,会预测出多个bounding box,如下左图所示。而NMS所做的就是去除掉多余的bounding box,只保留和ground truth重叠度最高的bounding box,如下右图所示。

2024-03-15 10:03:08 974

原创 使用Make Sense为YOLOv5-5.0制作自定义数据集及应用

经过以上步骤后,我们在官方下载的 yolov5-5.0 代码中的 train.py 文件中指定代码处进行修改,如下所示,将data/coco128.yaml修改成mydata.yaml(我们在第1步创建的文件)即可。有两行代表有两个类别,0表示第一个类别,1表示第二个类别 ,我们刚刚设置第一个类别是狗,第二个类别是人,第三个类别是汽车。train后面是训练集的路径,val后面是验证集的路径 ,mydata/images/train中的train文件夹存放的是我们刚刚下载好的五张图片。

2024-03-14 20:30:57 1008

原创 Python---enumerate()函数

enumerate()` 函数接受一个可迭代对象作为参数,并返回一个枚举对象。每个枚举对象都是一个元组,包含两个值:索引和对应的元素值。除了默认的起始索引为 0 外,`enumerate()` 函数还可以接受一个可选的第二个参数来指定起始索引值。在这个示例中,我们有一个水果列表 `fruits`,通过使用 `enumerate()` 函数,我们可以在循环中同时获取索引和水果名称,并进行打印。`enumerate()` 是 Python 内置函数之一,用于在迭代过程中同时获取索引和元素值。

2024-03-13 14:59:28 338

原创 线性系统理论 -- 降阶观测器的设计

若系统能观测,且rankC=m,则系统的状态观测器的最小维数是(n-m)。这就是说,降阶观测器的维数为n-m=2。现只需要设计一个二阶状态观测器来估计。只需要选择合适的G1阵,使得。于是状态估计时,只需对 n-m=2 维的。试确定特征值为-3,-4的二维状态观测器。所有的特征值具有期望的特征值即可。对上述系统方程进行线性变换,线性定常时不变系统方程如下。

2023-11-28 16:55:12 1199

原创 现代控制理论 -- 能控性、能观性

若给定系统一个初始状态x(t0)(t0可为0),在t1>t0的有限时间区间[t0,t1]内,通过观测y(t),能够唯一地确定系统的初始状态x(t0),称系统状态在t0是能观测的。若给定系统的一个初始状态x(t0)(t0可为0),若在t1>t0的有限时间区间[t0,t1]内,存在容许控制u(t)使得x(t1)=0,则称系统状态在t0时刻是能控的。若系统对任意一个初始状态都能控,则称系统是状态完全能控的。若在任意的初始状态都能观测,则称系统是状态完全能观测的。

2023-11-28 09:54:36 571

原创 现代控制理论 --如何将连续系统离散化?

线性定常系统的系统方程为:经过离散化后,系统方程变为:举例:线性定常系统方程为:将其离散化。先求。确定G。确定H。确定C。C=C确定D。D=D=0。

2023-11-28 09:34:38 670

原创 链表的反转—c++版本

【代码】链表的反转—c++版本。

2023-11-23 11:22:02 105

原创 数据结构—链表

首先需要定义链表节点的结构。链表节点通常包含两个部分:数据域和指针域。数据域用于存储节点的数据,而指针域用于指向下一个节点。

2023-11-22 22:43:37 302

原创 死锁Deadlock

如下图所示,现有两个线程,分别是线程A及线程B,线程A持有锁A,线程B持有锁B。此时线程A想获取锁B,但锁B需等到线程B的结束才能解锁;而线程B想获取锁A,但锁A需等到线程A的结束才能解锁,这样就造成了线程A等线程B,线程B等线程A,从而出现死锁。

2023-10-27 17:09:24 308 1

原创 c++多线程

同步机制中的条件变量(condition variable)是一种用于线程间通信和协调的机制。它通常与互斥锁(mutex)结合使用,用于实现线程的等待和唤醒操作。条件变量提供了一个等待队列,线程可以在条件不满足时进入等待状态,并在条件满足时被唤醒。它的主要作用是允许线程在某个特定条件下等待,而不是忙等待(busy-waiting),从而减少资源的浪费。

2023-10-27 14:55:32 757 1

原创 并行与并发

如果 CPU 一会儿处理 word 进程一会儿处理听音乐的进程,起初看起来好像会觉得两个进程都很卡,但是 CPU 的执行速度已经快到让人们感觉不到这种切换的顿挫感,就真的好像两个进程在“并行运行”。所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容。当内核需要切换到另一个进程时,它 需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。在并发执行中,多个任务看起来是同时进行的,但实际上它们是交替执行的。

2023-10-25 19:13:57 94

原创 c++中 多线程执行时 线程的执行顺序不固定

由于线程的执行顺序是不确定的,所以在多线程编程中,不能依赖于线程的执行顺序来编写正确的程序。如果程序的正确性依赖于特定的线程执行顺序,那么这个程序可能会在不同的系统环境下产生不一致的结果。在多线程程序中,多个线程可以同时执行,并且它们的执行顺序是由系统调度器决定的。系统调度器根据各种因素(如线程的优先级、线程的状态等)来决定何时执行哪个线程,以及每个线程执行的时间片长度。为了保证多线程程序的正确性,需要使用适当的同步机制来协调线程之间的操作,例如互斥锁、条件变量、原子操作等。

2023-10-25 19:00:59 441

原创 主线程和子线程的区别

主线程是程序的起点,它负责创建和管理其他线程。主线程可以创建多个子线程,并且可以等待子线程完成后再终止。子线程的生命周期可以独立于主线程,可以在主线程运行期间创建和终止。在多线程编程中,合理管理主线程和子线程之间的关系非常重要,包括线程的创建、同步、通信等方面,以确保程序的正确性和性能。在多线程编程中,我们通常会涉及到主线程(也称为父线程)和子线程(也称为工作线程)。主线程按照顺序执行程序的逻辑代码,而子线程可以并行执行,与主线程同时进行工作。主线程负责创建和管理其他线程,而子线程是由主线程创建的。

2023-10-25 16:51:17 653

原创 C++ — 程序、进程、线程

程序、进程和线程都是计算机中的基本概念,它们之间有着密切的关系。程序是一组指令和数据的集合,需要被加载到内存中才能被计算机执行。程序通常由源代码编译而来,并经过链接、装载等操作生成可执行文件。程序本身是一个静态的概念,不会执行,只有被加载进内存并启动后,才成为一个活动状态的实体。每个进程都有自己独立的地址空间、堆栈、寄存器、文件描述符等资源,可以通过操作系统调度和管理,与其他进程并发执行。同一个程序可以启动多个进程,每个进程拥有独立的内存空间,相互之间不会直接影响。

2023-10-23 21:11:45 130

原创 C++文件和流

到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型:要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream> 和 <fstream>。 在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用

2023-10-23 20:09:10 532

原创 C++异常处理

异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。。当问题出现时,程序会抛出一个异常。这是通过使用throw关键字来完成的。在您想要处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常。try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。如果有一个块抛出一个异常,捕获异常的方法会使用try和catch关键字。

2023-10-23 11:58:17 56

原创 std::cerr

使用 `std::cerr` 的好处是它不像 `std::cout` 一样经过缓冲处理,因此在输出信息时不需要等待缓冲区满或遇到换行符才会输出。这意味着,当程序异常终止或崩溃时,`std::cerr` 输出的错误信息可以直接向上发送到调用链中的其他函数,从而帮助程序员更快地找出错误所在。这个程序首先定义了两个整数变量 `a` 和 `b`,其中 `b` 被初始化为 0。在错误处理代码中,使用 `std::cerr` 输出错误信息,并返回一个非零值以表示程序异常结束。是 C++ 标准库中的一个标准错误输出流。

2023-10-23 11:37:59 950

原创 const char* 、char、char*、std::string

const char*` 是一个指向字符常量的指针。它通常被用来表示以零结尾的字符数组(C 字符串)。这个指针指向了字符串在内存中的首地址,可以通过对指针进行解引用操作来获取具体的字符内容。注意,由于 `const char*` 指向的是字符常量,所以不能通过指针修改字符串内容。

2023-10-23 11:26:39 1003

空空如也

空空如也

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

TA关注的人

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