news 2026/3/22 18:21:06

FPGA部署CNN全流程1——基础知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FPGA部署CNN全流程1——基础知识

目录

1.机器学习模式

1.1. 有监督学习 (Supervised Learning)

1.2. 无监督学习 (Unsupervised Learning)

1.3. 强化学习 (Reinforcement Learning, RL)

1.4. RLHF (Reinforcement Learning from Human Feedback)

四者对比总结

2.数据集获取方式

2.1. 有监督学习数据集 (Supervised Dataset)

2.2. 无监督学习数据集 (Unsupervised Dataset)

2.3. 强化学习数据集 (Reinforcement Learning Dataset)

2.4. RLHF 数据集 (RLHF Datasets)

2.5四种模式对比表

2.6 获取数据集的方式

2.6.1公开数据集网站获取

2.6.2 手动自作

(1)文件夹分割

(2)目标检测类型

(3)图像分割

3.机器学习网络搭建流程

3.1. 明确问题与数据准备 (Problem & Data)

3.2. 划分数据集 (Dataset Splitting)

3.3. 网络架构设计 (Model Architecture)

1. 架构是自己写的吗?

2. 如何搭建:神经网络的“积木”逻辑

A. 输入层 (Input Layer)

B. 特征提取层 (Feature Extraction / Backbone)

C. 分类层 (Classification Head)

3. 从简单到复杂

级别一:入门级(类 LeNet-5)

级别二:工业级标杆(ResNet - 残差网络)

级别三:硬件友好型(MobileNet / TinyML)

4. 针对 FPGA 部署的架构设计建议

搭建工具推荐

3.4. 编译模型 (Model Compilation)

3.5. 模型训练 (Model Training)

3.6. 模型评估与调试 (Evaluation & Tuning)

3.7. 模型保存与转换 (Deployment Preparation)


本篇笔记总结了最近所学的机器学习的知识,包括机器学习模式、数据集类型、网络搭建全流程,作为在FPGA中部署神经网络的基础知识。

1.机器学习模式

1.1. 有监督学习 (Supervised Learning)

核心比喻:老师带着有标准答案的课本来教课。

在有监督学习中,模型接收的是带标签 (Labeled)的数据。每一条输入数据 x 都有一个对应的正确答案 y。

  • 工作原理:模型预测一个结果,然后将其与标准答案对比。如果错了,模型会通过损失函数(Loss Function)计算误差,并调整内部参数以减少下次的误差。其目标是学习一个映射函数 f(x) = y。

  • 常见任务

    • 分类 (Classification):判断一张图片是猫还是狗。

    • 回归 (Regression):预测明年的房价(连续数值)。

  • 应用场景:垃圾邮件检测、人脸识别、医疗诊断。


1.2. 无监督学习 (Unsupervised Learning)

核心比喻:给学生一堆杂乱的乐高积木,让他们自己按颜色或形状分类。

模型处理的是没有标签 (Unlabeled)的数据。它不知道这些数据“是什么”,它的任务是发现数据内部潜藏的结构模式

  • 工作原理:模型通过计算数据点之间的相似度或分布特征,将相似的东西聚在一起,或者压缩数据的维度。

  • 常见任务

    • 聚类 (Clustering):根据购买行为将客户分为不同的群体。

    • 降维 (Dimensionality Reduction):简化复杂数据,提取核心特征(如 PCA)。

    • 关联分析:发现“买尿布的人通常也会买啤酒”这种规律。

  • 应用场景:用户画像分析、异常检测(如信用卡欺诈)、基因序列分析。


1.3. 强化学习 (Reinforcement Learning, RL)

核心比喻:驯兽师训练小狗,做对了给骨头,做错了不给。

强化学习不依赖静态的数据集,而是在交互中学习。

  • 核心组件

    • 智能体 (Agent):学习者。

    • 环境 (Environment):智能体所处的场景。

    • 动作 (Action):智能体做出的行为。

    • 奖励 (Reward):反馈信号(正奖或负罚)。

  • 工作原理:智能体在环境中采取行动,观察结果并获得奖励。它的目标是找到一种策略(Policy),使长期累积奖励最大化

  • 应用场景:自动驾驶、游戏 AI(如 AlphaGo)、机器人控制、量化交易。


1.4. RLHF (Reinforcement Learning from Human Feedback)

核心比喻:老师不再给标准答案,而是根据学生的作文写得“好不好看”来打分。

RLHF 是强化学习的一个特殊变种,也是让大语言模型(如 ChatGPT, Gemini)表现得像人类的关键技术。

  • 为什么需要它?:对于“写一首优美的诗”这种任务,没有唯一的标准答案(有监督学习很难做),也很难写出公式化的奖励函数(强化学习很难写 Reward)。但人类可以轻易判断:A 写的诗比 B 写的更好。

  • 训练步骤

    1. 有监督微调 (SFT):用人类写好的高质量问答对模型进行初步训练。

    2. 奖励模型训练 (RM):模型生成几个不同的回答,让人类进行排序(比如 A > C > B)。利用这些偏好数据训练一个“奖励模型”,这个模型学会了模拟人类的品味。

    3. 近端策略优化 (PPO):用这个“奖励模型”去指导原始模型进行强化学习。如果模型说出人类喜欢的话,奖励模型就给高分。

  • 作用:它解决了 AI 的**对齐(Alignment)**问题,确保模型生成的回答不仅逻辑正确,而且符合人类的价值观、安全且有用。


四者对比总结

维度有监督学习无监督学习强化学习RLHF
数据源结构化的标签数据原始无标签数据动态环境反馈人类偏好排序
反馈机制直接对比标准答案寻找数据内在联系奖励信号 (Reward)模拟人类品味的奖励模型
学习目标预测准确度发现潜在模式获取最大奖励与人类意图/价值观对齐

2.数据集获取方式

这四种学习模式对数据的“胃口”完全不同。简单来说,它们的差异在于数据的加工深度反馈的及时性以及人参与的方式

2.1. 有监督学习数据集 (Supervised Dataset)

  • 特征成对出现。每一条数据都必须由“输入 x”和对应的“标签 y”组成。(可以理解为图片+图片属于什么标签)

  • 数据集构成

  • 获取方式

    • 公开数据集:如ImageNet(图像分类)、MNIST(手写数字)、COCO(目标检测)。

    • 人工标注:这是最常见的商业手段。通过数据标注公司(如 Scale AI、Appen)雇佣大量人力,手动给图片打框或给文字分类。

    • 合成数据:利用已有的物理引擎或模拟器生成带标签的数据。


2.2. 无监督学习数据集 (Unsupervised Dataset)

  • 特征原始且海量。只有“输入 x”,没有任何人为标记的答案。

  • 数据集构成

  • 获取方式

    • 网络爬虫:从互联网抓取的文本(如 Common Crawl 数据集)、图片、视频。

    • 日志记录:服务器产生的用户访问日志、传感器采集的原始信号(如你之前研究的卫星频谱原始数据)。

    • 公共仓库Wikipedia全文、GitHub 代码库等。


2.3. 强化学习数据集 (Reinforcement Learning Dataset)

  • 特征交互式序列。强化学习通常不需要预先准备好的“静态数据集”,而是需要一个环境 (Environment)

  • 数据集构成:由状态、动作、奖励组成的轨迹

  • 获取方式

    • 仿真环境/模拟器

      • OpenAI Gymnasium:经典的控制类环境(如倒立摆、走迷宫)。

      • MuJoCo:高级物理动力学模拟。

      • CARLA:自动驾驶模拟器。

    • 离线强化学习 (Offline RL):如果无法实时交互,可以使用已有的历史运行记录(如工业机器人的历史操作日志)。


2.4. RLHF 数据集 (RLHF Datasets)

RLHF 并不是一种单一数据集,它通常包含三个阶段的不同数据:

  1. SFT 数据集(有监督微调)

    • 内容:人类写出的高质量“标准范文”。(例如:提问“如何写诗?”,给出一个人类写的优美示例)。

    • 获取:雇佣专业的“专家”来撰写回答。

  2. RM 数据集(奖励模型/偏好数据)

    • 内容排序/比较数据。模型给出 A 和 B 两个回答,人类勾选“A 比 B 好”。

    • 获取:通过标注平台,让标注员对模型生成的多个结果进行打分或排序。

  3. Prompt 数据集(提示词集)

    • 内容:纯问题集。用于最后的强化学习训练,让模型面对这些问题不断生成新回答。


2.5四种模式对比表

模式数据核心成分数据成本获取难点
有监督(x, y) 键值对高(标注贵)标注的准确性和一致性
无监督纯 x 原始数据低(量大)数据的清洗和去重
强化学习(s, a, r, s') 序列中(仿真成本)构建高精度的模拟环境
RLHF人类偏好排序 (A > B)极高(专家成本)人类主观标准的一致性

2.6 获取数据集的方式

2.6.1公开数据集网站获取

KaggleDatasets:Find Open Datasets and Machine Learning Projects | Kaggle

Hugging Face Datasets:Datasets – Hugging Face

2.6.2 手动自作

(1)文件夹分割

(2)目标检测类型

通过labelim等工具手动标注。(这个我还没用过)

(3)图像分割

通过labelme进行图像分割来标注。

3.机器学习网络搭建流程

搭建一个机器学习(尤其是深度学习)网络是一个系统工程,通常遵循从数据到模型,再到部署的标准化流程。

3.1. 明确问题与数据准备 (Problem & Data)

行业里有一句话:Data is the new oil.模型的上限由数据决定,算法只是在逼近这个上限。一切模型的基础都是数据。在开始写代码前,必须定义清楚任务。

  • 定义任务:确定是分类(分类别)、回归(预测连续值)还是聚类

  • 数据采集:从 Kaggle、Hugging Face 或传感器获取原始数据。

  • 数据清洗:处理缺失值、异常值和重复数据。

  • 特征工程

    • 归一化/标准化:将数据缩放到 [0, 1] 或均值为 0、方差为 1 的区间,防止梯度爆炸。

    • 提取特征:例如音频信号需要做 FFT(快速傅里叶变换)转为频谱图。比如做哨声识别,不能直接把波形丢进去,通常需要做STFT(短时傅里叶变换)转化为梅尔频谱图

3.2. 划分数据集 (Dataset Splitting)

为了保证模型的泛化能力,必须将数据分为三部分:

数据集占比作用
训练集 (Train)70% - 80%给模型“看”和“学”的,用于更新网络权重和偏置。
验证集 (Val)10% - 15%训练期间调整超参数,监控是否过拟合
测试集 (Test)10% - 15%最后用来考试的,模型之前从未见过,模型训练完成后,评估其实际表现。

3.3. 网络架构设计 (Model Architecture)

根据任务类型选择或设计神经网络结构。

  • 选择框架:目前主流是PyTorch(灵活、好调试)或TensorFlow/Keras(工程化强)。

  • 定义架构

    • 选择层类型:

      • 全连接层 (Dense/Linear):处理通用特征。

      • 卷积层 (Conv2D):处理空间特征(图像、频谱图)。

      • 循环层 (LSTM/GRU):处理时间序列(语音、文本)。

    • 激活函数:给网络注入非线性。例如 :

      • ReLU:隐层最常用,解决梯度消失。

      • Sigmoid/Softmax:用于输出层分类。

  • 初始化权重:随机给网络里的参数赋初值,好的初始化能让收敛快一倍。

架构一般是根据经典的模型来修改的。

决定神经网络的“长相”确实是整个开发过程中最具创造力的部分。简单来说:你可以完全“手搓”一个架构,也可以在巨人的肩膀上进行“微调”。

对于初学者或有特定硬件限制(如你的 FPGA 背景)的开发者,建议遵循从“借鉴成熟架构”到“自定义修改”的过程。

1. 架构是自己写的吗?

在实际开发中,通常有三种选择:

  • 完全自定义 (Custom Architecture):如果你有一个非常特殊的任务(比如在极其有限的资源下识别特定的哨声频率),你可以从头开始堆叠Conv2dReLUMaxPool。这就像用乐高积木拼出一个全新的造型。

  • 经典背骨 (Backbones):直接套用学术界公认的结构(如 ResNet, MobileNet)。这些结构经过了成千上万次实验验证,性能非常稳定。

  • 迁移学习 (Transfer Learning):直接拿别人训练好的模型(已经在数百万张图片上学过如何提取特征),你只需要把最后一层“分类头”换成你自己的(比如换成识别“哨声”和“环境音”)。

2. 如何搭建:神经网络的“积木”逻辑

一个标准的卷积神经网络(CNN)通常由三部分组成:

A. 输入层 (Input Layer)

你需要告诉网络数据的大小。如果你把哨声转成了的梅尔频谱图,那么输入就是(1, 64, 64)(1代表单通道)。

B. 特征提取层 (Feature Extraction / Backbone)

这是网络的主体,负责从原始信号中提取特征(如线条、频率跳变等)。

  • 卷积层 (Convolution):像一个放大镜,滑动观察局部特征。

  • 激活层 (Activation):通常用 $ReLU(x) = \max(0, x)$,目的是给网络增加非线性能力。

  • 池化层 (Pooling):压缩图片尺寸,减少计算量,同时保留最重要的信息。

C. 分类层 (Classification Head)
  • 全连接层 (Linear/Dense):将提取到的二维特征“拍扁”成一维向量。

  • Softmax 层:将输出转化为概率(比如:哨声 95%,噪音 5%)。

3. 从简单到复杂

如果你要实现哨声识别,以下是三个级别的参考架构:

级别一:入门级(类 LeNet-5)

适合初学者和资源极其匮乏的 FPGA 部署。

  • 结构:2个卷积层 + 2个池化层 + 2个全连接层。

  • 优点:参数极少(几万个),计算非常快,FPGA 逻辑资源占用低。

  • 参考代码 (PyTorch)

    self.conv1 = nn.Conv2d(1, 16, kernel_size=3) # 提取基础频率特征 self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(16, 32, kernel_size=3) self.fc1 = nn.Linear(32 * 14 * 14, 128) self.fc2 = nn.Linear(128, 2) # 输出两类:有哨声,无哨声
级别二:工业级标杆(ResNet - 残差网络)

如果你发现网络加深后反而学不动了,ResNet 是救星。

  • 核心残差连接 (Shortcut Connection)。它允许信息跨层传递,解决了深层网络的梯度消失问题。

  • 参考场景:如果你需要极高的识别准确率,且不介意稍大的计算量。

级别三:硬件友好型(MobileNet / TinyML)

这是最推荐你关注的方向,因为它专门为移动端和嵌入式(FPGA 可能借鉴其思想)设计。

  • 核心深度可分离卷积 (Depthwise Separable Convolution)

  • 参考价值:它将标准卷积拆分为两步,计算量直接下降到原来的,且准确率下降很少。


4. 针对 FPGA 部署的架构设计建议

既然你熟悉 Verilog 和信号处理,在搭建架构时需要特别考虑“硬件友好性”:

  1. 权重的定点化 (Quantization Friendly):在搭建时尽量选择简单的激活函数(如 ReLU),避免使用 Sigmoid 或 Tanh,因为后者在 FPGA 上需要消耗大量的查找表(LUT)或复杂的浮点计算。

  2. 避免巨大的全连接层:全连接层非常吃内存(BRAM)。尽量多用卷积层减少尺寸,最后接一个小的全连接层。

  3. 步长 (Stride) 代替池化:有时直接在卷积层设置stride=2来降维,比专门加一个Pooling层在硬件实现上更简洁。

  4. 算力对齐:尽量让通道数(Channel)是 8、16 或 32 的倍数,这样在 FPGA 并行处理(PE 阵列)时效率最高。


搭建工具推荐

  • 可视化工具:使用Netron。你可以下载别人的模型文件(.onnx 或 .h5),直接把文件拖进去,就能看到清晰的架构图。

网站地址:saved_model.pb

  • 代码参考:在 GitHub 搜索Simple Audio Classification PyTorch,你会看到很多现成的、专门针对声音识别优化过的精简架构。

3.4. 编译模型 (Model Compilation)

在训练开始前,需要配置三个核心要素:

  1. 损失函数 (Loss Function):衡量预测值与真实值的差距。

    • 回归:均方误差

    • 分类:交叉熵

  2. 优化器 (Optimizer):决定如何更新权重。

    • 常用:Adam(自适应)、SGD(随机梯度下降)。

  3. 评价指标 (Metrics):如 Accuracy(准确率)、Recall(召回率)。


3.5. 模型训练 (Model Training)

模型开始在训练集上迭代。

  • 正向传播:输入数据通过网络层,计算预测结果。

  • 反向传播:利用梯度下降法更新权重 W:

    其中是学习率(Learning Rate)。

  • 超参数调节:设置Batch Size(每批处理样本数)和Epochs(全量数据训练次数)。


3.6. 模型评估与调试 (Evaluation & Tuning)

观察训练曲线,判断模型状态:

  • 欠拟合 (Underfitting):训练集和验证集准确率都很低。解决:增加模型复杂度、减少正则化。

  • 过拟合 (Overfitting):训练集表现极好,但验证集表现很差。解决:引入DropoutL2 正则化或增加数据量。


3.7. 模型保存与转换 (Deployment Preparation)

  • 格式导出:将模型保存为.pth(PyTorch)、.h5(TensorFlow) 或通用格式ONNX

  • 量化/压缩:如果要在嵌入式设备或硬件(如 FPGA)上运行,通常需要将 浮点数转为 定点数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 9:46:41

Qwen3-Reranker-0.6B详细步骤:自定义评分函数扩展与业务规则注入方法

Qwen3-Reranker-0.6B详细步骤:自定义评分函数扩展与业务规则注入方法 1. 理解重排序的核心价值 在搜索和RAG系统中,重排序是提升精度的关键环节。想象一下这样的场景:你用搜索引擎查找"如何做番茄炒蛋",向量检索可能返…

作者头像 李华
网站建设 2026/3/15 16:47:58

新手必看:Qwen-Ranker Pro语义精排系统使用入门

新手必看:Qwen-Ranker Pro语义精排系统使用入门 1. 为什么你需要语义精排——从“搜得到”到“搜得准” 你有没有遇到过这样的情况:在企业知识库搜索“客户投诉处理流程”,返回的前几条结果却是《2024年销售激励方案》《季度财务报表模板》…

作者头像 李华
网站建设 2026/3/16 1:41:39

RexUniNLU部署教程:模型服务化(Triton Inference Server)封装指南

RexUniNLU部署教程:模型服务化(Triton Inference Server)封装指南 1. 为什么需要将RexUniNLU服务化? 你可能已经试过直接运行Gradio版的RexUniNLU——输入一段中文,点几下按钮,就能看到实体、事件、情感等…

作者头像 李华