色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于ONNX結構分析

FPGA創新中心 ? 來源:FPGA創新中心 ? 作者:FPGA創新中心 ? 2022-10-13 11:29 ? 次閱讀

Q

什么是ONNX?

ONNX(Open Neural Network Exchange)- 開放神經網絡交換格式,作為框架共用的一種模型交換格式,使用protobuf 二進制格式來序列化模型,可以提供更好的傳輸性能我們可能會在某一任務中Pytorch或者TensorFlow模型轉化為ONNX模型(ONNX模型一般用于中間部署階段),然后再拿轉化后的ONNX模型進而轉化為我們使用不同框架部署需要的類型,ONNX相當于一個翻譯的作用。

Q

為什么要用ONNX?

深度學習算法大多通過計算數據流圖來完成神經網絡的深度學習過程。一些框架(例如CNTK,Caffe2,Theano和TensorFlow)使用靜態圖形,而其他框架(例如PyTorch和Chainer)使用動態圖形。但是這些框架都提供了接口,使開發人員可以輕松構建計算圖和運行時,以優化的方式處理圖。這些圖用作中間表示(IR),捕獲開發人員源代碼的特定意圖,有助于優化和轉換在特定設備(CPUGPUFPGA等)上運行。假設一個場景:現在某組織因為主要開發用TensorFlow為基礎的框架,現在有一個深度算法,需要將其部署在移動設備上,以觀測變現。傳統地我們需要用Caffe2重新將模型寫好,然后再訓練參數;試想下這將是一個多么耗時耗力的過程。此時,ONNX便應運而生,Caffe2,PyTorch,Microsoft Cognitive Toolkit,Apache MXNet等主流框架都對ONNX有著不同程度的支持。這就便于我們的算法及模型在不同框架之間的遷移。

ONNX結構分析

ONNX將每一個網絡的每一層或者說是每一個算子當作節點Node,再由這些Node去構建一個Graph,相當于是一個網絡。最后將Graph和這個ONNX模型的其他信息結合在一起,生成一個Model,也就是最終的.onnx的模型。構建一個簡單的ONNX模型,實質上,只要構建好每一個node,然后將它們和輸入輸出超參數一起塞到Graph,最后轉成Model就可以了。

graph{
    node{
        input: "1"
        input: "2"
        output: "12"
        op_type: "Conv"
    }
    attribute{
        name: "strides"
        ints: 1
        ints: 1
    }
    attribute{
        name: "pads"
        ints: 2
        ints: 2
    }
    ...
}

我們查看ONNX網絡結構和參數(查看網址:https://netron.app/)

fe08343a-4a1a-11ed-a3b6-dac502259ad0.png

ONNX安裝、使用

安裝ONNX環境,在終端中執行以下命令,環境中需要提前準本 python3.6. 以下流程以ubunt 20.04 為例。

模型轉換流程

超分辨率是一種提高圖像、視頻分辨率的算法,廣泛用于圖像處理或視頻編輯。首先,讓我們在PyTorch中創建一個SuperResolution 模型。該模型使用描述的高效子像素卷積層將圖像的分辨率提高了一個放大因子。該模型將圖像的YCbCr的Y分量作為輸入,并以超分辨率輸出放大的Y分量。

# Some standard imports
import io
import numpy as np


from torch import nn
import torch.utils.model_zoo as model_zoo
import torch.onnx
# Super Resolution model definition in PyTorch
import torch.nn as nn
import torch.nn.init as init




class SuperResolutionNet(nn.Module):
    def __init__(self, upscale_factor, inplace=False):
        super(SuperResolutionNet, self).__init__()


        self.relu = nn.ReLU(inplace=inplace)
        self.conv1 = nn.Conv2d(1, 64, (5, 5), (1, 1), (2, 2))
        self.conv2 = nn.Conv2d(64, 64, (3, 3), (1, 1), (1, 1))
        self.conv3 = nn.Conv2d(64, 32, (3, 3), (1, 1), (1, 1))
        self.conv4 = nn.Conv2d(32, upscale_factor ** 2, (3, 3), (1, 1), (1, 1))
        self.pixel_shuffle = nn.PixelShuffle(upscale_factor)


        self._initialize_weights()


    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.relu(self.conv2(x))
        x = self.relu(self.conv3(x))
        x = self.pixel_shuffle(self.conv4(x))
        return x


    def _initialize_weights(self):
        init.orthogonal_(self.conv1.weight, init.calculate_gain('relu'))
        init.orthogonal_(self.conv2.weight, init.calculate_gain('relu'))
        init.orthogonal_(self.conv3.weight, init.calculate_gain('relu'))
        init.orthogonal_(self.conv4.weight)


# Create the super-resolution model by using the above model definition.
torch_model = SuperResolutionNet(upscale_factor=3)

1

模型下載

由于本教程以演示為目的,因此采用下載預先訓練好的權重。在導出模型之前調用torch_model.eval()或torch_model.train(False)將模型轉換為推理模式很重要。因為dropout或batchnorm等運算符在推理和訓練模式下的行為不同。

# Load pretrained model weights
model_url = 'https://s3.amazonaws.com/pytorch/test_data/export/superres_epoch100-44c6958e.pth'
batch_size = 1    # just a random number


# Initialize model with the pretrained weights
map_location = lambda storage, loc: storage
if torch.cuda.is_available():
    map_location = None
torch_model.load_state_dict(model_zoo.load_url(model_url, map_location=map_location))


# set the model to inference mode
torch_model.eval()

2

模型導出

要導出模型,我們調用該torch.onnx.export()函數。這將執行模型,記錄用于計算輸出的運算符。因為export運行模型,我們需要提供一個輸入張量x。只要它是正確的類型和大小,其中的值可以是隨機的。請注意,除非指定為動態軸,否則所有輸入維度的導出ONNX圖中的輸入大小將是固定的。在此示例中,我們使用batch_size 1的輸入導出模型,但隨后在dynamic_axes參數中將第一個維度指定為動態 torch.onnx.export() . 因此,導出的模型將接受大小為[batch_size, 1, 224, 224]的輸入,其中batch_size可以是可變的。

# Input to the model
x = torch.randn(batch_size, 1, 224, 224, requires_grad=True)
torch_out = torch_model(x)


# Export the model
torch.onnx.export(torch_model,               # model being run
                  x,                         # model input (or a tuple for multiple inputs)
                  "super_resolution.onnx",   # where to save the model (can be a file or file-like object)
                  export_params=True,        # store the trained parameter weights inside the model file
                  opset_version=10,          # the ONNX version to export the model to
                  do_constant_folding=True,  # whether to execute constant folding for optimization
                  input_names = ['input'],   # the model's input names
                  output_names = ['output'], # the model's output names
                  dynamic_axes={'input' : {0 : 'batch_size'},    # variable length axes
                                'output' : {0 : 'batch_size'}})

3

導出模型測試

在使用ONNX Runtime驗證模型的輸出之前,我們將使用ONNX的 API檢查ONNX 模型。首先,onnx.load("super_resolution.onnx")將加載保存的模型并輸出 onnx.ModelProto結構(用于捆綁 ML 模型的頂級文件/容器格式)。然后,onnx.checker.check_model(onnx_model)將驗證模型的結構并確認模型具有有效的架構。ONNX 圖的有效性通過檢查模型的版本、圖的結構以及節點及其輸入和輸出來驗證。

import onnx


onnx_model = onnx.load("super_resolution.onnx")
onnx.checker.check_model(onnx_model)


import onnxruntime


ort_session = onnxruntime.InferenceSession("super_resolution.onnx")


def to_numpy(tensor):
    return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()


# compute ONNX Runtime output prediction
ort_inputs = {ort_session.get_inputs()[0].name: to_numpy(x)}
ort_outs = ort_session.run(None, ort_inputs)


# compare ONNX Runtime and PyTorch results
np.testing.assert_allclose(to_numpy(torch_out), ort_outs[0], rtol=1e-03, atol=1e-05)


print("Exported model has been tested with ONNXRuntime, and the result looks good!")

1.加載處理前圖片,使用標準PIL python庫對其進行預處理。 2.調整圖像大小以適應模型輸入的大小 (224x224)。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 神經網絡
    +關注

    關注

    42

    文章

    4778

    瀏覽量

    101023
  • 模型
    +關注

    關注

    1

    文章

    3294

    瀏覽量

    49037
  • Graph
    +關注

    關注

    0

    文章

    36

    瀏覽量

    9127

原文標題:【技術基礎】使用ONNX使模型通用化

文章出處:【微信號:FPGA創新中心,微信公眾號:FPGA創新中心】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    將yolov5s的模型轉成.onnx模型,進行cube-ai分析時報錯的原因?

    報錯顯示張量不能大于四維的,想請教解決一下,我再此之后通過onnx-simplifier對.onnx進行簡化之后再通過cube-ai進行分析還是出現上述報錯,懇求指導,謝謝您!
    發表于 03-15 06:54

    STM CUBE AI錯誤導入onnx模型報錯的原因?

    使用cube-AI分析模型時報錯,該模型是pytorch的cnn轉化成onnx ``` Neural Network Tools for STM32AI v1.7.0 (STM.ai v8.0.0-19389) INTERNAL ERROR: list index
    發表于 05-27 07:15

    導入keras或者onnx模型到cubeai進行分析,為什么會報錯?

    請問我導入keras或者onnx模型到cubeai進行分析,為什么會報錯,而且沒有報錯內容,cubeai版本9.0.0。換成8.1.0版本后報錯內容是invalid network。該怎么入手解決。
    發表于 07-03 07:55

    深度探索ONNX模型部署 精選資料分享

    這篇文章從多個角度探索了ONNX,從ONNX的導出到ONNX和Caffe的對比,以及使用ONNX遭遇的困難以及一些解決辦法,另...
    發表于 07-20 07:41

    ONNX的相關資料分享

    ONNX簡述ONNX是一種AI神經網絡模型的通用中間文件保存方法(可以理解成AI世界的XML),各種AI框架,Inference引擎,甚至OpenCV里面的dnn onnx相關的模塊都可以解析
    發表于 11-05 06:45

    如何使用Paddle2ONNX模型轉換工具將飛槳模型轉換為ONNX模型?

    如何使用Paddle2ONNX模型轉換工具將飛槳模型轉換為ONNX模型?
    發表于 12-29 07:42

    怎么解決rknntoolkit1.7.1轉onnx報錯的問題呢?

    -> Config model --> Loading onnx model I Start importing onnx... W Detect Input node:1325
    發表于 03-13 11:46

    EIQ onnx模型轉換為tf-lite失敗怎么解決?

    我們正在嘗試將 tflite 框架與 npu 一起使用來進行機器學習。這是我們的步驟:1)用pytorch訓練一個模型2) 以onnx格式導出模型3) eiq工具的covnert模型 我們遇到了這個
    發表于 03-31 08:03

    yolov7 onnx模型在NPU上太慢了怎么解決?

    我將 yolov7tiny.pt(yolov7-tiny 模型)轉換為具有 uint8 權重的 yolov7tiny.onnx,然后在 i.MX 8M Plus NPU 上運行
    發表于 04-04 06:13

    將TensorFlow Lite模型轉換為ONNX

    由 Facebook 和 Microsoft 創建的開放格式神經網絡交換格式 ONNX,是一種用于表示機器學習模型。
    的頭像 發表于 12-08 23:19 ?1436次閱讀

    手工優化ncnn模型結構

    本文模型結構使用 netron visualizer 截圖展示,支持 onnx 和 ncnn 模型的可視化
    發表于 01-26 18:48 ?0次下載
    手工優化ncnn模型<b class='flag-5'>結構</b>

    YOLOX模型ONNX格式說明

    我記得大概是在去年七月份的時候我寫過一篇文章是介紹YOLOX+OpenVINO推理的,下載YOLOX的ONNX格式模型(github上可以下載)
    的頭像 發表于 04-13 08:35 ?5642次閱讀

    Pytorch轉化ONNX過程代碼實操

    一般來說轉ONNX只是一個手段,在之后得到ONNX模型后還需要再將它做轉換,比如轉換到TensorRT上完成部署,或者有的人多加一步,從ONNX先轉換到caffe,再從caffe到tensorRT。
    發表于 01-02 07:32 ?689次閱讀

    AI推理框架軟件ONNX Runtime正式支持龍架構

    近日,知名AI推理框架開源社區ONNX Runtime正式發布支持龍架構的版本1.17.0。
    的頭像 發表于 03-12 12:23 ?613次閱讀
    AI推理框架軟件<b class='flag-5'>ONNX</b> Runtime正式支持龍架構

    ONNX是什么?

    ONNX是什么?
    的頭像 發表于 05-15 09:49 ?1922次閱讀
    主站蜘蛛池模板: 好湿好滑好硬好爽好深视频| 99久久久无码国产精品免费人妻| 久久精品中文字幕免费| 高h原耽肉汁动漫视频| 0855福利| 亚洲国产综合另类视频| 秋霞网在线伦理免费| 快播电影网址| 国产午夜不卡| 成人精品视频| 97色伦久久视频在观看| 亚洲中文在线精品国产| 爽爽影院线观看免费| 国产69精品久久久久APP下载| 131美女爱做视频午夜剧场 | 美女被触手注入精子强制受孕漫画| 国产色精品久久人妻无码看片软件| 扒开女生尿口| 99久久久免费精品免费| 中国xxxxxz| 亚洲综合日韩在线2019| 亚洲 欧美 国产 在线 日韩| 色偷偷亚洲男人天堂| 日本高清免费看| 亚洲国产综合另类视频| 日韩黄色软件| 嫩草www视频在线观看高清| 久久才是精品亚洲国产| 国产精品99re6热在线播放| 成人小视频在线观看| PORN白嫩内射合集| 99热久久视频只有精品6| 69夫妻交友网| 69日本人XXXX护士HD| 4480YY旧里番在线播放| 嫩草伊人久久精品少妇AV网站| 久久99re7在线视频精品| 健身房被教练啪到腿软H| 红番阁免费观看| 精品久久中文字幕有码| 精品高潮呻吟99AV无码视频|