首页 > 其他分享 >pytorch转onnx中关于卷积核的问题

pytorch转onnx中关于卷积核的问题

时间:2023-12-29 16:57:37浏览次数:38  
标签:kernel 卷积 onnx self pytorch reshape output input conv2d

pytorch导出onnx过程中报如下错误:

RuntimeError: Unsupported: ONNX export of convolution for kernel of unknown shape.

我报错的部分代码如下:

def forward(self, input):
    n, c, h, w = input.size()
    s = self.scale_factor

    # pad input (left, right, top, bottom)
    input = F.pad(input, (0, 1, 0, 1), mode='replicate')

    # calculate output (height)
    kernel_h = self.kernels.repeat(c, 1).view(-1, 1, s, 1)
    output = F.conv2d(input, kernel_h, stride=1, padding=0, groups=c)
    output = output.reshape(
        n, c, s, -1, w + 1).permute(0, 1, 3, 2, 4).reshape(n, c, -1, w + 1)

    # calculate output (width)
    kernel_w = self.kernels.repeat(c, 1).view(-1, 1, 1, s)
    output = F.conv2d(output, kernel_w, stride=1, padding=0, groups=c)
    output = output.reshape(
        n, c, s, h * s, -1).permute(0, 1, 3, 4, 2).reshape(n, c, h * s, -1)

    return output

原因是使用卷积函数(torch.nn.functional.conv2d,而非卷积层torch.nn.conv2d)时不能使kernel_size为可变值,即kernel_size不能受输入变量影响。

上述代码中kernel_h和kernel_w均由self.kernels变换而来,其中repeat()受输入变量input维度c影响,导致报错。

最简单的解决方法为,在开始加一句c=int(c),使变量c对onnx来说为int常数而非torch.Tensor,从而实现kernel_h和kernel_w的size固定,最终代码如下:

def forward(self, input):
    n, c, h, w = input.size()
    s = self.scale_factor
    c = int(c)

    # pad input (left, right, top, bottom)
    input = F.pad(input, (0, 1, 0, 1), mode='replicate')

    # calculate output (height)
    kernel_h = self.kernels.repeat(c, 1).view(-1, 1, s, 1)
    output = F.conv2d(input, kernel_h, stride=1, padding=0, groups=c)
    output = output.reshape(
        n, c, s, -1, w + 1).permute(0, 1, 3, 2, 4).reshape(n, c, -1, w + 1)

    # calculate output (width)
    kernel_w = self.kernels.repeat(c, 1).view(-1, 1, 1, s)
    output = F.conv2d(output, kernel_w, stride=1, padding=0, groups=c)
    output = output.reshape(
        n, c, s, h * s, -1).permute(0, 1, 3, 4, 2).reshape(n, c, h * s, -1)

    return output

但是这样同样会导致导出onnx时报Warning:

TracerWarning: Converting a tensor to a Python integer might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
  c = int(c)

在我的应用中,c始终为定值,因此,不需要担心c值更改后无法跟踪的问题,所以无视之~

标签:kernel,卷积,onnx,self,pytorch,reshape,output,input,conv2d
From: https://www.cnblogs.com/ilk123/p/17935200.html

相关文章

  • 【Python机器学习课程设计】基于卷积神经网络的动物图像分类+数据分析
    一、选题背景在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,从而支持相关领域的决策和研究。本研究的目标是使用卷积神......
  • 【Python机器学习课程设计】基于卷积神经网络的动物图像分类
    ------------恢复内容开始------------一、选题背景在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,从而支持相关领域......
  • 人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码
    人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码目录人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码1.前言2.人体关键点检测方法(1)Top-Down(自上而下)方法(2)Bottom-Up(自下而上)方法:3.人体关键点检测数据集4.人体检测模型训练5.人体关键......
  • 笔尖笔帽检测2:Pytorch实现笔尖笔帽检测算法(含训练代码和数据集)
    笔尖笔帽检测2:Pytorch实现笔尖笔帽检测算法(含训练代码和数据集)目录笔尖笔帽检测2:Pytorch实现笔尖笔帽检测算法(含训练代码和数据集)1.前言2.笔尖笔帽检测方法(1)Top-Down(自上而下)方法(2)Bottom-Up(自下而上)方法:3.笔尖笔帽检测数据集4.手笔检测模型训练5.笔尖笔帽检测模型训练......
  • 深度学习原理与实战:12. PyTorch入门教程
    1.背景介绍深度学习是人工智能领域的一个重要分支,它通过构建多层神经网络来模拟人类大脑的工作方式,以解决各种复杂问题。PyTorch是一个流行的深度学习框架,由Facebook开发。它提供了一种动态计算图的方法,使得研究人员可以轻松地构建、测试和调试深度学习模型。在本教程中,我们将深......
  • PyTorch 中的卷积神经网络: 原理与实践
    1.背景介绍卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一种深度学习模型,主要应用于图像处理和计算机视觉领域。它的核心思想是利用卷积层来提取图像中的特征,然后通过全连接层进行分类或回归预测。在过去的几年里,CNN已经取得了巨大的成功,如图像分类、对象检测、自然语言处理等......
  • PyTorch for Natural Language Processing: A Complete Overview
    1.背景介绍自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学与人工智能的一个分支,旨在让计算机理解、解析和生成人类语言。自然语言处理的主要任务包括文本分类、情感分析、命名实体识别、语义角色标注、语义解析、机器翻译、语音识别、语音合成、问答系统、对话系统等。......
  • 测试开发 | PyTorch:深度学习的艺术之选
    深度学习框架是推动人工智能技术发展的关键工具,而PyTorch以其灵活的设计、直观的界面和强大的动态计算图而备受欢迎。本文将深入探讨PyTorch的起源、基本原理、关键特性以及在人工智能领域中的广泛应用。PyTorch的起源与发展PyTorch是由Facebook的人工智能研究团队开发的开源深度学......
  • 查看onnx模型结构-使用Netron模块
    查看onnx模型结构-使用Netron模块1安装$pipinstallnetron2可选-查看安装的路径$pipshownetron3查看onnx结构importnetron#�??�?ONNX模�??�??件�??路�?onnx_model_path=r'yolo5/yolov5n-seg_toXiaoLiu/model/yolov5n-seg.onnx'#�?�"�netron�?��?��?�??ONNX模�??net......
  • 测试开发 | 卷积神经网络(CNN):图像识别的骨干
    卷积神经网络(ConvolutionalNeuralNetwork,简称CNN)是深度学习领域中一种专门用于图像处理和识别的神经网络结构。由于其出色的性能和高效的特征提取能力,CNN在计算机视觉、医学图像分析等领域取得了巨大成功。本文将深入介绍卷积神经网络的原理、结构和应用,探讨它在图像处理中的不可......