QAT量化 demo

一、QAT量化基本流程

QAT过程可以分解为以下步骤:

  1. 定义模型:定义一个浮点模型,就像常规模型一样。
  2. 定义量化模型:定义一个与原始模型结构相同但增加了量化操作(如torch.quantization.QuantStub())和反量化操作(如torch.quantization.DeQuantStub())的量化模型。
  3. 准备数据:准备训练数据并将其量化为适当的位宽。
  4. 训练模型:在训练过程中,使用量化模型进行正向和反向传递,并在每个 epoch 或 batch 结束时使用反量化操作计算精度损失。
  5. 重新量化:在训练过程中,使用反量化操作重新量化模型参数,并使用新的量化参数继续训练。
  6. Fine-tuning:训练结束后,使用fine-tuning技术进一步提高模型的准确率。

在这里插入图片描述

二、QAT量化代码示例

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torch.quantization import QuantStub, DeQuantStub, quantize_dynamic, prepare_qat, convert# 模型
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 量化self.quant = QuantStub()self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU(inplace=True)self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(128, 10)# 反量化self.dequant = DeQuantStub()def forward(self, x):# 量化x = self.quant(x)x = self.conv1(x)x = self.relu(x)x = self.conv2(x)x = self.relu(x)x = self.avgpool(x)x = x.view(x.size(0), -1)x = self.fc(x)# 反量化x = self.dequant(x)return x# 数据
transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])
train_data = datasets.CIFAR10(root='./data', train=True, download=True,transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=1,shuffle=True, num_workers=0)# 模型 优化器
model = MyModel()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)# Prepare the model
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')
model = prepare_qat(model)# 训练
model.train()
for epoch in range(1):for i, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = nn.CrossEntropyLoss()(output, target)loss.backward()optimizer.step()if i % 100 == 0:print('Epoch: [%d/%d], Step: [%d/%d], Loss: %.4f' %(epoch+1, 10, i+1, len(train_loader), loss.item()))# Re-quantize the modelmodel = quantize_dynamic(model, {'': torch.quantization.default_dynamic_qconfig}, dtype=torch.qint8)# 微调
model.eval()
for data, target in train_loader:model(data)
model = convert(model, inplace=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络---第三天

OSI参考模型与TCP/IP模型 参考模型产生背景: 背景:①兼容性较差,接口不统一 ②不利于排错与维护 ③设备成本高 参考模型概念: 概念:OSI参考模型定义了网络中设备所遵守的层次结构 参考模型优点: 优点…

1分钟以上情感短视频素材去哪里找?推荐五个素材网站

在这个充斥着各种短视频的世界里,我就像是一名寻宝的冒险家,不断在素材的海洋中潜水,寻找那些能让我的视频金光闪闪的珍珠。让我告诉你,这不仅仅是一场寻宝,这简直是一场奇妙的冒险。九才素材网: 我的创作…

【读后感】程序员修炼之道——通向务实的最高境界

最近读了一本书——《程序员修炼之道》,颇有感悟。 你别被这个名字吓到了,程序员的修炼之道,听起来很悬,其实非常实用。 这本书,就是一个清单手册,有100条,每一条都是一个使用原则。如果你去读…

LeetCode题练习与总结:不同路径Ⅱ--63

一、题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从…

自动化运维(二十四)Ansible 实战查找插件和策略插件

Ansible 支持多种类型的插件,这些插件可以帮助你扩展和定制 Ansible 的功能。每种插件类型都有其特定的用途和应用场景。今天我们一起学习查找插件和策略插件。 一、查找插件(Lookup Plugins) Ansible 查找插件允许用户从外部数据源或在 An…

我企业的业务需要制作企业网站吗?11个支持的理由以及5个反对的理由!

如果你的企业经营得还不错,你可能会找出很多理由,说明为什么一个高效的网站对你来说并不那么重要。确实,你明白企业需要在互联网上有一定的存在感,但你可能并不认为一个高效的网站会对你的特定业务产生太大的影响——尤其是当你已…

【Linux】Socket编程接口 | 实现简单的UDP网络程序

文章目录 一、预备知识理解源IP地址和目的IP地址理解源mac地址和目的mac地址认识端口号理解源端口号和目的端口号理解“端口号(PORT)”和“进程ID(PID)” 认识TCP和UDP协议TCP协议UDP协议 网络字节序为什么网络字节序采用的是大端…

循环单链表算法库

学习贺老师数据结构 数据结构之自建算法库——循环单链表_循环单链表 csdn-CSDN博客​​​​​​ 整理总结出的循环单链表算法库 v1.0 : 基本实现功能 v2.0(2024.4.6): 修复Delete_SpecificLocate_CyclicList()删除节点函数bug,添加验证删除节点是否超范围判断 目录 1.主要功能…

react17中配置webpack:使用@代表src目录

在vue的项目中可以使用表示src目录,使用该符号表示绝对路径,那么在react中想要使用怎么办呢? 在react中使用表示src目录是需要在webpack中配置的,在核心模块node_modules-》react-scripts-》config-》webpack.config.js中搜索找到…

【数据结构与算法】之8道顺序表与链表典型编程题心决!

个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…

51-37 由浅入深理解 Stable Diffusion 3

2024年3月5日,Stability AI公开Stable Diffusion 3论文,Scaling Rectified Flow Transformers for High-Resolution Image Synthesis。公司像往常一样承诺后续将开源代码,开源之光!!! 在LDW潜在扩散模型论文…

​​​​网络编程学习探索系列之——广播原理剖析

hello !大家好呀! 欢迎大家来到我的网络编程系列之广播原理剖析,在这篇文章中, 你将会学习到如何在网络编程中利用广播来与局域网内加入某个特定广播组的主机! 希望这篇文章能对你有所帮助,大家要是觉得我写…

c#中怎么自动下载软件

以下是一个简单的 C# 示例,演示如何使用 WebClient 类下载软件: using System; using System.Net; class Program { static void Main(string[] args) { // 要下载的文件 URL string fileUrl "https://example.com/path/to/file"; // 本地保…

Leetcode算法训练日记 | day24

一、组合问题 1.题目 Leetcode:第 77 题 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4…

java中的Optional类和线程

Optional类&#xff1a; public static <T> Optional<T> of(T value) Returns an Optional describing the given non-null value. 通过非null值构建一个Optional容器&#xff0c;注意value不能为null&#xff0c;否则抛出异常 public static <T> Optional&…

福建单航次最大批量汽车“出海”

3月12日这一天&#xff0c;在福州海关的严密监管下&#xff0c;共有4000辆上汽名爵品牌的汽车被高效有序地装载到“安吉智慧”号滚装船上&#xff0c;这批车辆即将启程前往荷兰、埃及、英国等多个海外市场。在这批出口汽车中&#xff0c;新能源车型占据了显著的比例&#xff0c…

PostgreSQL高级sql积累

1&#xff1a;----查询postgresql数据中系统表与自己建立表结构做了个对比 select cl.relname,att.attname,att.atttypid,f.* from pg_class cl LEFT JOIN pg_attribute att on att.attrelid cl.oid LEFT JOIN td_f_field_info f on f.party_table_namecl.relname and f.fi…

[运维|GB28181] wvp-GB28181-pro+ZLMediaKit部署GB28181协议视频平台(windows)-个人笔记

相关软件下载地址 mysql下载地址 redis下载地址 vc运行库 linux安装说明 wvp-GB28181-proZLMediaKit部署GB28181协议视频平台全流程(ubuntu2204) wvp-GB28181-proZLMediaKit部署GB28181协议视频平台全流程(centos7) 若需要协助部署可私信我

OceanMind海睿思助力企业“数据入表”经济利益流入与生命周期管理

通过多年信息系统的建设与应用&#xff0c;企业积累了大量的数据。同时随着时间的推进&#xff0c;数据规模正以加速度快速增长。从国家到企业&#xff0c;都越来越关注所拥有的数据资源及其蕴含的深厚价值。很多企业已经逐渐认知到数据是重要的战略资源&#xff0c;数据资产化…

游标的定义和类型

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 游标的基本概念 游标从字面上理解为游动的光标&#xff0c;可以使用 Excel 表格来想象游标的作用&#xff0c;游标指向每一行&#xff0c;通过游标访问每行数据。 在 Orac…