漫谈模型量化:从原理到实战的轻量化之旅

深度学习之Seq2Seq原理与实战 【代码】深度学习之Seq2Seq原理与实战。 阅读详情

1. 为什么我们需要模型量化?

大家好,我是老张,在AI和智能硬件这行摸爬滚打了十几年。今天想和大家聊聊一个让大模型“瘦身”的硬核技术——模型量化。这玩意儿听起来有点学术,但说白了,就是给模型“减肥”,让它跑得更快、吃得(内存和算力)更少。

你可能遇到过这种情况:好不容易在实验室用高端显卡训练出一个准确率超高的模型,兴冲冲地想把它塞进手机或者摄像头里,结果发现根本跑不动。模型动辄几百兆甚至几个G,推理一次要好几秒,内存直接爆掉。这就像你造了一台超跑,结果发现家门口是条泥巴路,根本开不起来。

模型量化,就是来解决这个“最后一公里”问题的。它的核心思想特别直观:用更少的“比特”来表示模型里的数字。我们训练模型时,默认用的都是32位的浮点数(FP32),一个数字就要占4个字节。但你想啊,模型里成千上万个参数,真的每个都需要这么高的精度吗?很多时候,把精度降到8位整数(INT8),模型大小直接缩小4倍,推理速度还能提升好几倍,而精度损失却微乎其微。

我最早接触量化是在一个智能摄像头的项目上。当时模型在服务器上跑得好好的,一放到端侧设备上,帧率直接从30掉到3,根本没法用。后来上了8位量化,模型体积小了,计算从浮点乘法变成了整数乘法,硬件算力被充分利用,实时视频分析才终于跑了起来。那次经历让我深刻体会到,没有量化的模型,就像没有轮子的汽车,性能再好也落不了地。

量化带来的好处是实实在在的:

  • 存储减负:模型文件直接瘦身,下载快,占空间小。这对于手机APP的更新和存储太关键了。
  • 内存减压:推理时,中间那些庞大的激活值(activation)张量也变小了。很多时候推理的瓶颈不在计算,而在内存访问(访存),量化能显著降低内存带宽压力。
  • 计算加速:绝大多数CPU、GPU和专用的AI芯片(NPU)对整数运算的优化都比浮点运算好得多,指令延迟更低,能耗也更小。在一些低功耗的FPGA或ASIC上,浮点运算单元可能根本没有,量化是部署的必经之路。
  • 功耗降低:移动数据是耗电大户。把32位的数据搬运换成8位的,功耗能下降一个数量级。对于靠电池供电的物联网设备,这直接决定了产品的续航。

所以,量化不是可选项,而是AI模型真正走向实用化、产品化的必由之路。接下来,我们就一层层剥开量化的原理。

2. 量化原理:从浮点到整数的数学魔术

2.1 量化的基本公式

量化听起来神秘,其实背后的数学挺优雅的。它的目标,是找到一个映射关系,把一段连续的浮点数(比如 -1.5 到 2.3)塞进一个有限的、离散的整数集合里(比如 -128 到 127)。

最常用的方法是线性量化。想象你有一把尺子(浮点数范围),现在要把它换成一把刻度更稀疏的尺子(整数范围)。这个过程需要两个关键参数:

  1. 缩放因子(Scale):新尺子上每一格代表原尺子上的多长距离。
  2. 零点(Zero Point):原尺子的“0”刻度对应新尺子的第几格。

用公式表示就是: 量化后的整数 q = round(浮点数 r / scale + zero_point)

反过来,从整数恢复回近似的浮点数(反量化)就是: 反量化后的浮数 r' = (q - zero_point) * scale

这里的 round 是四舍五入操作。scale 通常由浮点数张量的最大值和最小值决定:scale = (max_value - min_value) / (2^n - 1),其中 n 是量化的位数(比如8位就是255)。

2.2 对称量化 vs. 非对称量化

这里就引出了第一个重要的选择:对称量化 和 非对称量化。

  • 对称量化:强制让浮点数的0点精确地映射到整数的0点(即 zero_point = 0)。这把尺子以0为中心对称。它的好处是计算简单。在做乘法 q1 * q2 时,公式里没有 zero_point 的交叉项,硬件实现起来更高效。
  • 非对称量化:允许 zero_point 不为0。这把尺子的“0”刻度可以偏移。它的好处是能更充分地利用整数的表示范围。比如,经过ReLU激活函数后的张量,值全在0以上,用对称量化的话,负半边的整数就全浪费了。非对称量化可以把整个范围都利用起来,精度损失更小。

我个人的经验是,权重(Weight)通常用对称量化,因为它们的分布一般关于0对称(类似高斯分布)。而激活值(Activation)常用非对称量化,尤其是经过ReLU之后,全是非负数,非对称量化能更好地捕捉其动态范围。

2.3 量化粒度:粗放与精细

另一个关键选择是量化粒度,也就是多大一块数据共享一套 scale 和 zero_point。

  • 逐张量(Per-Tensor):整个一层神经网络的所有参数,共用一套量化参数。这是最粗的粒度,实现最简单,但精度损失可能较大。
  • 逐通道(Per-Channel):在卷积层中,每个输出通道(每个卷积核)使用独立的量化参数。因为不同卷积核的数值分布可能差异很大,为每个通道单独量化能更好地保留信息。这是目前的主流做法,尤其是在权重量化上。
  • 逐组(Per-Group):更细的粒度,比如把每个通道的参数再分成几组分别量化。这能进一步提升精度,但也会增加存储量化参数的开销和计算的复杂性。

简单来说,粒度越细,精度通常越高,但计算和存储开销也越大。在实际项目中,我一般会从逐通道量化开始尝试,它在精度和效率之间取得了很好的平衡。

2.4 训练后量化与量化感知训练

根据量化发生的时机,主要分为两大流派:

  • 训练后量化(Post-Training Quantization, PTQ):模型用FP32精度正常训练完成后,再收集一些数据(不需要标签,几十到几百张图就行,称为校准集),统计各层激活值的分布范围,然后直接套用上面的公式进行量化。优点是无须重新训练,简单快捷。对于大模型(如ResNet50),8位PTQ的精度损失通常可以控制在1%以内。
  • 量化感知训练(Quantization-Aware Training, QAT):在模型训练的过程中,就模拟量化的效果。具体做法是在前向传播时,插入“伪量化”节点,把权重和激活值先量化再反量化,让模型在训练时就“知道”自己未来会被量化,从而主动调整参数去适应这种精度损失。优点是精度更高,尤其对于4位及以下的超低精度量化,或者本身比较“脆弱”的小模型(如MobileNet),QAT几乎是必须的。

怎么选呢?我的建议是:先试PTQ,不行再上QAT。PTQ是性价比最高的方案,大部分工业场景的8位量化用它就够了。只有当PTQ掉点严重,或者你对精度有极致要求,或者需要做4位量化时,才需要考虑QAT,因为它需要完整的训练流程,成本高不少。

3. 实战指南:用PyTorch和TensorRT玩转量化

光说不练假把式,咱们直接上代码,看看怎么在PyTorch里把一个模型给量化了。

3.1 PyTorch动态量化:最简单的入门

PyTorch的量化API已经做得相当友好了。动态量化(Dynamic Quantization)是最容易上手的一种PTQ,它特别适合LSTM、Transformer这类包含大量线性运算(Linear)的模型。

import torch
import torch.quantization

# 1. 定义一个简单的LSTM模型
class SimpleLSTM(torch.nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super().__init__()
        self.lstm = torch.nn.LSTM(input_dim, hidden_dim, batch_first=True)
        self.fc = torch.nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        lstm_out, _ = self.lstm(x)
        out = self.fc(lstm_out[:, -1, :]) # 取最后一个时间步
        return out

# 创建并训练一个FP32模型(这里省略训练过程)
model_fp32 = SimpleLSTM(10, 20, 2)
model_fp32.eval() # 量化前务必切换到eval模式

# 2. 准备量化配置
# 指定要对哪些类型的层进行动态量化,这里量化Linear层
quantization_config = torch.quantization.default_dynamic_qconfig
# 或者使用针对移动端的配置:torch.quantization.per_channel_dynamic_qconfig

# 3. 准备模型(插入观察节点,用于收集动态范围)
model_to_quantize = torch.quantization.quantize_dynamic(
    model_fp32, # 原始模型
    {torch.nn.Linear}, # 指定要量化的模块类型
    dtype=torch.qint8 # 量化到8位整数
)

# 搞定!model_to_quantize现在就是一个动态量化模型了
print(model_to_quantize)

# 4. 运行量化模型
input_fp32 = torch.randn(1, 5, 10) # (batch, seq_len, input_dim)
with torch.no_grad():
    output = model_to_quantize(input_fp32)
    print(f"量化模型输出: {output}")

动态量化的“动态”体现在哪里呢?它只在计算前,根据当前输入的实时范围来决定激活值的量化参数。所以它不需要校准集,非常方便,但会引入一点点运行时开销。

3.2 PyTorch静态量化:更高的性能

对于CNN这类模型,更常用的是静态量化(Static Quantization)。它需要一个小型校准集来预先确定所有激活值的量化参数,一旦确定,推理时就固定了,因此性能更高。

import torch
import torch.quantization
from torch.ao.quantization import QuantStub, DeQuantStub

# 1. 定义一个需要量化的CNN模型,并插入量化存根
class QuantizableCNN(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.quant = QuantStub()  # 量化入口
        self.conv1 = torch.nn.Conv2d(3, 16, 3, 1, 1)
        self.relu1 = torch.nn.ReLU()
        self.pool1 = torch.nn.MaxPool2d(2)
        self.conv2 = torch.nn.Conv2d(16, 32, 3, 1, 1)
        self.relu2 = torch.nn.ReLU()
        self.avgpool = torch.nn.AdaptiveAvgPool2d((1, 1))
        self.fc = torch.nn.Linear(32, 10)
        self.dequant = DeQuantStub() # 反量化出口

    def forward(self, x):
        x = self.quant(x) # 从这里开始量化
        x = self.relu1(self.conv1(x))
        x = self.pool1(x)
        x = self.relu2(self.conv2(x))
        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        x = self.dequant(x) # 到这里反量化回浮点(如果需要)
        return x

# 2. 准备模型和数据
model_fp32 = QuantizableCNN()
model_fp32.eval()

# 准备一个小的校准数据集(通常来自训练集的一部分,无需标签)
calibration_data = [torch.randn(1, 3, 32, 32) for _ in range(100)]

# 3. 融合模块(Fuse Module)
# 将 Conv + ReLU, Conv + BN + ReLU 等常见组合融合成一个模块,便于量化
model_fp32_fused = torch.ao.quantization.fuse_modules(model_fp32, [['conv1', 'relu1'], ['conv2', 'relu2']])

# 4. 设置量化后端(比如用FBGEMM做服务器端推理,用QNNPACK做移动端)
model_fp32_fused.qconfig = torch.ao.quantization.get_default_qconfig('fbgemm')

# 5. 准备量化(插入观察者,用于在校准阶段收集统计信息)
torch.ao.quantization.prepare(model_fp32_fused, inplace=True)

# 6. 校准(运行校准数据,让观察者记录各层激活值的分布)
with torch.no_grad():
    for data in calibration_data:
        _ = model_fp32_fused(data)

# 7. 转换(将模型真正转换为量化版本)
model_int8 = torch.ao.quantization.convert(model_fp32_fused, inplace=True)
print(f"量化完成!模型结构:\n{model_int8}")

# 现在 model_int8 就是一个真正的INT8模型了,可以用于推理

这个过程比动态量化步骤多,但它是获得高性能量化模型的标准流程。关键步骤是融合和校准。融合能减少算子数量,提升效率;校准则决定了量化参数的好坏,直接影响精度。

3.3 TensorRT量化:工业级部署利器

如果你在做NVIDIA GPU上的高性能推理,TensorRT是绕不开的工具。它不仅仅是一个推理引擎,还内置了非常强大的量化校准工具。

TensorRT的量化属于PTQ,但它采用了一种更聪明的方法来确定激活值的量化参数:最小化KL散度。简单说,就是寻找一个量化后的分布,使其与原始的FP32激活值分布的“信息损失”最小。

# 这是一个简化的TensorRT量化流程概念示例,实际使用通常通过Python API或C++ API
import tensorrt as trt

# 1. 创建TensorRT记录器(Logger)和构建器(Builder)
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)

# 2. 创建网络定义
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, logger)

# 3. 解析ONNX模型(假设你已经将PyTorch模型导出为ONNX)
success = parser.parse_from_file("your_model.onnx")
if not success:
    for error in range(parser.num_errors):
        print(parser.get_error(error))

# 4. 配置构建器,启用INT8模式,并设置校准器(Calibrator)
config = builder.create_builder_config()
config.set_flag(trt.BuilderFlag.INT8)

# 创建一个校准器类,需要实现get_batch_size, get_batch, read_calibration_cache等方法
# 它负责提供校准数据给TensorRT
class MyCalibrator(trt.IInt8EntropyCalibrator2):
    def __init__(self, calibration_data):
        # 初始化, calibration_data是你的校准数据集迭代器
        ...
    def get_batch_size(self):
        return self.batch_size
    def get_batch(self, names):
        # 返回一个batch的校准数据
        try:
            batch = next(self.data_iterator)
            return [int(batch.data_ptr())]
        except StopIteration:
            return None
    ...

calibrator = MyCalibrator(calibration_data_loader)
config.int8_calibrator = calibrator

# 5. 构建优化后的INT8引擎
engine = builder.build_engine(network, config)

# 6. 序列化引擎并保存,供后续推理使用
with open('model_int8.engine', 'wb') as f:
    f.write(engine.serialize())

TensorRT的强大之处在于,它不仅仅是做了量化,还会进行图层融合、内核自动调优、内存优化等一系列操作,生成一个高度优化的推理引擎。我实测过一个ResNet-50模型,经过TensorRT INT8量化优化后,在T4 GPU上的推理速度比原始的PyTorch FP32模型快了近5倍。

4. 进阶策略:混合精度与超低比特量化

4.1 混合精度量化:把钱花在刀刃上

不是所有层对量化都同样敏感。有的层(比如网络的第一层和最后一层)信息密度高,量化后精度损失大;有的层(比如中间的某些卷积层)则非常鲁棒。混合精度量化就是给不同的层分配不同的比特宽度,敏感的层用高精度(如FP16甚至FP32),不敏感的层用低精度(如INT8甚至INT4)。

这就像一个精明的管家,把好钢用在刀刃上。但问题来了:怎么自动判断每层的敏感度呢?

  • 基于启发式的方法:比如HAWQ系列论文,利用Hessian矩阵(二阶信息)的特征值来衡量层的“曲率”。曲率大的地方,函数变化剧烈,量化容易引入误差,就需要更高的精度。
  • 基于强化学习/神经架构搜索(NAS)的方法:比如HAQ框架,将选择每层比特位宽的过程建模为一个强化学习问题,让智能体(Agent)通过与硬件环境交互(实际测量延迟、功耗),学习出在满足资源约束下精度最高的量化策略。

我在一个边缘计算盒子的项目里用过混合精度。那个盒子芯片支持INT8和FP16混合运算。我们通过简单的敏感度分析(逐层量化看精度下降),手动将输入层、输出层和某些注意力层设为FP16,其他层设为INT8,最终在精度零损失的情况下,速度比全INT8还快了15%,因为FP16层减少了大量反量化操作。

4.2 超低比特量化:挑战极限

当比特数降到4位、2位甚至1位(二值化)时,我们就进入了超低比特量化的领域。这带来的收益是巨大的:模型体积可压缩32倍,理论计算速度也能大幅提升(1位网络可以用XNOR和popcount位运算代替乘法)。

但挑战也是巨大的。信息被极度压缩,精度暴跌是家常便饭。为此,研究者们想出了各种办法:

  • 二值化/三值化网络:将权重和激活值限制为{-1, +1}或{-1, 0, +1}。代表性工作有BinaryConnect、XNOR-Net等。训练这类网络需要特殊的技巧,比如在反向传播时使用直通估计器(STE),绕过不可微的符号函数(sign)的梯度。
  • 知识蒸馏:用一个全精度的“教师模型”来指导一个低精度的“学生模型”训练,让学生模型模仿教师模型的输出分布(软标签),而不仅仅是硬标签。
  • 量化感知训练的加强版:设计更平滑的可微量化函数(如DSQ中的分段tanh近似),或者在训练中引入量化噪声模拟。

超低比特量化目前更多还在学术研究和特定硬件(如FPGA、专用ASIC)上探索。我在一个极度追求功耗的传感器项目里尝试过2位量化,配合定制化的芯片,功耗降到了令人惊喜的水平,但前期在算法调优上投入了巨大的精力。对于大多数应用,8位量化是当前工业界的甜点,在精度、速度和易用性上达到了最佳平衡。

5. 避坑指南:量化实战中的经验与教训

搞了这么多年量化,踩过的坑不计其数。这里分享几个最常见的,希望能帮你少走弯路。

坑一:精度掉得厉害,怎么办? 这是最常遇到的问题。首先,检查你的校准集。PTQ的校准集一定要有代表性,最好是从训练集或真实场景数据中随机采样几百张。如果校准集和真实数据分布差异大,量化参数会不准。其次,尝试逐通道量化,这几乎总能提升权重量化的精度。对于QAT,确保模拟量化的训练轮数足够,让模型有充分的时间适应量化噪声。最后,对于小模型(如MobileNet),PTQ可能确实不行,直接上QAT吧。

坑二:量化后速度没提升,甚至变慢了? 量化不是为了压缩模型大小吗,为什么推理可能变慢?问题可能出在反量化节点(DeQuantize)的插入位置上。如果量化/反量化操作频繁发生在计算图中,它们本身也会带来开销。要利用好算子融合。在PyTorch中,确保在prepare之前完成了fuse_modules。在TensorRT中,引擎构建时会自动进行深度的图层融合。一个融合良好的INT8卷积层,其计算内核是直接操作INT8数据的,中间没有显式的反量化。

坑三:某些算子不支持量化 这是部署时的大坑。比如你模型里用了一些自定义的、冷门的或者复杂的算子(某些特殊的激活函数、池化层等),框架可能没有提供它的量化版本。解决方案:1. 寻找替代算子,用有量化支持的算子实现相似功能。2. 将该层标记为不量化(在PyTorch中可以通过qconfig = None实现),让它保持FP32运行。这会导致该层前后需要插入量化/反量化操作,带来一些性能损失,但能保证模型正常运行。

坑四:训练和推理的数值不一致 这在QAT中尤其需要注意。QAT时,我们插入的是“伪量化”节点,它会在训练时模拟量化噪声,但权重本身还是FP32。在导出模型时,必须用convert函数将伪量化节点替换为真实的量化操作。如果导出流程不对,或者推理引擎没有正确加载量化参数,就会导致不一致。务必使用框架提供的标准导出和加载流程,并在导出后,用少量数据在推理端验证输出是否与训练时一致。

模型量化是一门工程艺术,需要在理论理解和实际调优中不断摸索。没有放之四海而皆准的最优解,最好的策略就是针对你的模型、你的数据、你的目标硬件,进行迭代实验。从PTQ开始,不行就上QAT,再考虑混合精度。记住,我们的目标不是追求极致的压缩比,而是在可接受的精度损失内,获得最大的部署收益。当你看到经过量化的模型在资源受限的设备上流畅运行时,那种成就感,就是对我们工程师最好的回报。

深度学习之TF-IDF原理与实战 【代码】深度学习之TF_IDF原理与实战。 阅读详情

相关推荐

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 269

深度学习0:数学知识:正态分布1

步骤内容结果1引入e−x2e^{-x^2}e−x2钟形曲线2算它的面积I∫−∞∞e−x2dxI∫−∞∞​e−x2dx3平方变成二重积分I2I^2I24换极坐标简化计算5算出I2πI^2 = \piI2πIπIπ​6代入σ\sigmaσ和μ\muμ做变量替换得到σ2πσ2π​7除以它归一化得到正态分布公式2π2π​不是随便写的,它来自高斯积分∫−∞∞e−x2。

tellmewhoisi的博客 204

深度学习之词袋(Bag-of-Words, BoW)原理与实战

【代码】深度学习之词袋(Bag-of-Words, BoW)原理与实战。

yumiwangzi30的博客 230

基于深度学习的商品评论情感分析系统-毕业设计

面向商品评论的中文情感分析系统,支持单条预测、批量分析、情感分布与关键词、报告导出。TextCNN、BiLSTM、Transformer 在同一词表、同一数据切分、同一种子与超参下公平对比,测试集 F1 分别为 0.9101、0.9089、0.9075。结论是这一规模下模型复杂度未带来收益,但误差结构不同。附技术栈、截图、文档预览与演示视频。

csbysj2020 122

AI对战五子棋——深度学习策略网络

在本篇博文中,我们完成了:✔ 构建一个 CNN 五子棋策略网络✔ 让神经网络输出落子概率✔ 使用 Policy Gradient 强化学习训练 AI✔ 让 AI 实现人与 AI、AI 自对弈博弈。

X2829352498的博客 34

SAP PP工艺路线Routing保姆级配置指南:从CA01创建到替代/并行顺序实战

本文详细解析SAP PP模块中工艺路线(Routing)的配置与应用,从基础创建(CA01)到高级功能如替代顺序和并行顺序的实战操作。通过真实案例演示,帮助用户掌握SAP PP工艺路线的精细化管理,提升生产流程效率。

weixin_30898555的博客 389

Transformer 为什么能取代 RNN?从自注意力讲起

2017 年谷歌在《Attention Is All You Need》中提出 Transformer,核心是。它如今是 GPT、BERT、ChatGPT 的共同底座。

anew___的博客 788

【python】geopandas库安装出现各种问题?可以看看这篇文章

geopandas的安装方法

jgsecurity的博客 3888

图解循环神经网络(RNN)

RNN(循环神经网络)就是“带记忆的网络”:让网络拥有一块“记忆”,在处理当前数据时,能同时参考之前看过的内容;它不一次性看完全部输入,而是像人读书一样,一个字一个字地读,每读一个字就更新一次脑子里的记忆,然后用这份记忆去理解当前这个字。但便签一直在被改写,新信息不断挤占旧信息,传到第 40 步时,“巴黎”的痕迹已经淡得几乎没了。读到“贵”的时候,网络并没有重新去查“好看”这个词——但“好看”的影响已经融在了便签里(那个 1.5)。这三个困难的共同点:答案不在当前这一个字里,而在“前面那串东西”里。

技术管理两手抓,两手都要硬. 382

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 406

YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 5499

【原创深度学习项目】基于深度学习的建筑工地防护装备检测系统|安全帽与反光衣检测系统(RT-DETR-L 模型)

本文设计并实现了一套基于RT-DETR-L的建筑工地防护装备检测系统,采用Django+Vue前后端架构,实现对安全帽、反光背心等7类装备及“无PPE”“未戴安全帽”等缺失状态的精准识别。系统支持图片、视频、摄像头实时检测,具备参数可调、数据可视化与统计分析功能,有效解决小目标漏检、误检及管理难问题,助力智慧工地安全管理落地。文末可获取源码。

qq_1445749146的博客 226

信息安全管理与评估赛题解析-单机取证(含环境)

链接:https://pan.baidu.com/s/1OMzIq884dW2vAiUp0k2Ppg。链接:https://pan.baidu.com/s/1i5daMqhD53wYeQ6hYzRK6Q。链接:https://pan.baidu.com/s/1QFAjdQZK4sJ-gGRP42XPKA。链接:https://pan.baidu.com/s/1BSXvqN2ZGCQXewgFULoeyQ。链接:https://pan.baidu.com/s/1g9zu5ngBz_KMjW1eBMkJAw。

Brucye 1835

神经网络入门指南:从 CNN、RNN 到 Attention

神经网络的学习,本质是“预测—比较—纠错”的循环;CNN 通过局部连接与权重共享理解图像;RNN 通过隐藏状态传递上下文;LSTM 和 GRU 用门控机制管理记忆;Encoder–Decoder 把理解与生成拆成两个阶段;Attention 则让模型在每一步都能主动寻找最相关的信息。到这里,我们已经走完了从普通神经网络到 Attention 的完整路线。下一篇将正式进入 Transformer,看看它如何摆脱 RNN 的顺序计算,又如何让每个 Token 直接找到与自己相关的信息。

爱敲代码的小黄 368

SSD |(二)SSD主控

控制器作为一个片上系统,处理来自用户端的命令并负责管理闪存颗粒。

知识库搭建ing 1965

基于卷积神经网络的球罐结构损伤识别

球罐结构损伤识别方法研究 摘要:本研究针对球形储罐(球罐)结构健康监测需求,提出基于卷积神经网络(CNN)的损伤识别方法。通过ANSYS有限元仿真构建包含5种裂纹深度的500组振动信号数据集,设计包含卷积层、池化层和全连接层的CNN网络架构。实验结果表明,该方法在训练集和测试集上分别达到98.4%和96.0%的准确率,验证了其在球罐焊缝损伤识别中的有效性。研究提供了完整的MATLAB实现代码,为球罐结构智能化监测提供了技术参考。 关键词:球罐结构;卷积神经网络;损伤识别;振动信号;深度学习

AI的内部世界的博客 120

CNN 卷积神经网络深度解析:卷积、池化与特征提取的底层原理

卷积核(Kernel),也叫滤波器(Filter),本质上是一个可以训练的权重矩阵。1 0 -11 0 -11 0 -1这个卷积核可以对图像中的局部像素进行加权计算。不同的卷积核能够提取不同类型的特征:水平边缘特征垂直边缘特征纹理特征角点特征局部形状特征在传统图像处理中,滤波器通常由人工设计。而在 CNN 中,卷积核的权重通过训练数据和反向传播自动学习得到。这也是 CNN 能够自动提取图像特征的关键。# 第一层卷积padding=1# 第二层卷积padding=1。

2503_90237586的博客 252

深度强化学习 | 基于SAC算法的动态避障(ROS C++仿真)

本文介绍了基于SAC(软性演员-评论家)算法的机器人运动规划方法,通过PyTorch框架实现了端到端训练,并部署到Python和ROS C++中。实验结果显示,基于SAC算法的智能体在动态避障任务中表现良好,能实现从起点到终点的无碰撞导航。

FRIGIDWINTER的博客 8217

图解常用深度学习优化器

来隐式构造 Hessian 逆的近似,从而直接估计出“谷底在哪”,而非仅仅判断“哪边最陡”。即SGD/Adam 主要看“当前坡度”,LBFGS 还会看“最近几步坡度怎么变”,像用局部地形图来规划路线。训练 Transformer 时,有些层梯度大,有些层梯度小。如果用 Adam + L2,梯度大的参数反而可能被“少衰减”,正则效果不稳定;:你要下山,但每次迈步前都要派侦察兵把整座山的每一个坡面都测量一遍,算出“绝对最陡”的方向才走一步。:还是下山,但这次你只问身边一个路人“哪边最陡”,然后就走。

技术管理两手抓,两手都要硬. 213

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

基于深度学习的猫图像目标检测方法研究:YOLOv8s模型海选、多种子对比训练与Django+ONNX部署实现详解

本课题基于深度学习研究猫图像目标检测问题。数据集含1000张猫图像、1188个标注框,按固定比例划分并冻结清单;训练前在多个候选族中短训海选,确定YOLOv8s为主模型,经学习率搜索与显存标定后完成150轮训练,验证集mAP50达到0.92,并以7个随机种子的对比实验验证稳定性。最优权重导出为ONNX接入Django系统,提供图片、视频、摄像头三种识别方式,配套识别记录管理与统计大屏,形成从训练到应用的完整闭环。

WEIXIN_JSJBSZDS的博客 197

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

qq_2529413168的博客 195

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深度学习0:数学知识:正态分布2(积分,幂函数积分公式)

积分符号∫(\int∫= 把无数个极窄的小矩形面积(高度×dx(\times dx×dx))“拼接”起来。dx(dxdx= 无穷小的宽度。定积分的结果= 曲线下方的总面积(一个具体的数字)。不定积分= 寻找求导前的那个原函数。这就是“积分求面积”最朴素的意思!

tellmewhoisi的博客 210

【深度学习实验】—— YOLOv12 添加 SE 注意力机制:实现、训练与水果检测对比

本次实验在 YOLOv12n 中接入 SE(Squeeze-and-Excitation)通道注意力,使用已有四类水果数据集,完成模块编写、模型解析器注册、前向与梯度检查、模型训练和最佳权重评估。项目本次设置与结果模型YOLOv12n 基线 / YOLOv12n SE 替换版任务四类水果目标检测数据集200 张图片,594 个标注框划分训练 160 张 / 验证 20 张 / 测试 20 张训练两组各 2 轮,batch=2,imgsz=640,seed=0,随机初始化。

weixin_65899656的博客 219

遥感大棚语义分割数据集 深度学习 语义分割 遥感影像 农业大棚 YOLO格式 数据集发布5025期

遥感大棚语义分割数据集 深度学习 语义分割 遥感影像 农业大棚 YOLO格式 数据集发布5025期

qq_2529413168的博客 123

计算机毕业设计选题推荐:【基于深度学习的车辆损坏严重程度评估方法研究】ResNet50 图像分类

系统用 ResNet50 完成轻微、中度、严重三档分类,输出类别、置信度和单次耗时;视频按每秒一帧抽帧识别,历史区同步出图,没识别出来的帧也保留原图;识别记录可检索、看详情和删除,大屏按类别、时段和任务类型做统计。训练采用迁移学习,部署走 ONNX,推理前加纯色和域外两道拒识,尽量避免把非车损画面硬判成某一类。

BYSJLG的博客 228
上一篇: Tauri 2.0系统托盘进阶:动态菜单与事件交互实战
下一篇: FPGA开发实战:Vivado与Vitis联合调试MicroBlaze软核的完整流程(含ILA调试技巧)
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值