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

目录

1.机器学习模式

[1.1. 有监督学习 (Supervised Learning)](#1.1. 有监督学习 (Supervised Learning))

[1.2. 无监督学习 (Unsupervised Learning)](#1.2. 无监督学习 (Unsupervised Learning))

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

[1.4. RLHF (Reinforcement Learning from Human Feedback)](#1.4. RLHF (Reinforcement Learning from Human Feedback))

四者对比总结

2.数据集获取方式

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

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

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

[2.4. RLHF 数据集 (RLHF Datasets)](#2.4. RLHF 数据集 (RLHF Datasets))

2.5四种模式对比表

[2.6 获取数据集的方式](#2.6 获取数据集的方式)

2.6.1公开数据集网站获取

[2.6.2 手动自作](#2.6.2 手动自作)

(1)文件夹分割

(2)目标检测类型

(3)图像分割

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

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

[3.2. 划分数据集 (Dataset Splitting)](#3.2. 划分数据集 (Dataset Splitting))

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

[1. 架构是自己写的吗?](#1. 架构是自己写的吗?)

[2. 如何搭建:神经网络的"积木"逻辑](#2. 如何搭建:神经网络的“积木”逻辑)

[A. 输入层 (Input Layer)](#A. 输入层 (Input Layer))

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

[C. 分类层 (Classification Head)](#C. 分类层 (Classification Head))

[3. 从简单到复杂](#3. 从简单到复杂)

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

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

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

[4. 针对 FPGA 部署的架构设计建议](#4. 针对 FPGA 部署的架构设计建议)

搭建工具推荐

[3.4. 编译模型 (Model Compilation)](#3.4. 编译模型 (Model Compilation))

[3.5. 模型训练 (Model Training)](#3.5. 模型训练 (Model Training))

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

[3.7. 模型保存与转换 (Deployment Preparation)](#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公开数据集网站获取

Kaggle DatasetsFind 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)上运行,通常需要将 浮点数转为 定点数。

相关推荐
九.九11 小时前
ops-transformer:AI 处理器上的高性能 Transformer 算子库
人工智能·深度学习·transformer
春日见11 小时前
拉取与合并:如何让个人分支既包含你昨天的修改,也包含 develop 最新更新
大数据·人工智能·深度学习·elasticsearch·搜索引擎
恋猫de小郭11 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
deephub12 小时前
Agent Lightning:微软开源的框架无关 Agent 训练方案,LangChain/AutoGen 都能用
人工智能·microsoft·langchain·大语言模型·agent·强化学习
偷吃的耗子12 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
大模型RAG和Agent技术实践12 小时前
从零构建本地AI合同审查系统:架构设计与流式交互实战(完整源代码)
人工智能·交互·智能合同审核
老邋遢12 小时前
第三章-AI知识扫盲看这一篇就够了
人工智能
互联网江湖12 小时前
Seedance2.0炸场:长短视频们“修坝”十年,不如AI放水一天?
人工智能
PythonPioneer12 小时前
在AI技术迅猛发展的今天,传统职业该如何“踏浪前行”?
人工智能
冬奇Lab13 小时前
一天一个开源项目(第20篇):NanoBot - 轻量级AI Agent框架,极简高效的智能体构建工具
人工智能·开源·agent