CUDA编程初体验
前言
真的比较难蚌,谁能想到有朝一日我终于走上了CUDA编程的道路,要不是这个该死的论文非要用什么“弹性可分离卷积”,还真的就不能使用torch直接写出来,必须使用自定义的算子,必须要接触到CUDA编程。
无心插柳柳成荫吧,毕竟,搞深度学习的人不接触一点高性能计算,不懂得一点C++和CUDA编程,说出去给人的感觉也太不专业了,学一点,总归是好的。
CUDA编程基础
了解CUDA,可参考如下博客,必须要对GPU的硬件架构方式有所了解,对于英伟达的GPU,可使用以下示意图说明:
不同于CPU的冯诺依曼架构,GPU中的控制器与缓存器几乎同时要对应极大数量的低精度算术逻辑单元,这一批算术逻辑单元共享同一个缓存单元,全局共享内存位于DRAM上,DRAM通过PCIE接口与CPU的外接PCIE接口,GPU由于其本身极差的单核 处理性能,其不能单独作为一个计算机系统中央处理单元使用,因此只能作为CPU的一个外部设备device,因此CPU与GPU的关系是协同处理关系。早期的图形处理单元作为外设的普通一员,使用与其他外设共用的南桥接口,受CPU节制;随着图像处理单元的工艺升级和深度学习的应用,现代GP ...
SCADA了解笔记
前言
用于学习过程中的笔记。
部分专业名词
SCADA:Supervisory Control And Data Acquisition,监控与数据采集
DCS:Distributed Control System,分布式控制系统
PLC:Programmable Logic Controller,可编程逻辑控制器
RTU:Remote Terminal Unit,远程终端单元
HMI:Human Machine Interface,人机界面
IED:Intelligent Electronic Device,智能电子设备
MMS:Manufacturing Message Specification,制造信息规范
IT:这个IT不是信息技术,但是是什么还不太清楚
OT:Operational Technology,运营技术(或许?)
TCP:Transmission Control Protocol,传输控制协议
IP:Internet Protocol,网络协议
系统组成
SCADA是指一种介于DCS和PLC之间的控制系统,兼具了PLC的灵活性和DCS的顶层设计。包含了上位机、 ...
Verilog 学习
前言
嵌入式课程和导师的专长都是硬件电路设计,面向应用部署算法,因此有必要了解掌握Verilog语法及其设计思想。
名词解释
VHDL : VHSIC : Very High Speed Integrated Circuit Hardware Description Language.
EDA : Electronic Design Automation
Verilog的五种抽象模型:系统级,算法级,RTL级(Register transfer level)寄存器级,门电路级,开关电路级(深入到三极管内部)
准备工作
使用vscode编译verilog语言并可视化运行
intel自带的quartus软件界面实在过于古老,代码编写跟matlab一样难用,所以我决定使用vscode编写verilog代码并运行一些简单的编译和调试。主要的设置步骤有以下:
安装iverilog编译器,这是一个开源的verilog语言编译器,ubuntu可以直接使用sudo apt install iverilog安装,windows可在网上找官网下载;
安装仿真器gtkwave,这也是开源的示波仿真器,ub ...
mpich 学习
写在前面
从5月8日开始,到现在,已经接近三个月的时间,我的第一段实习生涯即将结束。反思自己的实习经历,我觉得最主要的收获有三点:
最重要的往往是迈出第一步,我从来没有接触过社会化的生产、经营模式,这次实习的企业虽然很小,而且是初创企业,学术氛围浓厚,也给了我较多的眼界,在实习中尝试触摸大学学习和社会生产的脱节处,下一步工作或者学习,都能提供方向上的指引。
第二是克服与生俱来的恐惧心理,至今也还记得实习第一天的时候,来到公司,使用ssh连接服务器、装个python的环境都出了无数个bug,也不敢问近在身边的技术主管和后面的后台管理人员,自己的问题疯狂查CSDN,也始终解决不了,第二天第三天以降,简直如同煎熬,感觉自己什么也不会,一点也不配来这里,压力山大。现在回望,实力是一方面,当时对服务器、对git和linux的使用确实非常不熟悉,另外一个重要的方面,自然是心理压力较大,始终担心自己被别人看不起,不敢问问题,反而限制了自己的进步。
第三才是技术上的一些收获,实习我丝毫没有参与公司的核心业务,主要做的工作是数据集整理和清洗,去重都鲜有涉及。因此指望通过一次实习让自己学到算法上的东西无 ...
图像去雨系列方法汇总
前言
服务于所谓的图像去条纹,真是心都操碎了,到处去查论文看文献,之前一直在图像去噪那里寻寻觅觅冷冷清清,现在总算是找到了方向。
所谓图像去雨,就是广泛意义上的图层分解中,将或者雨滴图层与背景图层**分解开的任务,是图像分解任务中的常见类型,广泛应用于自动驾驶领域的图像预处理。
根据综述文章[1],根据去雨任务的输入模态,可将图像去雨分为两条路线,即基于视频的去雨方法(多针对动态情况下,这种方法在低速自动驾驶上尤为适用)和基于单幅图像的去雨方法(多针对静态或者高速运动下的自动驾驶任务)。本文将主要介绍基于单幅图像的去雨线方法,因为它是非常典型的图像分解任务。进一步,根据去雨任务的技术路线,又可以将去雨方法分为基于模型的去雨方法和基于数据驱动的去雨方法,在数据驱动领域,又可以进一步细分为基于监督训练的方法、基于自监督训练的方法和基于无监督迭代的方法。
本文认为,即使基于监督训练的方法能够在基准测试集上取得较好的结果,但是仍然不足以泛化至真实模型上,基于自监督学习的方法虽然当前泛化能力较差,甚至图像分解的描述提取能力也弱于监督学习,但是其在真实环境中的潜在自适应能力,是真正意义上技术发展的 ...
N2N系列图像去噪方法汇总
前言
这里的图像去噪,更多地指的是带有某些特殊模式的噪声,这种模式大多有特定的物理机理,例如最常见的高斯白噪声和泊松噪声。常规的方法将这些噪声的信息作为先验信息,手工设计处理算法例如BM3D[2]是在深度学习出现之前具有最高的去噪效果,其原理是字典学习(不太理解了)。而本文将主要介绍的是从文献Noise2Noise[1]开始,基于单幅噪声图像,不增加理想图像的自监督网络。
Noise2Noise
本系列的去噪网络前提都是几乎相同的,均来自于文献Noise2Noise[1],基本假设是噪声独立同分布、噪声的期望为零,根据以上两个条件,产生了一系列的衍生网络,首先介绍其数学原理。
数学原理
设理想的、无噪声的图像为x\mathbf{x}x,该图像多称为信号图像或者干净图像,对应的被噪声污染的图像为y\mathbf{y}y,该图像称为退化图像或者噪声图像。理想情况下,如果能够得到对信号图像和噪声图像整个图像空间下的所有分布,则能够以监督学习的方式得到理想的去噪网络f:Rm×n↦Rm×nf:\mathbb{R}^{m\times n}\mapsto\mathbb{R}^{m\times n}f ...
24年4月进展
第一篇文献
Retinomorphic Object Detection in Asynchronous Visual Streams
解决的问题
来自北京大学黄铁军团队的应用成果,首创性地提出了基于事件相机和脉冲相机的联合高速检测框架,在仿生学、高速物体检测上有着良好的应用效果。
主要内容
本文认为事件相机可以类比眼球中的周围神经元,对光照的变化较为敏感;而脉冲相机可以类比眼球中的中央凹神经元,具有较高 的空间分辨率,同时 也具有一定程度 的时间分辨率。由于事件流和脉冲流都是离散异步的数据格式,不同于图像作为一个连续的整体,给定一个对异步数据流的划分S={SX1,SX2,⋯ ,SXN},X={Spike,Event}\mathcal{S}=\{S^1_X,S^2_X,\cdots, S^N_X\}, X=\{\mathrm{Spike}, \mathrm{Event}\}S={SX1,SX2,⋯,SXN},X={Spike,Event},对应地有一个响应目标划分B={B1,B2,⋯ ,BN}\mathcal{B}=\{B^1,B^2,\cdots, B^N\}B={B1,B2, ...
24年3月进展
第一篇文献
End-to-End Learning of Representations for Asynchronous Event-Based Data
解决的问题
本文提出了一系列抽象的事件描述,旨在解决将各种各样纷乱的事件描述统一至同一个泛函中,以便于得到网格化的事件描述grid-like以适应深度学习网络输入的要求;同样也提出了相应的数据驱动的事件描述方式。
主要内容
文章指出,网格化的事件描述本质上就是如下式表达的冲激函数网格点列:
S±(x,y,t)=∑e∈Ef±(x,y,t)δ(x−xe,y−ye)δ(t−te)S_{\pm}(x,y,t)=\sum_{e\in E} f_\pm(x,y,t)\delta(x-x_e,y-y_e)\delta(t-t_e)
S±(x,y,t)=e∈E∑f±(x,y,t)δ(x−xe,y−ye)δ(t−te)
注意这里的描述方式,并没有将时间轴和空间轴拼合在一起,虽然但是这样也没有什么本质 上的区别,强调了时间和空间的独立性。根据这一描述式,在特定的核函数作用下,可以得到以该方式描述进一步泛化的事件描述式(文章中称为核卷积): ...
23年12月进展
前言
从11月下旬开始7个大作业。。。一直在赶作业,一直赶,赶到差不多12月中旬才做完,之后一周一直在玩Stable Diffusioin,U1S1那个东西确实好玩,玩了快两周,也变相地学到了很多CV的知识,终于,在年末的前几天重新把论文捡了起来,我又开始看了。。。这次是在Copilot的帮助下,提高了筛选文献的效率,不用手工泛读了。
第一篇文献
文献名:ESVAE: An Efficient Spiking Variational Autoencoder with Reparameterizable Poisson Spiking Sampling
arxiv
解决的问题
针对直接套用VAE到SNN网络中出现的生成效果差问题,本文在VAE原文的基础上修改了FSVAE的Loss函数,提出了一种概率空间均方误差的损失函数,取得了较好的生成效果。
采用的方法
本文大体的方法按照VAE的一般逻辑,整体结构如下图所示:
这里着重强调两点:
图像脉冲编码:一般逻辑是将强度图像按像素强度生成泊松过程簇的方法,本文使用的是文献FSVAE的编码器,后面来叙述;
损失函数:文献中给出的形式是:
L ...
24年1月进展
第一篇文献
SpikingJelly: An open-source machine learning infrastructurepla tform for spike-based intelligence
解决的问题
该文献为了解决在SNN领域较为混乱的网络框架、难以彼此通用复现的SNN结构以及与软硬件不兼容等问题,提出的一个基于cupy的深度学习框架,该框架建立于torch的接口上,内层使用Cupy完成对Cuda的调用,底层仍然使用C++语言实现高性能运算。该框架的中文名称为“惊蛰”,名字还取得不错。
主要内容
整个框架的架构如上图,该框架的用户文档可参见:用户文档。在使用感受上,该框架具有以下特点:
接口与torch的nn接口高度类似,能够方便torch用户的使用;
在生理学和计算神经学上涉足不深,更多地抽象脉冲的物理和数学模型,并将其与深度学习相结合。
传播过程将整个脉冲序列分为多个单独的时间点,因此可以按单步传播(在同一个时间戳上传播整个网络,然后进入下一时间戳)和多步传播(在同一个脉冲序列上传播整层网络,然后再进行下一层),两种方式计算结果相同。
拥有多个内置的数据 ...