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日

相关文章

  • 卷积神经网络对图片分类-下

    接上篇:卷积神经网络对图片分类-中   9 ReLU(Rectified Linear Units) Layers 在每个卷积层之后,会马上进入一个激励层,调用一种激励函数来加入非线性因素,决绝线性不可分的问题。这里我们选择的激励函数方式叫做ReLU, 他的方程是这样f(x) = max(0, x),就是把小于零的值都归为0,好处是可以是网络训练的更快,减少…

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

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

    卷积神经网络 2023年5月15日
    00
  • TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类

    目录: 冰山图片识别背景 数据介绍 数据预处理 模型搭建 结果分析 总结   一、冰山图片识别背景 这里我们要解决的任务是来自于Kaggle上的一道赛题(https://www.kaggle.com/c/statoil-iceberg-classifier-challenge),简单介绍一下赛题的背景:在加拿大的东海岸经常会有漂流的冰山,这对航行在该海域的船…

    卷积神经网络 2023年4月7日
    00
  • 用CNN对文本处理,句子分类(简单理解卷积原理)

    首先需要理解N-gram https://zhuanlan.zhihu.com/p/32829048对于在NLP中N-gram的理解,一元,二元,三元gram 大多数 NLP 任务的输入不是图像像素,而是以矩阵表示的句子或文档。矩阵的每一行对应一个标记,通常是一个单词,但它也可以是一个字符。也就是说,每一行都是代表一个单词的向量。通常这些向量是像 word2…

    2023年4月5日
    00
  • tensorflow 2.0 学习 (十三)卷积神经网络 (三) CIFAR10数据集与修改的ResNet18网络 + CoLab

    ResNet网络结构如下: 采用模型和数据分离的代码方式,模型如下: 1 # encoding: utf-8 2 import tensorflow as tf 3 from tensorflow.keras import optimizers, datasets, Model, layers, Sequential, losses 4 from tenso…

    2023年4月6日
    00
  • pytorch之添加BN的实现

    添加批标准化(Batch Normalization)是优化深度学习模型的常用手段之一。在 PyTorch 中,添加批标准化可以通过 torch.nn.BatchNorm1d 或 torch.nn.BatchNorm2d 函数实现。接下来,将会为您详细讲解如何添加 BN,包括两个示例说明。 1.添加单层 BN 添加 BN 的步骤如下: 首先,在网络中添加 B…

    卷积神经网络 2023年5月15日
    00
  • 【深度学习】经典的卷积神经网络(GoogLeNet)

    回顾       简单的浅层神经网络,如三层的卷积神经网络等,在层数比较少的时候,有时候效果往往并没有那么好,在实验过程中发现,当尝试增加网络的层数,或者增加每一层网络的神经元个数的时候,对准确率有一定的提升,简单的说就是增加网络的深度与宽度,但这样做有两个明显的缺点: 更深更宽的网络意味着更多的参数,提高了模型的复杂度,从而大大增加过拟合的风险,尤其在训练…

    2023年4月8日
    00
  • 卷积神经网络-week1编程题1(一步步搭建卷积神经网络)

    导包 1 import numpy as np 2 import h5py 3 import matplotlib.pyplot as plt 4 5 plt.rcParams[‘figure.figsize’] = (5.0, 4.0) # set default size of plots 6 plt.rcParams[‘image.interpolat…

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