- 博客(256)
- 资源 (2)
- 收藏
- 关注
原创 使用工具记录[长期更新]
备注: --additional-suffix表示后缀,-l表示每个文件分得的行数,your_file_part_为切分后文件的前缀。这样,你就可以将 Python 脚本挂起在后台运行,并且在没有终端连接的情况下继续执行。这个命令会实时查看 output.log 文件的内容。
2025-02-15 11:03:58
338
2
原创 Batch Normalization (BN) 和 Synchronized Batch Normalization (SyncBN) 的区别
BN:适用于单卡或大 batch 训练,计算开销低,但多 GPU 训练时统计量不同可能导致问题。SyncBN:适用于多 GPU 训练,能保证所有 GPU 共享相同的统计量,提高小 batch 训练的稳定性,但计算开销较高。
2025-02-11 23:24:57
639
3
原创 python并行计算---concurrent.futures模块的使用方法
在 Python 中,可序列化的对象意味着该对象可以被“序列化”(即转换成字节流),然后在不同进程之间传递。Python 使用 pickle 模块来实现这种序列化,因此所有传递给 ProcessPoolExecutor 的参数和返回值都必须是 pickle 支持的类型(例如基本数据类型、列表、字典、元组等)。
2024-11-13 11:45:21
1333
原创 vector 使用push_back 和emplace_back的区别
如果已有一个对象实例,且只需将其添加到容器中,push_back并且emplace_back差异不大,但emplace_back通常会更快一些。如果需要构造一个新对象,并直接添加到容器中,优先使用emplace_back,以提高性能和简化代码。empalce_back不能完全代替push_back。
2024-10-30 23:47:35
500
原创 BatchNorm推理阶段和Conv合并
本文全文来自: https://www.cnblogs.com/xiaxuexiaoab/p/16422640.html。只只作为自己的复习使用,不作他用。
2024-10-30 23:29:06
369
原创 设计模式---中介者模式
定义:用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,属于行为型模式。设计思路:用一个中介对象来封装一系列的对象交互操作,中介者模式使得对象之间不需要显示的相互引用,从而使得系统或模块内部相互解耦,而且可以独立的改变它们至今的交互。
2024-09-13 14:26:07
723
原创 观察者模式与hook机制的联系
在 PyTorch 中,hook 机制提供了一种在模型的前向传播和反向传播过程中插入自定义操作的方式。这可以帮助开发者在不改变模型本身的情况下,检查或修改模型的输入、输出和梯度信息。主要有两类 hook:前向传播 hook 和 反向传播 hook。前向传播 hook (Forward Hook)前向传播 hook 可以在模块的前向传播阶段插入自定义操作,允许开发者访问和修改该模块的输入和输出。它通常用于调试和检查模型的行为。使用场景:检查每层的输入、输出,或者在中间层提取特征。
2024-09-13 10:24:27
1118
原创 bash脚本1_完成文件夹的更新
功能: 文件夹A,文件夹B 文件夹A是文件夹B的子集。两者的层级一致,内部都包含多个子文件夹 写一个bash脚本将文件夹B中出现在文件A中的子文件夹替换为文件夹A的子文件夹。
2024-09-06 14:31:30
242
原创 C++的内存模型
C++ 的内存模型包含了程序运行时如何分配、访问、管理内存的规则,涵盖了多线程环境下的数据一致性、内存对齐、以及虚拟内存管理等内容。掌握这些概念对于编写高效、安全的 C++ 程序至关重要。
2024-08-28 12:31:54
1351
原创 transformer死亡9问
序列掩码(sequence mask)在Decoder的自注意力机制中起到了关键作用,用于屏蔽未来的信息,以确保Decoder在生成目标序列时只能依赖于之前生成的词。在计算Transformer的注意力时,对点积注意力进行缩放(scaled)的主要原因是为了稳定训练过程,防止输入数据的范围过大,导致softmax输出的梯度变得非常小,从而影响训练效率和模型性能。使用不同的权重矩阵生成查询和键,使得模型可以在不同的子空间中变换输入,捕捉更丰富和多样的特征,并且避免退化成简单的自相关操作。
2024-08-05 15:32:15
1028
原创 构造函数或者析构函数中调用虚函数会怎样
构造函数中调用虚函数:调用当前类的版本,因为派生类对象还未完全构造。析构函数中调用虚函数:调用当前类的版本,因为派生类对象已经开始析构。这种行为是为了避免在构造和析构过程中调用尚未初始化或已经销毁的派生类成员,从而导致未定义行为。为了避免这种问题,最好避免在构造函数和析构函数中调用虚函数。
2024-08-04 20:05:18
454
原创 优化程序的几种方法
智能指针(如std::shared_ptr和std::unique_ptr)可以自动管理内存,避免内存泄漏。例如,使用std::vector而不是std::list。使用多线程(如std::thread)和多进程(如fork)来并行处理任务,充分利用多核处理器。动态内存分配(如使用new和delete)是昂贵的操作。利用标准库中的并行算法(如std::for_each的并行版本)来简化并行处理的实现。对于需转移所有权的对象,使用std::move来避免不必要的复制。b. 使用std::move。
2024-08-04 19:56:51
443
原创 C++中将临时变量作为返回值的时候,栈上的内存分配、拷贝过程
普通返回值:涉及栈上分配、拷贝构造和析构过程。RVO/NRVO:编译器优化,避免不必要的临时对象和拷贝,提高性能。右值引用和移动语义:进一步优化临时变量的处理,通过移动构造函数减少不必要的拷贝。
2024-08-04 19:48:54
740
原创 智能指针的循环引用 是什么 怎么引起的
智能指针的循环引用(Circular Reference)是指两个或多个对象之间的共享指针相互引用,导致这些对象永远不会被释放,从而引发内存泄露。主要发生在使用std::shared_ptr时,因为它们使用引用计数来管理对象的生命周期,当出现循环引用时,引用计数不会降为零,从而导致内存永远不会被释放。在这个示例中,B类中的aPtr使用std::weak_ptr,因此不会增加引用计数,从而避免了循环引用。当a和b超出作用域时,它们会正确地被释放。在main函数中,a和b共享指针相互引用,从而形成了循环引用。
2024-08-04 19:38:33
461
原创 内存泄露的定义,如何检测与避免?
内存泄露(Memory Leak)是指程序在运行过程中动态分配的内存未被正确释放,导致这些内存无法被系统或应用程序再次使用。动态分配的内存没有被释放。动态分配的内存指针丢失,无法找到这块内存。检测内存泄露检测内存泄露的方法有很多,以下是一些常用的工具和方法:使用工具检测Valgrind:一个强大的内存调试工具,可以检测内存泄露、内存越界等问题。适用于Linux系统。Dr. Memory:一个开源的内存调试工具,适用于Windows和Linux系统。
2024-08-04 19:25:58
483
原创 静态类型和动态类型,静态绑定和动态绑定的区别和用法对比
静态类型: 变量类型在编译时确定,优点是类型安全性高,性能好,缺点是缺乏灵活性。动态类型: 变量类型在运行时确定,优点是灵活性高,缺点是可能出现运行时错误,性能可能较低。静态绑定: 函数调用在编译时解析,优点是性能好,缺点是缺乏多态性。动态绑定: 函数调用在运行时解析,优点是支持多态性,缺点是运行时开销较大。
2024-08-04 08:50:18
686
原创 动态绑定、工厂模式与多态特性的关系
使用基类指针调用派生类的实现是实现多态性、工厂模式和动态对象管理等设计模式的基础。这种方式使得代码更加灵活和可扩展,便于管理和维护不同类型的对象。
2024-08-04 08:29:35
764
原创 vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因
在使用 std::vector 时,有一些注意事项和常见问题需要注意。特别是在频繁调用 push_back() 时,它可能会对性能产生影响。以下是一些使用 std::vector 的注意点及其原因,以及频繁调用 push_back() 对性能的影响和原因。
2024-07-24 13:55:34
962
原创 STL中unordered_map和map的区别和应用场景
在C++标准模板库(STL)中,和map都是用于存储键值对的关联容器,但它们在底层实现和应用场景上有一些关键区别。
2024-07-24 13:38:11
2017
原创 卡尔曼滤波原理以及C++代码demo
2)每个时刻都包含观测,预测和估计三个值,其中t时刻的预测是借助t-1时刻的估计以及状态转移方程得到,t时刻的估计是加权t时刻的观测和t时刻的预测得到。首先引用部分的两个链接已经把卡尔曼滤波前世今生讲解的非常详细了,在这里我把自己的理解写出来,方便若干年后的自己能够看到符合自己理解的讲解,不用重写总结。这是一个比较耗时间的工作,卡尔曼滤波的原理书写和代码阅读都比较耗时间,暂时先搁置吧。今天,要来说一下关于卡尔曼滤波的一些老生常谈的东西,什么是卡尔曼滤波,卡尔曼滤波的步骤和卡尔曼滤波最终形式的由来。
2024-05-03 23:31:51
483
3
原创 毫米波雷达原理(含代码)(含ARS548 4D毫米波雷达数据demo和可视化视频)
雷达的距离估计取决于Rx信号和Tx信号的频率差, 并且最大探测距离也受限于系统的采样频率和带宽, 与带宽成反比。采样频率S固定时,带宽越小,最大探测距离越大,但因距离分辨率与带宽成正比,所以带宽也不能无限变小。带宽固定时,采样次数N越大,最大探测距离越远,但因N的增加会引起计算量增加和储存量增加,所以N也不能无限增加距离分辨率取决于带宽,与带宽成反比。在周期时间TcT_cTc不变的时候,提高频率变化率。在频率变化率不变的时候,延长chirp信号,也就是提高周期时间,都可以提高距离分辨率。
2024-05-03 16:31:42
6739
12
原创 IPM原理
IPM变换就是消除这种透视效应,所以也叫逆透视。原本平行的两条车道线,在针孔相机下因为透视变换,在图片中看到的效果并不平行,这是因为透视现象。而IPM的思想可以将原来的透视结果转换到鸟瞰图的视野下,看到的车道线也是水平的。透视变换的作用是让我们从另外一个角度观察图片中的场景,例如俯视。它能帮助我们避免例如“近大远小”造成的图像世界与现实世界的偏差,其方法的本质是“映射”,将原图像的像素点按照一定的“比例”映射到另外一张图上。IPM变换具有很多应用,求取IPM图像的方法亦是有很多。
2024-04-30 15:05:03
2232
原创 双目深度估计原理&立体视觉
双目深度估计是通过两个相机的对同一个点的视差来得到给该点的深度。标准系统的双目深度估计的公式推导需要满足:1)两个相机的光轴水平;2) 两个相机焦距分辨率一致,也即内参一致;3)两个相机的成像平面水平,两个相机坐标系之间只存在x轴方向的平移关系。但是得到的双目系统,不一定满足上述的三个条件,两个相机的坐标系之间大概率存在某个旋转平移关系,因此在使用标准系统的双目估计原理公式之前,需要首先完双目相机之间的外参标定,得到两者的旋转平移关系。
2024-04-29 13:57:11
5176
原创 针孔相机模型原理&坐标系辨析&内参标定流程&内参变换
针孔相机的内参标定针孔相机原理真空相机模型图片的伸缩和裁剪变换内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C++代码)其他工具箱相机分为短焦镜头和长焦镜头,短焦镜头看到的视野更广阔,同样距离大小的一颗树,在短焦相机中所占的像素个数较少。长焦镜头看到的视野较窄,能看的更远。因为同样距离大小的一棵树,在长焦距镜头中的像素个数更多;同一款芯片,短焦距fov大,长焦fov小。针孔相机原理真空相机模型要搞明白针孔相机模型,首先需要明确世界坐标系OXwY
2024-04-24 23:24:21
1879
2
原创 基于ros的相机内参标定过程
本篇文章用于记录基于ROS系统的balser相机的内参标定流程,使用的是balser 1920-40gc相机和computar-C镜头。相机帧率42fps, 分辨率2.3MP, 感光芯片IMX249, 镜头焦距8mm。
2024-04-09 23:28:18
1050
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人