- 博客(525)
- 资源 (23)
- 收藏
- 关注
原创 [深度学习入门] --- 深度学习概念扫盲
卷积神经网络(CNN):CNN是图像分类中最常用的深度学习模型,通过多层卷积层和池化层来提取图像的特征,并通过全连接层来进行分类。数据增强:为了让模型具有更好的泛化能力,通常会对训练数据进行各种变换,如旋转、缩放、裁剪等。模型结构:从LeNet、AlexNet到VGG、Inception、ResNet等,模型结构的创新也是提升分类性能的关键。迁移学习:在数据量不足时,可以通过迁移学习的方式使用预训练模型,迁移已有的知识以提高性能。
2024-11-05 14:23:12 861
原创 [深度学习入门] --- 神经网络基础
人工神经网络中常用到激活函数(activation function):ReLu和Sigmoid。定义:卷积核大小是指卷积核在输入数据上滑动时所覆盖的维度大小。通常用一个二维的数字表示,如 3×3 或 5×5,表示卷积核是一个 3 行 3 列或 5 行 5 列的矩阵。影响:卷积核的大小决定了它能够捕捉的局部特征的范围。较小的卷积核(如 3×3)更适合于捕获细粒度的特征,如边缘、纹理等。较大的卷积核(如 5×5 或更大)则能够捕获更大范围内的特征,适合于捕捉更复杂的模式。设计考虑。
2024-11-05 14:22:41 758
原创 [yolov5] --- yolov5入门实战「土堆视频」
下载好之后放到根目录,同时把这里改成对应的模型名train.py 中参数如下下面对这34个参数进行逐一讲解。
2024-09-07 17:41:47 865
原创 [pytorch] --- pytorch GPU和CPU模型相互加载
第二种方法则只是保存参数,在读取模型参数前要先定义一个模型(模型必须与原模型相同的构造),然后对这个模型导入参数。虽然麻烦,但是可以同时保存多个模型的参数,而第一种方法则不能,而且第一种方法有时不能保证模型的相同性(你读取的模型并不是你想要的)。加载模型参数的时候,在GPU和CPU训练的模型是不一样的,这两种模型是不能混为一谈的,下面分情况进行操作说明。pytorch 允许把在GPU上训练的模型加载到CPU上,也允许把在CPU上训练的模型加载到GPU上。CPU训练的模型,在CPU上使用,
2024-09-05 18:39:49 482
原创 [pytorch] --- pytorch基础之模型验证套路
结果分析:最终的输出结果通过print(output.argmax(1)),找到数组 output 中每行的最大值的索引,最终结果是tensor[5]。利用已经训练好的模型,拿出训练集中的部分数据进行测试。也即我们放了狗的图片,识别出来的是狗,模型识别正确。
2024-09-05 18:39:33 380
原创 [pytorch] --- pytorch基础之模型训练套路
习惯上把模型单独存一个py文件里面,这里也把这个代码块存在"model.py"下。为了方便,我们这里直接使用pytorch官方的CIFAR10数据集进行训练。下面以具体实例给出上面的步骤。明确定义训练设备是GPU。
2024-09-05 18:39:11 744
原创 [tensorrt] --- tensorrt安装及使用
本教程基于ubuntu20.04,默认安装好了nVidia驱动、cuda版本、cudnn版本,选择与之匹配的Tensorrt安装。
2024-09-05 18:38:47 338
原创 [pytorch] --- pytorch基础之损失函数与反向传播
Loss Function的作用:(1)计算实际输出和目标之间的差距(2)为我们更新输出提供一定的依据,这个提供依据的过程也叫反向传播。我们可以看下pytorch为我们提供的损失函数:https://pytorch.org/docs/stable/nn.html#loss-functions。
2024-09-02 15:37:22 1319
原创 [pytorch] --- 神经网络的基本骨架-nn.Module的使用
class Sequential(Module): # 继承Moduledef __init__(self, *args): # 重写了构造函数def forward(self, input): # 重写关键方法forward。
2024-09-02 10:52:21 1581
原创 [pytorch] --- pytorch基础之transforms
transform使用方法是:1> 首先 关注 它的 输入 需要什么样的 数据类型,是PIL,是Numpy,是Tensor …2> 关注 它的 输出是什么样的数据类型3> 查看 官方文档的参数上面实验使用到的全部代码# 下面是 把图像的像素值从[0, 255]缩放到[0.0, 1.0]print(img_tensor) # 将图像数据 转换为 tensor 类型的数据# 归一化# 初始化参数: mean, std, inplace=False。
2024-09-01 21:37:35 881
原创 [pytorch] --- pytorch基础之tensorboard使用
TensorBoard是一个用于可视化机器学习实验结果的工具,可以帮助我们更好地理解和调试训练过程中的模型。在PyTorch中,我们可以使用TensorBoardX库来与TensorBoard进行交互。TensorBoardX 是一个PyTorch的扩展,它允许我们将PyTorch的训练中的关键指标和摘要写入TensorBoard的事件文件中。
2024-09-01 21:02:10 1505
原创 [pytorch] --- pytorch基础之dataset和dataloader
torch.utils.data.Dataset 是代表这一数据的抽象类(基类),即:Dataset 类是 pytorch 中图像数据中最为重要的一个类,也是 pytorch中所有数据集加载类中应该继承的父类。(1)dataloader 本质上是一个可迭代对象,使用 iter() 访问,不能使用 next() 访问,它本身就是一个可迭代对象, 使用 for i, data in enumerate(dataloader) 来访问。() 两个方法,会用到 transform 对数据进行扩充;
2024-09-01 20:47:52 1467
原创 [CUDA编程] --- CUDA内存模型
用表格进行总结:设备存储器的重要特征下图表达的更加直观一些。Local, Global, Contant, Texture为片外DRAM,其中Global, Constant, texture内存在Host端代码声明,所有线程可见。SM拥有私有的Registers和Shared Memory(其实还有SM私有的L1 cache以及共有的L2 cache,下一篇会详细说明),Constant和Texture内存有专有的Caches, 这些在片上。
2024-08-25 12:46:12 1174
原创 [CUDA编程] --- cuda线程模型
threadIdx是一个uint3类型,表示一个线程的索引。blockIdx是一个uint3类型,表示一个线程块的索引,一个线程块中通常有多个线程。blockDim是一个dim3类型,表示线程块的大小。gridDim是一个dim3类型,表示网格的大小,一个网格中通常有多个线程块。
2024-08-25 12:45:40 896
原创 [CUDA编程] --- CUDA计时
计时通常分为两种情况:1)直接得到接口函数的时间,一般用于得到加速比;2)获得接口函数内核函数、内存拷贝函数等所耗时间,一般用于优化代码时。情况(1)方法有两种,CPU计时函数和GPU计时函数。情况(2)有三种工具nsight,nvvp,nvprof本博客会详细介绍情况(1)的两种方法;情况(2)nsight不会用,简单介绍一下nvvp和nvprof的用法。
2024-08-25 12:45:14 879
原创 [CUDA编程] --- nvcc编译过程和GPU计算能力
nvcc编译流程具体可参看官方文档:nvcc编译过程:https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html下面结合这张图进行具体讲解NVCC的编译过程分为离线编译和即时编译两部分组成:离线编译(绿色虚线框内):CUDA源程序(即xxx.cu文件)在编译前的预处理会被分为主机端代码和设备段代码(即图中的左右分支):1.如图右分支:在设备端代码会被编译成ptx文件(可以看作是用于设备端的汇编文件)或是直接可运行的二进制文件xx
2024-08-25 12:44:21 952
原创 [CUDA编程] --- 函数关键字介绍
CUDA编程模型是一个ie异构模型,需要CPU和GPU协同工作。在CUDA中,host和device是两个重要的概念,我们用host指代CPU及其内存,用device指代GPU及其内存。CUDA程序中既包含host程序,又包含device程序,他们分别在CPU和GPU运行。同时host和device之间可以通信,这样他们之间可以进行数据拷贝。
2024-08-25 12:43:30 294
原创 [数据结构与算法] ---双指针解数组题目技巧
在处理数组和链表相关问题时,双指针技巧是经常用到的,双指针技巧主要分为两类:对撞指针和快慢指针。在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针,这样也可以在数组中施展双指针技巧,本文主要讲数组相关的双指针算法。本文就总结一下数组双指针的基本技巧,每个技巧都对应着至少一道算法题:1、删除有序数组中的重复项2、移除元素3、 两数之和4、 反转数组5、 回文串判断6、 最长回文串12快慢指针3456对撞指针。
2024-07-24 10:47:20 315
原创 [数据结构与算法] ---双指针解链表题目技巧
本文就总结一下单链表的基本技巧,每个技巧都对应着至少一道算法题:1、合并两个有序链表2、链表的分解3、合并 k 个有序链表4、寻找单链表的倒数第 k 个节点5、寻找单链表的中点6、判断单链表是否包含环并找出环起点7、判断两个单链表是否相交并找出交点这些解法都用到了双指针技巧,所以说对于单链表相关的题目,双指针的运用是非常广泛的,下面我们就来一个一个看。
2024-07-24 08:38:28 279
原创 [基础算法] --- 位运算
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JUn5T7U-1721627042685)(https://i-blog.csdnimg.cn/direct/552453030c454160ab0a304c60be24ca.png)]
2024-07-22 13:44:15 973
原创 [基础算法] --- 递归算法
递归(Recursion):指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。举个简单的例子来了解一下递归算法。比如阶乘的计算方法在数学上的定义为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3plTPNY1-1721614561192)(https://i-blog.csdnimg.cn/direct/f7d5d612e5e1485c8411bd97c58d667c.png)]
2024-07-22 10:16:12 536
原创 [基础算法理论] --- 滑动窗口
1 滑动窗口算法介绍在计算机网络中,滑动窗口协议(Sliding Window Protocol)是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。我们所要讲解的滑动窗口算法也是利用了同样的特性。滑动窗口算法(Sliding Window):在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。滑动操作:窗口可按照一定方向进行移动。最常见的是向右侧移动
2024-07-22 10:15:08 804
原创 [基础算法理论] --- 双指针
双指针分为「对撞指针」、「快慢指针」、「分离双指针」。对撞指针:两个指针方向相反。适合解决查找有序数组中满足某些约束条件的一组元素问题、字符串反转问题。快慢指针:两个指针方向相同。适合解决数组中的移动、删除元素问题,或者链表中的判断是否有环、长度问题。分离双指针:两个指针分别属于不同的数组 / 链表。适合解决有序数组合并,求交集、并集问题。
2024-07-22 10:14:50 729
原创 [基础算法] --- 枚举算法
枚举算法(Enumeration Algorithm):也称为穷举算法,指的是按照问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复。枚举算法的核心思想是:通过列举问题的所有状态,将它们逐一与目标状态进行比较,从而得到满足条件的解。由于枚举算法要通过列举问题的所有状态来得到满足条件的解,因此,在问题规模变大时,其效率一般是比较低的。
2024-07-19 15:23:44 691
原创 [UDS] --- ReadDTCInformation 0x19
19服务允许客户端从任何服务器或车辆内的服务器组,读取存储在服务器中的诊断故障代码 (Diagnostic Trouble Code,DTC)信息的状态。除非特定子功能另有要求,否则服务器应返回所有DTC信息(例如,与排放相关和非排放相关)。19服务允许诊断仪/上位机从车辆内的任何ECU读取故障诊断码(DTC)信息的状态。此服务常用的操作如下:在ISO 15031中对DTC故障码各Bit格式进行了定义:DTC的八个状态位分别代表含义:在ISO 14229中定义了28个Sub-Function,大家可以参
2024-07-19 11:16:14 1464
原创 [数据结构] --- 堆
将根节点最大的堆叫做,根节点最小的堆叫做。常见的堆有二叉堆、斐波那契堆等。如下,小堆的父亲节点总是小于其孩子节点,所以小堆的根节点一定是最小的。而大堆的父亲节点总是大于其孩子节点,所以大堆的根节点一定是最大的。Note:现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
2024-07-16 08:48:32 847
原创 [数据结构] --- 线性数据结构(数组/链表/栈/队列)
链表是由一个个结点串联而成的,而每个结点分为两块区域,一块是数据域,相当于数组中存储的那个数据;另一块是指针域,这里存放的是指向下一个结点的地址。//定义结点类型int data;//数据类型,你可以把int型的data换成任意数据类型,包括结构体struct等复合类型//单链表的指针域//Node表示结点的类型,LinkedList表示指向Node结点类型的指针类型栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
2024-07-04 13:18:08 757
原创 [数据结构] --- 树
*二叉树是每个节点最多有两个子树的树结构。**它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。我们知道,实际应用当中,我们经常使用的是查找和排序操作,这在我们的各种管理系统、数据库系统、操作系统等当中,十分常用。数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查找,二分查找要求数组的构造一定有序,二分法查找解决了普通数组查找复杂度过高的问题。
2024-07-03 13:23:43 1133
原创 [数据结构] --- 哈希表
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度(在此之前的我们都是采用遍历来查找指定元素,当数据量庞大时(亿万级别),挨个遍历就显得很慢,而哈希表可以通过某个函数直接访问到指定元素,这就是哈希表的NB之处)。。
2024-07-02 14:03:52 943
原创 [数据结构] --- 八种常见数据结构
数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的,但是我们可以使用指针等道具,构造出类似“树形”的复杂结构。分为八个常见的数据结构。
2024-06-28 15:03:48 807
原创 [C++深入] --- 类成员初始化的三种方式
初始化列表是在构造函数冒号后对成员进行初始化,这是在成员被分配内存的同时进行的初始化操作。这样避免了成员变量先被默认构造然后再赋值的过程。
2024-06-27 19:25:02 585
原创 [C++深入] --- malloc/free和new/delete
在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。自由存储区是C++基于new操作符的一个抽象概念,。new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。那么自由存储区是否能等于堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
2024-06-24 16:42:58 939
原创 [CANoe] --- blf格式的can报文回放
1 PC接上CANoe,打开软件新建工程,并导入DBC,这些基本操作这里就不赘述了。还可以点击Analysis-> Graphics查看某个信号的变化波形。3 点击analysis选项卡中的measurement setup。5 导入后点击运行图标,就可以在trace窗口查看回放的报文信息了。从channel列可以看出当前一共录制了多少路can报文。4 点击图示“+”,导入本地can log。双击图示的文件夹,打开文件导入窗口。2 CANoe选择离线模式。
2024-05-18 14:12:52 3527
原创 [CANoe] ---CANoe工程创建及通道配置
CANoe软件通道与硬件通道的映射配置 【实际物理连接中网络接口卡与两个CAN ECU 或者是两个CAN实际网络进行连接】在弹出的窗口中,右击Database,有两种添加方式,一种是Add, 一种是Import Wizard。保存工程,CANoe工程是以.cfg结尾的工程,下次直接双击.cfg文件就可以打开。这里不同的模板提供了不同设置,具体包括:总线类型,通道速率,通道数目等。右击-> canoe -> can2【选择与那个can设备映射】将CANoe中的逻辑通道与实际连接中的硬件通道进行匹配和映射。
2024-05-18 14:12:20 928
原创 [CANoe] ---CANoe常用窗口介绍
添加CAN IG模块Simulation Setup -> 空白处右击 -> Insert CAN interactive Generator。
2024-05-18 14:11:57 2382
原创 [c++] --- 面试知识点
虚函数是在基类中声明的函数,可以在派生类中被重写。它们允许在运行时动态绑定函数调用,这意味着程序可以根据对象的实际类型来调用适当的函数。虚函数通过在函数声明前加上virtual关键字来定义。纯虚函数的定义: virtual 返回类型 函数名(形参) = 0含有纯虚函数的类叫抽象类抽象类的特点:不能用抽象类去实例化对象抽象类的作用:提供一个统一的接口,让子类去实现,子类实现之后才可以实例化对象这个问题从下面几个角度回答?1) C++中的多态有静态多态和动态多态两种形式。
2023-12-12 09:54:22 992
原创 [ROS2] --- 通信接口
通信并不是一个人自言自语,而是两个甚至更多个人,你来我往的交流,交流的内容是什么呢?为了让大家都好理解,我们可以给传递的数据定义一个标准的结构,这就是通信接口。ROS的通信系统,它的主要目的就是传输数据,那就得让大家高效的建立连接,并且准确包装和解析传输的数据内容,话题、服务等机制也就诞生了,他们传输的数据,都要符合通信接口的标准定义。
2023-12-09 12:42:42 449
JNI实现java cpp相互调用
2023-07-06
Linux网络编程-网络基础-socket编程-高并发服务器.pdf
2021-09-05
PCB封装库---经过很多次画板检验
2018-09-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人