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日

相关文章

  • 【将门创投】这12张图生动地告诉你,深度学习中的卷积网络是怎么一回事?

    现如今,卷积神经网络在人工智能领域应用的广泛性及重要性可谓是不言而喻。为了让大家对卷积的类型有一个清晰明了的认识,我快速概述了几种不同类型的二维卷积及其好处。     卷积(Convolutions)   首先,我们需要就定义卷积层的几个参数。   图1 二维卷积、内核大小为3、步幅为1   内核大小:内核大小定义了卷积的视野。二维的常见选择是3——即3×3…

    2023年4月6日
    00
  • tensorflow实现KNN识别MNIST

    下面我将为您详细讲解如何使用TensorFlow实现KNN识别MNIST数字手写图片的完整攻略。这个过程主要包括以下两个示例: 使用TensorFlow实现KNN识别MNIST 使用TensorFlow实现基于KNN的手写数字图片识别 示例一:使用TensorFlow实现KNN识别MNIST 准备工作 在开始实现之前,需要安装TensorFlow及MNIST…

    卷积神经网络 2023年5月15日
    00
  • 图像卷积尺寸计算

    输入图像大小为:W*W 卷积核大小为:F*F stride步长大小为:S*S padding 大小为:P*P   卷积之后的尺寸为N*N N=(W-F+2P)/S+1

    卷积神经网络 2023年4月8日
    00
  • 周末轻松话卷积(上)

    最近总是和卷积打交道,工作需要,每天都要碰到它好几次,不胜烦恼,因为在大学时候学信号与系统的时候就没学会,我于是心想一定要把卷积完全搞明白。正好同办公室的同学也问我什么是卷积,师姐昨天也告诉我说:“我也早就想把这个问题搞明白了!”经过一段时间的思考之后,有一些很有趣的体会和大家分享。 听说卷积这种运算式物理学家发明的,在实际中用得不亦乐乎,而数学家却一直没有…

    2023年4月8日
    00
  • CNN–卷积神经网络从R-CNN到Faster R-CNN的理解

    1. 什么是CNN 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。 我们先来看卷积神经网络各个层级结构图: 上图中CNN要做的事情是:给定一张图片,是车还是马未…

    2023年4月8日
    00
  • 直接卷积理解

    最近项目上需要实现直接卷积,就看相关的教程中实现的都是信号和电子领域的卷积,结果和计算机领域的不一致,原因大家可以自己搜一下,计算机图像领域的卷积其实不是真正的卷积。 其算法示意如下图所示: 相关代码参考于他人代码,但是目前找不到了,欢迎作者联系我补充。代码有所修改。 输入:imput[IC][IH][IW] IC = input.channels IH =…

    2023年4月6日
    00
  • opencv图像卷积操作

           代码: #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int main() { Mat src, dst, dst1; double t;…

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