精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

量化自定義PyTorch模型入門教程

開發 前端
在以前Pytorch只有一種量化的方法,叫做“eager mode qunatization”,在量化我們自定定義模型時經常會產生奇怪的錯誤,并且很難解決。但是最近,PyTorch發布了一種稱為“fx-graph-mode-qunatization”的方方法。

在以前Pytorch只有一種量化的方法,叫做“eager mode qunatization”,在量化我們自定定義模型時經常會產生奇怪的錯誤,并且很難解決。但是最近,PyTorch發布了一種稱為“fx-graph-mode-qunatization”的方方法。在本文中我們將研究這個fx-graph-mode-qunatization”看看它能不能讓我們的量化操作更容易,更穩定。

本文將使用CIFAR 10和一個自定義AlexNet模型,我對這個模型進行了小的修改以提高效率,最后就是因為模型和數據集都很小,所以CPU也可以跑起來。

import os
 import cv2
 import time
 import torch
 import numpy as np
 import torchvision
 from PIL import Image
 import torch.nn as nn
 import matplotlib.pyplot as plt
 from torchvision import transforms
 from torchvision import datasets, models, transforms
 
 device = "cpu"
 
 print(device)
 transform = transforms.Compose([
    transforms.Resize(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
 
 batch_size = 8
 
 trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
 
 testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                        download=True, transform=transform)
 
 trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
                                          shuffle=True, num_workers=2)
 
 testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
                                          shuffle=False, num_workers=2)
 
 def print_model_size(mdl):
    torch.save(mdl.state_dict(), "tmp.pt")
    print("%.2f MB" %(os.path.getsize("tmp.pt")/1e6))
    os.remove('tmp.pt')

模型代碼如下,使用AlexNet是因為他包含了我們日常用到的基本層:

from torch.nn import init
 class mAlexNet(nn.Module):
    def __init__(self, num_classes=2):
        super().__init__()
        self.input_channel = 3
        self.num_output = num_classes
         
        self.layer1 = nn.Sequential(
            nn.Conv2d(in_channels=self.input_channel, out_channels= 16, kernel_size= 11, stride= 4),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2)
        )
        init.xavier_uniform_(self.layer1[0].weight,gain= nn.init.calculate_gain('conv2d'))
 
        self.layer2 = nn.Sequential(
            nn.Conv2d(in_channels= 16, out_channels= 20, kernel_size= 5, stride= 1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2)
        )
        init.xavier_uniform_(self.layer2[0].weight,gain= nn.init.calculate_gain('conv2d'))
 
        self.layer3 = nn.Sequential(
            nn.Conv2d(in_channels= 20, out_channels= 30, kernel_size= 3, stride= 1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2)
        )
        init.xavier_uniform_(self.layer3[0].weight,gain= nn.init.calculate_gain('conv2d'))
        
 
        self.layer4 = nn.Sequential(
            nn.Linear(30*3*3, out_features=48),
            nn.ReLU(inplace=True)
        )
        init.kaiming_normal_(self.layer4[0].weight, mode='fan_in', nnotallow='relu')
 
        self.layer5 = nn.Sequential(
            nn.Linear(in_features=48, out_features=self.num_output)
        )
        init.kaiming_normal_(self.layer5[0].weight, mode='fan_in', nnotallow='relu')
 
 
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
         
        # Squeezes or flattens the image, but keeps the batch dimension
        x = x.reshape(x.size(0), -1)
        x = self.layer4(x)
        logits= self.layer5(x)
        return logits
 
 model = mAlexNet(num_classes= 10).to(device)

現在讓我們用基本精度模型做一個快速的訓練循環來獲得基線:

import torch.optim as optim 
 
 def train_model(model):
  criterion = nn.CrossEntropyLoss()
  optimizer = optim.SGD(model.parameters(), lr=0.001, momentum = 0.9)
 
  for epoch in range(2):
    running_loss =0.0
     
    for i, data in enumerate(trainloader,0):
       
      inputs, labels = data
      inputs, labels = inputs.to(device), labels.to(device)
 
      optimizer.zero_grad()
      outputs = model(inputs)
      loss = criterion(outputs, labels)
      loss.backward()
      optimizer.step()
 
      # print statistics
      running_loss += loss.item()
      if i % 1000 == 999:
        print(f'[Ep: {epoch + 1}, Step: {i + 1:5d}] loss: {running_loss / 2000:.3f}')
        running_loss = 0.0
   
  return model
 
 model = train_model(model)
 PATH = './float_model.pth'
 torch.save(model.state_dict(), PATH)

圖片

可以看到損失是在降低的,我們這里只演示量化,所以就訓練了2輪,對于準確率我們只做對比。

我將做所有三種可能的量化:

  1. 動態量化 Dynamic qunatization:使權重為整數(訓練后)
  2. 靜態量化 Static quantization:使權值和激活值為整數(訓練后)
  3. 量化感知訓練 Quantization aware training:以整數精度對模型進行訓練

我們先從動態量化開始:

import torch
 from torch.ao.quantization import (
  get_default_qconfig_mapping,
  get_default_qat_qconfig_mapping,
  QConfigMapping,
 )
 import torch.ao.quantization.quantize_fx as quantize_fx
 import copy
 
 # Load float model
 model_fp = mAlexNet(num_classes= 10).to(device)
 model_fp.load_state_dict(torch.load("./float_model.pth", map_locatinotallow=device))
 
 # Copy model to qunatize
 model_to_quantize = copy.deepcopy(model_fp).to(device)
 model_to_quantize.eval()
 qconfig_mapping = QConfigMapping().set_global(torch.ao.quantization.default_dynamic_qconfig)
 
 # a tuple of one or more example inputs are needed to trace the model
 example_inputs = next(iter(trainloader))[0]
 
 # prepare
 model_prepared = quantize_fx.prepare_fx(model_to_quantize, qconfig_mapping, 
                  example_inputs)
 # no calibration needed when we only have dynamic/weight_only quantization
 # quantize
 model_quantized_dynamic = quantize_fx.convert_fx(model_prepared)

正如你所看到的,只需要通過模型傳遞一個示例輸入來校準量化層,所以代碼十分簡單,看看我們的模型對比:

print_model_size(model)
 print_model_size(model_quantized_dynamic)

圖片

可以看到的,減少了0.03 MB或者說模型變為了原來的75%,我們可以通過靜態模式量化使其更小:

model_to_quantize = copy.deepcopy(model_fp)
 qconfig_mapping = get_default_qconfig_mapping("qnnpack")
 model_to_quantize.eval()
 # prepare
 model_prepared = quantize_fx.prepare_fx(model_to_quantize, qconfig_mapping, example_inputs)
 # calibrate 
 with torch.no_grad():
    for i in range(20):
        batch = next(iter(trainloader))[0]
        output = model_prepared(batch.to(device))

靜態量化與動態量化是非常相似的,我們只需要傳遞更多批次的數據來更好地校準模型。

讓我們看看這些步驟是如何影響模型的:

可以看到其實程序為我們做了很多事情,所以我們才可以專注于功能而不是具體的實現,通過以上的準備,我們可以進行最后的量化了:

# quantize
 model_quantized_static = quantize_fx.convert_fx(model_prepared)

量化后的model_quantized_static看起來像這樣:

現在可以更清楚地看到,將Conv2d和Relu層融合并替換為相應的量子化對應層,并對其進行校準。可以將這些模型與最初的模型進行比較:

print_model_size(model)
 print_model_size(model_quantized_dynamic)
 print_model_size(model_quantized_static)

量子化后的模型比原來的模型小3倍,這對于大模型來說非常重要

現在讓我們看看如何在量化的情況下訓練模型,量化感知的訓練就需要在訓練的時候加入量化的操作,代碼如下:

model_to_quantize = mAlexNet(num_classes= 10).to(device)
 qconfig_mapping = get_default_qat_qconfig_mapping("qnnpack")
 model_to_quantize.train()
 # prepare
 model_prepared = quantize_fx.prepare_qat_fx(model_to_quantize, qconfig_mapping, example_inputs)
 
 # training loop 
 model_trained_prepared = train_model(model_prepared)
 
 # quantize
 model_quantized_trained = quantize_fx.convert_fx(model_trained_prepared)

讓我們比較一下到目前為止所有模型的大小。

print("Regular floating point model: " )
 print_model_size( model_fp)
 print("Weights only qunatization: ")
 print_model_size( model_quantized_dynamic)
 print("Weights/Activations only qunatization: ")
 print_model_size(model_quantized_static)
 print("Qunatization aware trained: ")
 print_model_size(model_quantized_trained)

量化感知的訓練對模型的大小沒有任何影響,但它能提高準確率嗎?

def get_accuracy(model):
  correct = 0
  total = 0
  with torch.no_grad():
      for data in testloader:
          images, labels = data
          images, labels = images, labels
          outputs = model(images)
          _, predicted = torch.max(outputs.data, 1)
          total += labels.size(0)
          correct += (predicted == labels).sum().item()
 
      return 100 * correct / total
 
 fp_model_acc = get_accuracy(model)
 dy_model_acc = get_accuracy(model_quantized_dynamic)
 static_model_acc = get_accuracy(model_quantized_static)
 q_trained_model_acc = get_accuracy(model_quantized_trained)
 
 
 print("Acc on fp_model:" ,fp_model_acc)
 print("Acc weigths only quantization:", dy_model_acc)
 print("Acc weigths/activations quantization" ,static_model_acc)
 print("Acc on qunatization awere trained model:" ,q_trained_model_acc)

為了更方便的比較,我們可視化一下:

可以看到基礎模型與量化模型具有相似的準確性,但模型尺寸大大減小,這在我們希望將其部署到服務器或低功耗設備上時至關重要。


責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2009-08-05 17:03:37

C#自定義控件

2011-12-26 10:11:08

JSP

2009-07-20 14:21:52

PowerDesign

2013-08-29 14:12:52

Storm分布式實時計算

2010-08-03 13:06:15

Flex Builde

2009-07-08 15:12:48

Java Servle

2014-05-26 15:35:55

Web組件Web Compone

2009-08-10 14:16:59

ASP.NET自定義控

2010-08-03 16:13:01

FlexBuilder

2010-06-13 09:45:35

Widget開發

2013-08-29 14:28:09

StormHadoop

2010-07-27 15:53:15

2010-05-21 12:50:45

Subversion快

2011-07-21 10:29:18

iPhone 開發

2024-11-12 15:46:37

2012-05-10 08:29:46

XcodeiOSPhoneGap

2010-08-03 14:37:30

Flex入門教程

2015-02-12 15:33:43

微信SDK

2011-09-02 10:59:10

jQuery Mobi

2010-06-18 16:56:50

UML建模語言
點贊
收藏

51CTO技術棧公眾號

在线免费观看成人短视频| 成人深夜福利| 国产91丝袜在线观看| 久久久久久中文字幕| 最新中文字幕视频| 亚洲伦理影院| 樱桃视频在线观看一区| 国产一区二区三区四区五区在线| 亚洲午夜18毛片在线看| 日韩精品诱惑一区?区三区| 日韩一区二区三区免费观看| 欧美一区二区三区精美影视| 一区二区国产欧美| 亚洲欧洲日本一区二区三区| 日韩三级视频在线看| 日本va中文字幕| 婷婷在线播放| 精品美女www爽爽爽视频| 中韩乱幕日产无线码一区| 国产精品福利影院| 久久成人资源| 精品少妇久久久| 日本电影一区二区| 亚洲国产精品电影在线观看| 亚洲性图一区二区| 精精国产xxxx视频在线播放| 亚洲精品一二三四区| 欧美二级三级| 三级网站在线看| 国产黄人亚洲片| 国产精品女人网站| 亚洲va在线观看| 极品少妇一区二区三区| 久久色在线播放| 在线播放黄色av| 欧美人体一区二区三区| 亚洲一二三四在线| 免费看污污视频| 在线观看美女网站大全免费| 99视频在线观看一区三区| 亚洲r级在线观看| 中文字幕二区三区| 日韩精品一二区| 久久青草精品视频免费观看| 91porn在线视频| 久久久久久久久久久妇女| 在线精品播放av| 人人妻人人澡人人爽| 九九视频精品全部免费播放| 色哦色哦哦色天天综合| 一二三四视频社区在线| 视频午夜在线| av一区二区不卡| 精品久久久久久乱码天堂| 成人午夜视频一区二区播放| 国产寡妇亲子伦一区二区| 亚洲最大的免费| 99久久99久久久精品棕色圆| 国产一区二区三区观看| 成人淫片在线看| 91麻豆成人精品国产| 精品一区二区免费看| 成人国内精品久久久久一区| 国产免费黄色录像| 国产成人精品免费看| 国产精品视频免费一区| 天堂成人在线| 久久色中文字幕| 亚洲欧美日韩国产yyy| 日本中文在线观看| 播五月开心婷婷综合| 国模精品娜娜一二三区| 青青操在线视频| 国产日本欧美一区二区| 中文字幕黄色大片| 国产第一页在线视频| 偷拍与自拍一区| 国产精品免费成人| 国内在线免费视频| 丰满岳妇乱一区二区三区| 国产精品无码一本二本三本色| 调教驯服丰满美艳麻麻在线视频| 国产精品suv一区| 久久最新视频| 婷婷开心激情综合| 777精品久无码人妻蜜桃| 日韩影片中文字幕| 欧美蜜桃一区二区三区 | 影音先锋一区| 日本久久久久久| 96亚洲精品久久久蜜桃| 懂色av一区二区夜夜嗨| 精品少妇v888av| av网站免费在线看| 欧美大黑bbbbbbbbb在线| 亚洲精品在线电影| 日本三级免费观看| 国产亚洲精品成人| 一区二区福利| 国产精品久久久久久久久久久不卡| 无码人妻aⅴ一区二区三区 | 免费毛片一区二区三区| 日韩中文字幕一区二区三区| 99www免费人成精品| 理论在线观看| 亚洲人成精品久久久久久| 青青视频在线播放| 深夜激情久久| 在线观看91久久久久久| 日韩少妇裸体做爰视频| 久久精品免费看| 久久久www免费人成黑人精品| 久操视频在线免费播放| 午夜视频在线观看一区| 久久人人爽av| 少妇精品久久久| 九九久久久久99精品| 亚洲天堂视频在线播放| 成人免费视频网站在线观看| 在线观看欧美亚洲| 美女100%一区| 精品国产一区二区三区四区四| 国产在线免费av| 模特精品在线| 国产一区二区三区四区五区加勒比 | 国产精品99久久久久久成人| 亚洲欧美日韩专区| 九九视频直播综合网| 成人a v视频| 99视频在线观看一区三区| 亚洲高潮无码久久| 欧美视频第一| 中文字幕av一区中文字幕天堂| 国产精品xxxx喷水欧美| 国产91富婆露脸刺激对白| 在线免费观看一区二区三区| 欧美日韩在线精品一区二区三区激情综合 | 精品中文字幕视频| 国产精品久久欧美久久一区| 中文字幕成人在线观看| 亚洲精品一卡二卡三卡四卡| 中文字幕人成乱码在线观看 | 国产原创中文av| 亚洲国产经典视频| 999精品网站| 国产成人三级| 国产精品久久国产精品99gif| 久草在线免费福利资源| 国产精品美女久久久久高潮| 热久久精品国产| 国产99久久精品一区二区300| 欧美亚洲国产视频小说| 天堂a中文在线| 狠狠躁夜夜躁人人爽天天天天97| 一区二区三区少妇| 久久都是精品| 日产精品高清视频免费| 国产精品高清乱码在线观看| 亚洲人线精品午夜| 久久久久久亚洲av无码专区| 久久精品国产99| 伊人久久大香线蕉精品| 亚洲色图综合| 欧美大片第1页| 日韩性xxxx| 欧美性高潮床叫视频| av网站免费在线看| 久久国产生活片100| 四虎4hu永久免费入口| 日韩精品成人在线观看| 久久久久久91香蕉国产| 污污网站免费在线观看| 色爱区综合激月婷婷| 亚洲精品国产精品国自| 精品一区二区三区视频 | 高清国产在线观看| 久久精品72免费观看| mm131午夜| 麻豆一区一区三区四区| 国产精品国内视频| 很黄的网站在线观看| 污污的视频免费| 大色综合视频网站在线播放| 国产日韩中文字幕| 青草视频在线免费直播| 亚洲精品国产精品乱码不99按摩| 男人天堂视频在线| 亚洲欧洲日韩综合一区二区| 深夜视频在线观看| 裸体一区二区| 艳母动漫在线观看| 美女视频亚洲色图| 国产在线视频91| 黄页在线观看免费| 国产亚洲激情在线| 性生活免费网站| 日本高清成人免费播放| 玖玖爱这里只有精品| 亚洲人成免费| 视频一区视频二区视频| 视频一区中文字幕精品| 国产成人涩涩涩视频在线观看 | 99re8这里有精品热视频8在线| 欧美一级在线亚洲天堂| 午夜小视频在线观看| 亚洲夜晚福利在线观看| 亚洲av无码片一区二区三区 | 亚洲人成网站77777在线观看| 国产又爽又黄的激情精品视频| 高清精品在线| 美女黄色丝袜一区| 国产区在线视频| 亚洲成**性毛茸茸| 国产熟女一区二区丰满| 在线精品视频一区二区| 日本少妇性生活| 亚洲另类在线一区| 亚洲高潮女人毛茸茸| 成人精品一区二区三区四区| 538任你躁在线精品免费| 国产日韩欧美一区在线 | 亚洲欧美成人| 又大又硬又爽免费视频| 四虎国产精品永久在线国在线| 久久久久久久av| 福利视频在线| 日韩免费高清视频| 在线免费看91| 在线精品视频一区二区| 国产成人无码精品久在线观看| 亚洲乱码精品一二三四区日韩在线| 亚洲不卡的av| 国产日韩欧美高清在线| 国产人妻人伦精品1国产丝袜| 国产精品夜夜嗨| 欧美又黄又嫩大片a级| 久久国内精品视频| 亚洲精品午夜在线观看| 日韩有码一区二区三区| 欧美女人性生活视频| 国产欧美日韩一级| 极品美女扒开粉嫩小泬| 亚洲黄色天堂| 野外做受又硬又粗又大视频√| 国产精品av久久久久久麻豆网| 欧洲xxxxx| 自拍欧美日韩| 女同性恋一区二区| 最新精品国产| 免费看日b视频| 香蕉一区二区| 久久国产精品久久精品国产| 久久中文字幕导航| 欧美男人的天堂| 国产欧美日韩精品一区二区三区 | 亚洲激情黄色| 免费成人午夜视频| 性xx色xx综合久久久xx| 人妻无码视频一区二区三区| 日本少妇一区二区| 亚洲一区在线不卡| 久久成人18免费观看| 婷婷激情小说网| 国产成人啪免费观看软件| 久久久久国产免费| 99免费精品在线观看| 久久久久亚洲av无码专区桃色| 国产欧美视频在线观看| 免费91在线观看| 一区二区三区在线视频免费| 日本三级视频在线| 一本色道久久综合亚洲91| 中文字幕在线观看精品| 欧美一区日本一区韩国一区| 免费国产精品视频| 亚洲偷欧美偷国内偷| 麻豆传媒视频在线| 日韩成人在线视频网站| 国产片在线观看| 久久久国产视频91| 888av在线视频| 国产成人精品综合久久久| 久久电影天堂| 国产伦精品一区二区三区四区免费 | 久久久www成人免费毛片| 欧美日韩免费网站| 伊人免费在线观看| 欧美成人a∨高清免费观看| 日韩在线无毛| 久久久av网站| 亚洲美女尤物影院| 成人免费网视频| 色橹橹欧美在线观看视频高清| 一本一本久久a久久精品综合妖精| 亚洲欧美伊人| 日本激情视频在线| 国产91精品精华液一区二区三区| 一区二区伦理片| 亚洲精品一卡二卡| 成人免费一区二区三区| 精品对白一区国产伦| 午夜视频在线看| 91av在线国产| 国产中文欧美日韩在线| 天堂精品视频| 亚洲精品日本| 亚洲在线观看网站| 国产清纯在线一区二区www| 国产精品9191| 91精品国产综合久久婷婷香蕉| 欧洲伦理片一区 二区 三区| 欧美日韩爱爱视频| 中文字幕成人| 先锋影音一区二区三区| 在线视频亚洲| av漫画在线观看| 亚洲天堂久久久久久久| 最好看的日本字幕mv视频大全| 亚洲а∨天堂久久精品9966| 哥也色在线视频| 国产美女久久精品| 欧美理论电影大全| 国产精品沙发午睡系列| 成人久久18免费网站麻豆| 国产亚洲精品久久久久久打不开| 欧美二区三区的天堂| shkd中文字幕久久在线观看| 热草久综合在线| 午夜先锋成人动漫在线| 成人网站免费观看入口| 日韩视频精品在线观看| xxx中文字幕| 亚洲天堂av老司机| 一区不卡在线观看| 日韩在线观看你懂的| 成人免费网站www网站高清| 蜜桃久久精品乱码一区二区 | 亚洲在线观看网站| 亚洲丝袜美腿综合| 国产裸体永久免费无遮挡| 中文字幕亚洲二区| 国产精品.xx视频.xxtv| 亚洲不卡1区| 久久精品中文| 国产综合精品在线| 在线免费观看日本一区| 91欧美在线视频| 国产欧美日韩精品专区| 99久久久久国产精品| av在线免费看片| 亚洲人被黑人高潮完整版| 国产欧美一级片| 欧美精品情趣视频| 91九色鹿精品国产综合久久香蕉| 国产精品自拍合集| 波多野结衣精品在线| 成人精品免费在线观看| 亚洲裸体xxxx| 日本在线视频一区二区| 亚洲一卡二卡三卡| 国产一区二区精品在线观看| 麻豆91精品91久久久| 精品久久99ma| 一级毛片久久久| 日产精品高清视频免费| 国产一区二区三区美女| 国产在线视频第一页| 亚洲精品国产拍免费91在线| 欧美一区久久久| 一区二区三区四区欧美| 国产高清无密码一区二区三区| 香蕉免费毛片视频| 国产亚洲激情在线| 日韩av综合| 99热自拍偷拍| 国产精品人人做人人爽人人添| 国产麻豆免费视频| 97视频在线观看亚洲| 欧美日韩在线播放视频| 污视频在线观看免费网站| 婷婷亚洲久悠悠色悠在线播放| 国产美女性感在线观看懂色av | 国产伦一区二区| 91av在线播放| 一区二区三区中文| av网站有哪些| 在线综合亚洲欧美在线视频| 丁香花视频在线观看| 日韩欧美精品久久| 成人激情综合网站| 国产成人麻豆免费观看| 欧美激情精品久久久久久变态| 亚洲另类春色校园小说| 精品亚洲视频在线| 欧美色另类天堂2015| 中中文字幕av在线| 日韩尤物视频| proumb性欧美在线观看| 中文字幕在线视频第一页| 97精品在线视频|