当前位置: 首页 > news >正文

网站建设一定要公司吗wordpress大学主题2.7

网站建设一定要公司吗,wordpress大学主题2.7,开远市住房和城乡建设局网站,做视频网站 服务器2.模型标定 当然可以#xff0c;模型量化中的标定#xff08;calibration#xff09;是一个关键过程#xff0c;它主要确保在降低计算精度以减少模型大小和提高推理速度的同时#xff0c;不会显著损害模型的准确性。现在#xff0c;我将根据您提供的步骤解释这一过程。 …2.模型标定 当然可以模型量化中的标定calibration是一个关键过程它主要确保在降低计算精度以减少模型大小和提高推理速度的同时不会显著损害模型的准确性。现在我将根据您提供的步骤解释这一过程。 1. 收集网络层的输入/输出信息 首先我们需要通过运行模型使用标定数据集而不是训练数据或测试数据来收集关于每层的输入和输出的信息。这个数据集应该是多样化的以便涵盖到可能的各种情况。 在这一步中模型是在推理模式下运行的所有层的输出都被记录下来。这通常是通过修改模型的代码来实现的以便在每个层之后捕获并存储激活的分布。这些数据将用于下一步中的统计分析。 具体实施时这一步可能涉及编写一个循环该循环遍历标定数据集的每个样本并逐一通过模型。在每一层您需要捕获并可能临时存储输入和输出数据通常是张量的形式。 def collect_stats(model, data_loader, device, num_batch200):model.eval() # 将模型设置为评估推理模式。这在PyTorch中很重要因为某些层如Dropout和BatchNorm在训练和评估时有不同的行为。# 开启校准器for name, module in model.named_modules(): # 遍历模型中的所有模块。named_modules()方法提供了一个迭代器按层次结构列出模型的所有模块及其名称。if isinstance(module, quant_nn.TensorQuantizer): # 检查当前模块是否为TensorQuantizer类型即我们想要量化的特定类型的层。if module._calibrator is not None: # 如果此层配备了校准器。module.disable_quant() # 禁用量化。这意味着层将正常未量化运行使校准器能够收集必要的统计数据。module.enable_calib() # 启用校准。这使得校准器开始在此层的操作期间收集数据。else:module.disable() # 如果没有校准器简单地禁用量化功能但不进行数据收集。# 在此阶段模型准备好接收数据并通过处理未量化的数据来进行校准。# testwith torch.no_grad(): # 关闭自动求导系统。这在进行推理时是有用的因为它减少了内存使用量加速了计算而且我们不需要进行反向传播。for i, datas in enumerate(data_loader): # 遍历数据加载器。数据加载器将提供批量的数据通常用于训练或评估。imgs datas[0].to(device, non_blockingTrue).float()/255.0 # 获取图像数据转换为适当的设备例如GPU并将其类型转换为float。除以255是常见的归一化技术用于将像素值缩放到0到1的范围。model(imgs) # 用当前批次的图像数据执行模型推理。if i num_batch: # 如果我们已经处理了指定数量的批次则停止迭代。break# 关闭校准器for name, module in model.named_modules(): # 再次遍历所有模块就像我们之前做的那样。if isinstance(module, quant_nn.TensorQuantizer): # 对于TensorQuantizer类型的模块。if module._calibrator is not None: # 如果有校准器。module.enable_quant() # 重新启用量化。现在校准器已经收集了足够的统计数据我们可以再次量化层的操作。module.disable_calib() # 禁用校准。数据收集已经完成因此我们关闭校准器。else:module.enable() # 如果没有校准器我们只需重新启用量化功能。# 在此阶段校准过程完成模型已经准备好以量化的状态进行更高效的运行。2. 计算动态范围和比例因子 一旦我们收集了各层的激活数据接下来的步骤是分析这些数据来确定量化参数即动态范围也称为量化范围和比例因子scale。 动态范围是指在量化过程中张量数据可以扩展到的范围。它是原始数据的最大值和最小值之间的差值。这个范围很重要因为我们希望我们的量化表示能够覆盖可能的所有值从而避免饱和和信息丢失。 这个过程中method: A string. One of [‘entropy’, ‘mse’, ‘percentile’] 我们有三种办法这个实际上要在做实验的时候看哪一个精度更高这个就是看map值计算的区别 def compute_amax(model, device, **kwargs):# 遍历模型中的所有模块model.named_modules()方法提供了一个迭代器包含模型中所有模块的名称和模块本身。for name, module in model.named_modules():# 检查当前模块是否为TensorQuantizer的实例这是处理量化的部分。if isinstance(module, quant_nn.TensorQuantizer):# 这里的print语句已被注释掉如果取消注释它将打印当前处理的模块的名称。# print(name)# 检查当前的量化模块是否具有校准器。if module._calibrator is not None:# 如果该模块的校准器是MaxCalibrator的实例一种特定类型的校准器...if isinstance(module._calibrator, calib.MaxCalibrator):# ...则调用load_calib_amax()方法该方法计算并加载适当的amax值它是量化过程中用于缩放的最大激活值。module.load_calib_amax()else:# ...如果校准器不是MaxCalibrator我们仍然调用load_calib_amax方法但是可以传递额外的关键字参数。# 这些参数可能会影响amax值的计算。module.load_calib_amax(**kwargs) # [entropy, mse, percentile] 这里有三个计算方法实际过程中要看哪一个比较准再考虑用哪一个# 将计算出的amax值现在存储在模块的_amax属性中转移到指定的设备上。# 这确保了与模型数据在同一设备上的amax值这对于后续的计算步骤如训练或推理至关重要。module._amax module._amax.to(device)Scanning /app/dataset/coco2017/val2017.cache images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100%|███████████████████████| 5000/5000 [00:00?, ?it/s] Origin pth_Model map: Class Images Labels P R mAP.5 mAP.5:.95: 100%|█████████████████████████████████████| 625/625 [00:4900:00, 12.61it/s]all 5000 36781 0.717 0.626 0.675 0.454 Fusing layers... RepConv.fuse_repvgg_block RepConv.fuse_repvgg_block RepConv.fuse_repvgg_block IDetect.fuse QDQ auto init map: Class Images Labels P R mAP.5 mAP.5:.95: 100%|█████████████████████████████████████| 625/625 [00:3900:00, 15.78it/s]all 5000 36781 0.718 0.627 0.676 0.455 Calibrate Model map: Class Images Labels P R mAP.5 mAP.5:.95: 100%|█████████████████████████████████████| 625/625 [01:4200:00, 6.09it/s]all 5000 36781 0.73 0.618 0.674 0.4542.3 完整代码 import torch from pytorch_quantization import quant_modules from models.yolo import Model from pytorch_quantization.nn.modules import _utils as quant_nn_utils from pytorch_quantization import calib import sys import re import yaml import os os.chdir(/app/bob/yolov7_QAT/yolov7)def load_yolov7_model(weight, devicecpu):ckpt torch.load(weight, map_locationdevice) # 加载模型模型参数在哪个设备上model Model(cfg/training/yolov7.yaml, ch3, nc80).to(device) # 跟yolov7的结构这里没有包含参数state_dict ckpt[model].float().state_dict() # 从加载的权重中提取模型的状态字典(state_dict), 包含了模型全部的参数包括卷积权重等model.load_state_dict(state_dict, strictFalse) # 把提取出来的参数放到yolov7的结构中return model # 返回正确权重和参数的模型import collections from utils.datasets import create_dataloader def prepare_dataset(cocodir, batch_size8): dataloader create_dataloader( # 这里的参数是跟官网的是一样的f{cocodir}/val2017.txt,imgsz640,batch_sizebatch_size,optcollections.namedtuple(Opt, single_cls)(False), # collections.namedtuple(Opt, single_cls)(False)augmentFalse, hypNone, rectTrue, cacheFalse, stride32, pad0.5, image_weightsFalse,)[0]return dataloaderimport test as test from pathlib import Path import os def evaluate_coco(model, loader, save_dir., conf_thres0.001, iou_thres0.65):if save_dir and os.path.dirname(save_dir) ! :os.makedirs(os.path.dirname(save_dir), exist_okTrue)return test.test(./data/coco.yaml,save_dirPath(save_dir),conf_thresconf_thres,iou_thresiou_thres,modelmodel,dataloaderloader,is_cocoTrue,plotsFalse,half_precisionTrue,save_jsonFalse)[0][3] from pytorch_quantization import nn as quant_nn from pytorch_quantization.tensor_quant import QuantDescriptor from absl import logging as quant_logging # intput QuantDescriptor: Max Histogram def initialize():quant_desc_input QuantDescriptor(calib_methodhistogram) # max quant_nn.QuantConv2d.set_default_quant_desc_input(quant_desc_input)quant_nn.QuantMaxPool2d.set_default_quant_desc_input(quant_desc_input)quant_nn.QuantLinear.set_default_quant_desc_input(quant_desc_input)quant_logging.set_verbosity(quant_logging.ERROR) def prepare_model(weight, device):# quant_modules.initialize() # 自动加载qdq节点initialize() # intput QuantDescriptor: Max Histogrammodel load_yolov7_model(weight, device)model.float()model.eval()with torch.no_grad():model.fuse() # conv bn 进行层的合并, 加速return model# 执行量化替换 def transfer_torch_to_quantization(nn_instance, quant_mudule):quant_instance quant_mudule.__new__(quant_mudule)for k, val in vars(nn_instance).items():setattr(quant_instance, k, val)def __init__(self):# 返回两个QuantDescriptor的实例 self.__class__是quant_instance的类, EX: QuantConv2dquant_desc_input, quant_desc_weight quant_nn_utils.pop_quant_desc_in_kwargs(self.__class__)if isinstance(self, quant_nn_utils.QuantInputMixin):self.init_quantizer(quant_desc_input)if isinstance(self._input_quantizer._calibrator, calib.HistogramCalibrator):self._input_quantizer._calibrator._torch_hist Trueelse:self.init_quantizer(quant_desc_input, quant_desc_weight)if isinstance(self._input_quantizer._calibrator, calib.HistogramCalibrator):self._input_quantizer._calibrator._torch_hist Trueself._weight_quantizer._calibrator._torch_hist True__init__(quant_instance)return quant_instancedef quantization_ignore_match(ignore_layer, path):if ignore_layer is None:return Falseif isinstance(ignore_layer, str) or isinstance(ignore_layer, list):if isinstance(ignore_layer, str):ignore_layer [ignore_layer]if path in ignore_layer:return Truefor item in ignore_layer:if re.match(item, path): return True return False# 递归函数 def torch_module_find_quant_module(module, module_dict, ignore_layer, prefix):for name in module._modules:submodule module._modules[name]path name if prefix else prefix . nametorch_module_find_quant_module(submodule, module_dict, ignore_layer, prefixpath)submodule_id id(type(submodule))if submodule_id in module_dict:ignored quantization_ignore_match(ignore_layer, path)if ignored:print(fQuantization : {path} has ignored.)continue# 转换module._modules[name] transfer_torch_to_quantization(submodule, module_dict[submodule_id])# 用量化模型替换 def replace_to_quantization_model(model, ignore_layerNone):这里构建的module_dict里面的元素是一个映射的关系, 例如torch.nn - quant_nn.QuantConv2d, 一共是15个, 跟DEFAULT_QUANT_MAP对齐module_dict {}for entry in quant_modules._DEFAULT_QUANT_MAP: # 构建module_dict, 把DEFAULT_QUANT_MAP填充module getattr(entry.orig_mod, entry.mod_name) # 提取的原始的模块从torch.nn中获取conv2d这个字符串module_dict[id(module)] entry.replace_mod # 使用替换的模块torch_module_find_quant_module(model, module_dict, ignore_layer)def collect_stats(model, data_loader, device, num_batch200):model.eval() # 将模型设置为评估推理模式。这在PyTorch中很重要因为某些层如Dropout和BatchNorm在训练和评估时有不同的行为。# 开启校准器for name, module in model.named_modules(): # 遍历模型中的所有模块。named_modules()方法提供了一个迭代器按层次结构列出模型的所有模块及其名称。if isinstance(module, quant_nn.TensorQuantizer): # 检查当前模块是否为TensorQuantizer类型即我们想要量化的特定类型的层。if module._calibrator is not None: # 如果此层配备了校准器。module.disable_quant() # 禁用量化。这意味着层将正常未量化运行使校准器能够收集必要的统计数据。module.enable_calib() # 启用校准。这使得校准器开始在此层的操作期间收集数据。else:module.disable() # 如果没有校准器简单地禁用量化功能但不进行数据收集。# 在此阶段模型准备好接收数据并通过处理未量化的数据来进行校准。# testwith torch.no_grad(): # 关闭自动求导系统。这在进行推理时是有用的因为它减少了内存使用量加速了计算而且我们不需要进行反向传播。for i, datas in enumerate(data_loader): # 遍历数据加载器。数据加载器将提供批量的数据通常用于训练或评估。imgs datas[0].to(device, non_blockingTrue).float()/255.0 # 获取图像数据转换为适当的设备例如GPU并将其类型转换为float。除以255是常见的归一化技术用于将像素值缩放到0到1的范围。model(imgs) # 用当前批次的图像数据执行模型推理。if i num_batch: # 如果我们已经处理了指定数量的批次则停止迭代。break# 关闭校准器for name, module in model.named_modules(): # 再次遍历所有模块就像我们之前做的那样。if isinstance(module, quant_nn.TensorQuantizer): # 对于TensorQuantizer类型的模块。if module._calibrator is not None: # 如果有校准器。module.enable_quant() # 重新启用量化。现在校准器已经收集了足够的统计数据我们可以再次量化层的操作。module.disable_calib() # 禁用校准。数据收集已经完成因此我们关闭校准器。else:module.enable() # 如果没有校准器我们只需重新启用量化功能。# 在此阶段校准过程完成模型已经准备好以量化的状态进行更高效的运行。def compute_amax(model, device, **kwargs):# 遍历模型中的所有模块model.named_modules()方法提供了一个迭代器包含模型中所有模块的名称和模块本身。for name, module in model.named_modules():# 检查当前模块是否为TensorQuantizer的实例这是处理量化的部分。if isinstance(module, quant_nn.TensorQuantizer):# 这里的print语句已被注释掉如果取消注释它将打印当前处理的模块的名称。# print(name)# 检查当前的量化模块是否具有校准器。if module._calibrator is not None:# 如果该模块的校准器是MaxCalibrator的实例一种特定类型的校准器...if isinstance(module._calibrator, calib.MaxCalibrator):# ...则调用load_calib_amax()方法该方法计算并加载适当的amax值它是量化过程中用于缩放的最大激活值。module.load_calib_amax()else:# ...如果校准器不是MaxCalibrator我们仍然调用load_calib_amax方法但是可以传递额外的关键字参数。# 这些参数可能会影响amax值的计算。module.load_calib_amax(**kwargs) # [entropy, mse, percentile] 这里有三个计算方法实际过程中要看哪一个比较准再考虑用哪一个# 将计算出的amax值现在存储在模块的_amax属性中转移到指定的设备上。# 这确保了与模型数据在同一设备上的amax值这对于后续的计算步骤如训练或推理至关重要。module._amax module._amax.to(device)def calibrate_model(model, dataloader, device):# 收集信息collect_stats(model, dataloader, device)# 获取动态范围,计算amax值,scale值compute_amax(model, device, methodmse)if __name__ __main__:weight ./yolov7.ptcocodir /app/dataset/coco2017 #../dataset/coco2017device torch.device(cuda:2 if torch.cuda.is_available() else cpu)# load最初版本的模型pth_model load_yolov7_model(weightweight, devicedevice)# print(pth_model)dataloader prepare_dataset(cocodircocodir, )print(Origin pth_Model map: )ap evaluate_coco(pth_model, dataloader)# 加载自动插入QDQ节点的模型# print(Before prepare_model)model prepare_model(weightweight, devicedevice)# print(After prepare_model)print(QDQ auto init map: )qdq_auto_ap evaluate_coco(model, dataloader)# print(Before replace_to_quantization_model)replace_to_quantization_model(model)# print(After replace_to_quantization_model)# print(Before calibrate_model)calibrate_model(model, dataloader, device)# print(After calibrate_model)print(Calibrate Model map: )cali_ap evaluate_coco(model, dataloader)
http://www.w-s-a.com/news/728743/

相关文章:

  • 网站建设:上海珍岛网页版qq空间登录
  • 网站服务器ipteahouse wordpress主题
  • 深州市住房保障和城乡建设局网站做网站公司叫什么
  • 织梦网站转跳手机站注册公司代理记账费用
  • wordpress建站Pdf亚马逊aws在线观看
  • 做网站的外包公司有哪些WordPress调用json数据
  • 做网站网站怎么赚钱网站的建设及维护报告
  • 可以做效果图的网站东莞网站优化什么方法
  • 网站和软件的区别怎么做招生网站
  • 雄安免费网站建设电话如何做网站推广 求指点
  • 十大免费cad网站入口软件北京做网站建设价格
  • 建设一个公司网站要具备什么网页制作的专业
  • 东莞seo建站排名全包网站
  • 网站建设的基本步骤有哪些软件商店下载官方
  • 网站建设开发报告论文hao123上网从这里开始官方
  • 阿里云建网站费用徐州房产网
  • 网站统计分析平台做企业礼品的网站
  • 做可视化图表的网站wordpress批量导入tag
  • txt怎么做网站网站的链接结构包括
  • 适合平面设计师的网站网络营销专员的就业前景
  • 好订单网服装加工接单谷歌seo网站推广怎么做
  • seo泛站群外贸网站建设团队
  • 网站免费维护建立网站国家城乡建设部投诉网站
  • 企业网站必须备案吗wordpress导入数据库依然无法链接
  • 浅谈高校网站群的建设网站不支持m.域名
  • 和平网站建设公司做实验教学视频的网站
  • 音乐网站源码带手机版WordPress菜单调用不出
  • 昆明网站设计都需要设计什么网络推广岗位职责和任职要求
  • 国外公司网站模板网站建设公司选择意见书
  • 如何创建一个网站卖东西郑州 网站建设公司