网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月28日漏签0天
广东技术师范大学吧 关注:26,142贴子:205,391
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 3 下一页 尾页
  • 36回复贴,共3页
  • ,跳到 页  
<<返回广东技术师...吧
>0< 加载中...

记录:神经网络框架,思维,我们的未来

  • 只看楼主
  • 收藏

  • 回复
  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼




  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
记于2024的秋与冬[GPNU][第一版]
第一章:[摘要]
在本文中,我们将介绍神经网络工程的大体框架,并讲述我们在实践过程中留下的经验和思考。然后,我们将以使用者的视角进行分析,讲解我们对代码的抽象设计。在第三部分,我们将借用wolfram的绘图以及他的笔记,讲解我们对神经网络的初步认识。最后,我们将思考人类的神经系统与人工神经网络的联系,以启发我们未来的方向和对世界的认识。


2025-07-28 22:00:53
广告
不感兴趣
开通SVIP免广告
  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第二章:[神经网络工程]
在本章,我们将以实际案例出发,从零构建一个神经网络框架

图表 1—我们的的神经网络工程架构图


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
背景故事: [我们遇到的问题][使用的方法][困难]
我们经常会遇到这样的问题,如果我们做了一个小车,希望它能够智能地沿着路走,避开行人和车辆,那么,我们就会想办法检测马路线,检测行人。传统的CV方法是输入摄像头的图像,然后使用滤波器过滤,大体流程是灰度转换+降噪+边缘检测+蒙版+霍夫线变换,最终只保留下车道线的像素,后续还需要相机参数做变换,才能得到车道线的真实长度。

图表 2—基于传统CV的车道线检测https://blog.csdn.net/qq_45199760/article/details/121453338
对于车道线检测,因为其特征比较明显,所以会有不少成功的案例,但是对于行人检测,传统的CV算法几乎是不可能的,因为行人的特征多种多样。其实推广来讲,CV的车道线检测也面临着同样的问题。受光照影响,晚上,傍晚,车道线的颜色会不一样。受地域影响,不同地区的车道线会不一样。受天气影响,下雨的时候雨水会覆盖反光。总结来说,流程都是先基于人工的总结一种特征,然后再实现一种算法来进行检测,这就是特征工程。

图表 3—不同天气和光照条件下的边缘检测
到后来,有了神经网络,我们不再需要很复杂的特征提取算法,因为神经网络会自动在训练中找到这种特征。比如Anchor3DLane,这种基于卷积神经网络的自动车道线识别,输出的还是3D的车道线,这样一来是后续的处理压力小了,也不需要我们专门地设计什么滤波器。

图表 4—Anchor3DLane网络结构图,输入2D图像+相机内参,输出3D车道线
目前,神经网络已经是自动驾驶领域中不可或缺的算法,依据车辆使用的传感器不同,又分为纯视觉/纯雷达/视觉+雷达融合等不同的方向。对于纯视觉方向,较为经典的是MonoDLE。这是一个由2D卷积网络作为骨干(特征提取)+ 多个2D卷积作为检测头(多任务)的深度神经网络。(很抱歉,并没有网络结构图,作者没画)
对于视觉+雷达融合方向,22年时流行的是BEV鸟瞰图方案。将四周的各个摄像头信息先变换到鸟瞰图空间,然后与雷达点云做融合,最后再使用检查头进行目标检测。
特斯拉给出的方案是OCC,也就是占用网络,可以形象地理解为《我的世界》中的体素化格式。

图表 5—环绕相机+雷达点云融合检测示意图(BEV)
需要注意的是,算法的发展必然受制于算力,OCC网络近年来是越来越火了,但是因其比2D多一个维度,参数量也是成倍地增长。不少企业仍然在追寻纯视觉的检测方案(如特斯拉),最简单的就是一个摄像头实现所有功能,称为单目检测,但是只使用一个摄像头有着天然的计算缺陷,如不能获取准确的深度信息。所以后续的更多方案选择了多摄像头的环绕覆盖。

图表 6—基于OCC的目标检测(纯视觉)
在我们的实践中,总是会遇到各种问题,总的来说是这样的:环境管理问题,数据格式问题,实验参数问题。
许多代码仓库在作者发表论文后就销声匿迹,不再更新维护,而作者当年使用的各种软件包很可能是未标明的,也导致我们需要经常地去“考古”,依据他发布的时间去推测当年使用的版本。其中最具有代表性的就是mmcv系列,这是一个广受欢迎的通用的神经网络框架,用于2D/3D目标检测,自动驾驶领域。而早期的mmcv系列对环境的要求比较严格。具体来说,我们在尝试复现一个代码时,他很可能是基于mmcv系列修改而来,那么我们就需要首先确定这个mmcv版本对应的pytorch版本,而pytorch版本需要先匹配一下当前的CUDA版本,而CUDA版本需要注意一下目前的GPU型号,举个例子:H800这个显卡是大陆特供版,CUDA算力是9.0,意味着CUDA至少要在11.8以上,而pytorch在2.X版本以后才提供11.8的支持,那么对应的mmcv版本就需要大于2.XX,如果这时候我们拿到一个代码,他使用的是MMCV==1.4.0这个版本,那么我们就没法在H800上跑起来。
数据格式问题其实并不是非常严重,因为我们通常使用同一个公开数据集进行测试,但是不免有一些特立独行的代码。
实验参数问题其实可以理解为可复现问题,因为神经网络训练的特点,每次更新参数时可能都会有一些随机扰动,这个随机扰动可能是出现在数据集加载器(将会在2.3节中讨论)的输入顺序,底层随机数产生器的种子,CUDNN的优化选择路径不同等等,所以很多人会将训练一个神经网络比作“炼丹”,训练的好坏有相当一部分的玄学因素。
我们花了相当多的时间在解决这些问题上,也是在这个过程中,我们逐渐对整个神经网络工程产生了一些基本认识,让我们对未来的工程项目有了一些基本设计,期望能够减少人们的痛苦,加快工作效率。所以,我们将在下节详细讲述我们的理解。


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.1:[基本CNN]
神经网络框架最终服务的还是神经网络本身,而神经网络则是由一层层卷积或其他操作叠加在一起的。所以,核心功能就是要实现神经网络的定义。在pytorch中,这样的需求很容易实现:


图表 7—torch中的网络层,只需要继承并实现forward(正向传播)
我们只需要继承nn.Module类,并实现他的forward函数即可。在这里我们定义了一个backboneP3,使用nn.Sequential组合成一起,其中包含了3层组合卷积+1层残差链接块。(残差链接参考ResNet,本文不做过多概述),每层卷积会有一些固定的参数:输入通道/输出通道/卷积核大小/卷积步长,更高级的操作有稀疏卷积,分组卷积。总之,我们在这里可以将每一层视作一个函数,输入X,输出Y。


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.2:[骨干网络][检测头]
对于早期的神经网络,人们将其分类为输入层,隐含层,输出层,其中,输入层和输出层的数据格式是人们能够理解的,而隐含层的计算虽然每一步都可知,但是人们难以找到可理解的概念来解释它,这也是神经网络被称为“黑盒子“的原因。

图表 8—一个图像分类模型的其中一个卷积层可视化,一个卷积层包含许多通道,每个通道关注不同的特征,人类难以理解其中的含义

图表 9—针对MNIST手写字体识别构建的神经网络,包括一个卷积层+一个激活函数+最大池化层+全链接层,最终输出概率最大的数字

图表 10—对YOLO11各层的正向传播可视化,原始图像经过层层卷积处理,最终保留下了各种特征
对于早期的CNN网络,手写识别是一个很经典的任务,这个网络经过两层2D卷积+激活层+全链接层,最终输出各个数字的0到1的概率预测。这里就只有输入/输出/隐含层的概念。
到后来,因为提出了各种多任务的要求,人们将神经网络中间的隐含层又划分为“骨干“和“头部”,其中,骨干为一个或几个网络层组成的结构,其目的是实现特征信息提取,头部也是相同的CNN堆叠的结构,但是目的是实现不同任务的特定数据格式输出。

图表 11—YOLOP,backbone(骨干)负责从图像中提取特征,neck(颈部)负责整合特征,后续3个head(头部)负责实现具体的任务(可行驶区域,车道线,2D检测框)
举个例子,在YOLOP中,任务是实现输入一张图像,输出2D检测框+2D车道线+2D可行驶区域。那么我们就需要设计三个独立的检测头,对应图中三个Head。其中,车道线和可行驶区域检测都是2D像素分割任务,所以输出是2*H*W。就是说,这两个头的输出格式是两个通道,每个通道的分辨率是H*W。
2D检测框的设计更为复杂,在YOLOP中,2D检测框采取的是YOLOv4类似的检测头,而YOLOv4的设计是这样的:[H*W,(X,Y,W,H,Conf+num_cls)] =255

所以,检测头经常需要依据任务的性质进行调整,而骨干网络作为整个网络中,负责特征提取的部分,则由另一批人设计,最终实现了网络的模块化。

表 12--在我们这里的演示中,我们使用最新的YOLO11的骨干网络,任务头则采用了MonoDLE中设计的:heatmap/offset/size3dheading/depth


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.3:[数据处理]
神经网络训练的第一步是要输入数据,对于单目识别类似的任务来说,我们能提供的输入就是一张图像。同时,我们要准备对应的正确结果作为监督,在不断地与神经网络的输出中做比对,然后不断优化整个模型。最后是希望神经网络的输出与真值一致。在Kitti这个数据集中,为我们提供了2D标注的正确值,其实这些都是从3D标注中投影来的,可视化如下:

图表 13—依据2D边界框生成的中心区域heatmap,有些物体的2D中心并不一定属于该物体

图表 14—对整个kitti数据集3D标注框中心点到摄像机的距离的统计,一般选择90~100m作为上限
对于经典的CenterNet来说,其神经网络就是输入一张图像,输出一个heatmap,在图13中则为2D的物体中心点,再另外一个检测头输出2D的W,H偏移,这样由X,Y,W,H的信息结果共同组成了一个2D检测结果。但是也有一些疑问保留在这里,并不是所有物体的heatmap中心都能够与该物体的像素对应上,就比如图13最左边的卡车,其2D中心点属于的像素是背景的房子。

图表 15—依据每8个像素一个锚点,从该点发射50条距离递增的射线,再重新投影回2D图像坐标中,得到的误差分布图,可见越靠近图像中心误差越小。

图表 16—从摄像机的视角每8个像素发射射线,深度间隔1米,可视化为3D点查看
最近的一个想法是,将OCC的占用预测与类似YOLO的边界框回归预测结合在一起。具体流程是这样的,先从相机视角每8个像素发射一条射线,然后等间隔地取1米深度,生成的点作为占用预测,可以想象为3D版本的heatmap。然后再从每个点出发,预测6个方向的回归偏移,类似YOLO系列的2D回归偏移,但是YOLO的是2D所以只需要四个方向,3D的话就至少需要6个方向。

图表 17—MonoOCC的其中一个流程,从相机出发预测体素化结构的占用和分类
图表 18—删除不在目标框内的点后,可视化结果如下,深度间隔1米


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.4:[损失函数]
我们训练神经网络时,对神经网络的输出需要一个评价标准,每次迭代时才能够知道优化的方向。


图表19—计算两个2D框的重叠面积称为IOU计算,IOU范围0到1,值越大重合程度越高。IOU也可以作为损失函数的一种,指导模型的优化方向。


2025-07-28 21:54:53
广告
不感兴趣
开通SVIP免广告
  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.6:[训练]
训练就是不断地将模型的输出与真值进行比较,然后通过反向传播算法更新每层网络的参数,度量方法就是Loss(损失函数),类似于下山,我们期望寻找到一个损失最小的地方,即神经网络输出与真值最接近的地方。



  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.7:[推理]
推理也叫正向传播,是将输入塞入模型,然后从模型得到输出的过程。


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.8:[可视化]
模型的输出绝大多数时候不是人类可读的形式,需要我们进行转换/解码。

图表 20—模型可视化,数据集使用的是kitti,红色是神经网络的预测值,绿色是正确值,输入为点云。


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.9:[日志记录]

图表 21—SwanLab在线实验数据托管和可视化系统,可以很方便地展示记录数据,示例中上传了每次迭代时的loss和系统信息


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.10:[导出][参数存储]
神经网络的每层都有参数,训练就是更新这些参数的过程。训练完成后,我们自然需要保存这个模型。Torch框架为我们提供了许多方法,pth/onnx/engine/…。其中,onnx作为一种通用的“中间“格式,被广泛地支持。

图表22—使用neturn网站对导出的ONNX模型进行可视化,可见每层结构


  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.11:[环境管理]
Python开发我觉得必带的一点就是一个虚拟环境框架,因为我们会经常地Ban掉整个环境,或者说为了另一个新项目搭建另一个环境。Conda是一个很好的选择,但是Conda官方版本有商业许可限制,所以更多人其实会选择民间的版本,即miniforge(又名mambaforge),其实可以理解为没有商业限制的conda,而且部分软件包更新更快。

图表23—Python项目中,常使用requirements.txt标注所依赖的所有第三方库,记得加版本号


2025-07-28 21:48:53
广告
不感兴趣
开通SVIP免广告
  • pz6842zk
  • 西路孤城
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.12:[在线文档] [Github集成]
Github为公开仓库免费提供了Action功能,其实就是自动的工作流,你可以编写代码让他自动执行一些命令,运行你代码仓库的单元测试,或者是执行编译,将你的代码进行打包分发,都是可以的。我们使用这个功能进行自动的文档生成和部署,基于mkdocs-material这个框架,我们只需要编写Markdown笔记,然后他会自动将其转换为在线网站的格式,生成html/js,非常方便!


图表 24—自动部署的在线文档,作者只需要编写MarkDown笔记,不需要掌握前端知识


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 下一页 尾页
  • 36回复贴,共3页
  • ,跳到 页  
<<返回广东技术师...吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示