PyTorch 模型 onnx 文件导出及调用详情

介绍:

PyTorch是一个基于Python的科学计算库,它有诸多优异的特性,其中一个重要的特性是它的高效特定GPU加速的张量计算(tensor computation)操作。PyTorch 1.0版本(2018年12月)已经发布,包括了对多平台、多端到端场景的支持,同时完善了跨平台支持。

我们可以使用PyTorch训练模型,然后将训练好的模型导出为ONNX(Open Neural Network Exchange)格式,使用ONNX Runtime获得较快的预测速度。此外,我们还可以利用ONNX格式将训练好的模型轻松地部署到云端、移动设备等多个平台中。

在本文中,我们将介绍如何使用PyTorch导出ONNX模型,以及如何使用ONNX Runtime加载和运行模型。此外,还会提供两个简单的PyTorch模型示例以及相关代码,以帮助读者更好地理解PyTorch到ONNX的转换和操作。

Part 1:PyTorch 模型 onnx 文件导出

首先,安装ONNX包。使用以下命令进行安装:

pip install onnx

然后,让我们创建一个简单的模型。在本文的示例中,我们将创建一个简单的线性模型,该模型可以接受1个特征,并将其乘以一个数字,然后将两个数字相加,即:

import torch.nn as nn

class MyModel(nn.Module):
  def __init__(self):
    super(MyModel, self).__init__()
    self.fcn = nn.Linear(1, 1)
    self.fcn.weight.data.fill_(2.)
    self.fcn.bias.data.fill_(1.)

  def forward(self, x):
    x = self.fcn(x)
    return x

接下来,调用以下代码行将模型计算图从PyTorch转换为ONNX格式:

import torch.onnx
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--output', type=str, help='output model name', default='model.onnx')
args = parser.parse_args()

if __name__ == '__main__':
  model = MyModel()
  model.train(False)
  input_names = ["input"]
  output_names = ["output"]
  x = torch.randn(1, 1, 1, 1, requires_grad=True)
  torch.onnx.export(model,
                    x,
                    args.output,
                    input_names=input_names,
                    output_names=output_names)

该代码在训练模式下构建了PyTorch模型,并将其转换为evaluation模式。接下来,创建一个1x1x1x1的张量x,它将作为模型输入,用torch.onnx.export将模型转换为ONNX格式。输出的onnx文件将被存储在“filename”中。在我们的例子中,我们将文件名称设置为“model.onnx”。

Part 2:ONNX模型加载、运行及调用

现在,我们已经创建并导出了我们的模型,我们可以使用ONNX Runtime来加载和运行模型,使用以下两行代码来实现这个功能:

import onnxruntime as ort

model = ort.InferenceSession("model.onnx")

第一行导入ONNX Runtime库,第二行调用ort.InferenceSession方法,加载我们的onnx模型。在我们的示例中,我们将模型名称设置为“model.onnx”。

现在,我们可以使用以下代码来运行我们的模型并对其进行评估:

import numpy as np

x = np.array([2.], dtype=np.float32)
pred = model.run(["output"], {"input": x})
print(pred)

我们在此处指定模型的输入数据x并使用model.run进行评估。"output"和"input"是分别指定模型输出和输入的名字,并且我们将x作为一个字典传递给方法。该方法返回一个包含模型输出的字典。在我们的示例中,我们的模型输出第一层返回的值为[5.],因为输入值为2,第一层返回的是4,加上偏置表示为:4 + 1 = 5。

至此,我们的ONNX模型创建并执行完毕。

Part 3:简单示例

以下是PyTorch中的两个简单示例,可以使读者更好地了解如何使用PyTorch导出ONNX模型并使用ONNX Runtime加载和运行模型。

示例1:线性模型

import torch.nn as nn
import torch.onnx
import argparse

class MyModel(nn.Module):
  def __init__(self):
    super(MyModel, self).__init__()
    self.fcn = nn.Linear(1, 1)
    self.fcn.weight.data.fill_(2.)
    self.fcn.bias.data.fill_(1.)

  def forward(self, x):
    x = self.fcn(x)
    return x

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--output', type=str, help='output model name', default='model.onnx')
  args = parser.parse_args()

  model = MyModel()
  model.train(False)
  input_names = ["input"]
  output_names = ["output"]
  x = torch.randn(1, 1, 1, 1, requires_grad=True)
  torch.onnx.export(model,
                    x,
                    args.output,
                    input_names=input_names,
                    output_names=output_names)

该示例创建一个简单线性模型,我们将该模型导出为onnx格式。

示例2:卷积神经网络

import torch.nn as nn
import torch.onnx
import argparse

class MyModel(nn.Module):
  def __init__(self):
    super(MyModel, self).__init__()
    self.layer1 = nn.Sequential(
      nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1, bias=False),
      nn.BatchNorm2d(64),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(kernel_size=2, stride=2)
    )
    self.fc = nn.Linear(64 * 14 * 14, 10)

  def forward(self, x):
    x = self.layer1(x)
    x = x.view(x.size(0), -1)
    x = self.fc(x)
    return x

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--output', type=str, help='output model name', default='model.onnx')
  args = parser.parse_args()

  model = MyModel()
  model.train(False)
  input_names = ["input"]
  output_names = ["output"]
  x = torch.randn(1, 1, 28, 28, requires_grad=True)
  torch.onnx.export(model,
                    x,
                    args.output,
                    input_names=input_names,
                    output_names=output_names)

该示例创建了一个包含卷积神经网络的模型。我们将该模型导出为onnx格式。

这两个示例代码中的onnx格式文件导出和技术细节都已经在第一部分(Part 1)中进行了解释。在这里,我们主要关注如何导出、加载和运行onnx格式的PyTorch模型,以及如何将其用于新的应用程序、算法和技术中。

总结

本文介绍了如何使用PyTorch导出ONNX模型,并使用ONNX Runtime加载和运行模型,以及提供了两个简单的PyTorch模型示例。我们希望这篇文章能够帮助读者更好地转换和操作PyTorch到ONNX格式的模型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch 模型 onnx 文件导出及调用详情 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 吴恩达《卷积神经网络》课程笔记(1)– 卷积神经网络基础

    1. Computer Vision计算机视觉是深度学习应用的主要方向之一。一般的CV问题包括以下三类: Image Classification图像分类,Object detection目标检测,Neural Style Transfer图片风格迁移 下图展示了一个Neural Style Transfer的例子:   使用传统神经网络处理计算机视觉的一个…

    2023年4月6日
    00
  • 基于卷积神经网络的匹配代价算法

    1、问题分析   立体匹配问题,即根据双目摄像头拍摄到的参考图像和目标图像,确定参考图像上每个点在目标图像上对应位置的一个过程。一般展示效果通过输出视差灰度图或伪彩色图像表示实际物体远近程度。直观上人眼可以直接评判立体匹配效果的好坏,客观上可以根据数据库提供的真实视差图计算匹配错误率,错误率越低说明模型的准确度越高。   近年来,随着深度学习的发展,卷积神经…

    2023年4月6日
    00
  • [转] 1*1卷积核作用

    妈蛋不让直接贴内容,那mark个地址吧: https://www.zhihu.com/question/56024942 第二个回答,图文并茂,直击要点。

    卷积神经网络 2023年4月6日
    00
  • 卷积核遍历图像的理解,卷积后尺寸计算

    三个关键词:1、kernelSize——卷积核大小2、padding——边缘扩充3、step——卷积核移动步长 卷积核会按步长遍历图像,把卷积核框住的像素进行卷积(对应像素相乘求和)得到1个中心像素值(9个像素用1个像素代表)。 如果遍历后图像尺寸不变,那么步长取1。 为了使卷积核的中心可以遍历边缘的像素,所以通过padding扩充原图。 【巧记】卷积就是把…

    卷积神经网络 2023年4月7日
    00
  • 卷积神经网络(CNN)的细节问题(滤波器的大小选择)

    0. 滤波器的大小选择 大部分卷积神经网络都会采用逐层递增(1⇒ 3 ⇒ 5 ⇒ 7)的方式。 每经过一次池化层,卷积层过滤器的深度都会乘以 2; 1. 权值共享:减轻过拟合 & 降低计算量 一个卷积层(Wx+b ⇒ ReLU ⇒ maxpooling)可以有多个不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像中的每一个像素都…

    卷积神经网络 2023年4月8日
    00
  • 扩张卷积(dilated convolution)

    最早出现在DeeplLab系列中,作用:可以在不改变特征图尺寸的同时增大感受野,摈弃了pool的做法(丢失信息); 我们设: kernel size = k, dilation rate = d, input size = W1, output size = W2, stride=s, padding=p; Dilation convolution(扩张卷积…

    2023年4月8日
    00
  • 莫烦pytorch学习笔记(八)——卷积神经网络(手写数字识别实现)

    莫烦视频网址 这个代码实现了预测和可视化 1 import os 2 3 # third-party library 4 import torch 5 import torch.nn as nn 6 import torch.utils.data as Data 7 import torchvision 8 import matplotlib.pyplot …

    卷积神经网络 2023年4月6日
    00
  • tensorflow 2.0 学习 (十二)卷积神经网络 (二) CIFAR10数据集与改进VGG13网络 + CoLab

    网络结构如下:    代码如下: 1 # encoding: utf-8 2 import tensorflow as tf 3 from tensorflow import keras 4 from tensorflow.keras import layers, Sequential, losses, optimizers, datasets 5 impo…

    2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部