AdaptiveAvgPool2D 不支持 onnx 导出,自定义一个类代替 AdaptiveAvgPool2D

article/2025/8/28 17:04:51

AdaptiveAvgPool2D 不支持 onnx 导出,导出过程会告诉你,onnx不支持那个动态操作巴拉巴拉

我用的是 pp_liteseg 导出为 onnx 模型,都一样,paddle和Torch的 Adaptive Pool2D 都是动态的,onnx暂时都不支持,我根据下述公式,将 AdaptiveAvgPool2D 改了,可以用onnx导出了,但是需要指定一下原图的大小,和输出图的大小

h s t a r t = f l o o r ( i ∗ H i n / H o u t ) h e n d = c e i l ( ( i + 1 ) ∗ H i n / H o u t ) w s t a r t = f l o o r ( j ∗ W i n / W o u t ) w e n d = c e i l ( ( j + 1 ) ∗ W i n / W o u t ) O u t p u t ( i , j ) = ∑ I n p u t [ h s t a r t : h e n d , w s t a r t : w e n d ] ( h e n d − h s t a r t ) ∗ ( w e n d − w s t a r t ) \begin{aligned} hstart &= floor(i * H_{in} / H_{out})\\ hend &= ceil((i + 1) * H_{in} / H_{out})\\ wstart &= floor(j * W_{in} / W_{out}) \\ wend &= ceil((j + 1) * W_{in} / W_{out}) \\ Output(i ,j) &= \frac{\sum Input[hstart:hend, wstart:wend]}{(hend - hstart) * (wend - wstart)} \end{aligned} hstarthendwstartwendOutput(i,j)=floor(iHin/Hout)=ceil((i+1)Hin/Hout)=floor(jWin/Wout)=ceil((j+1)Win/Wout)=(hendhstart)(wendwstart)Input[hstart:hend,wstart:wend]
参考自:
AdaptiveAvgPool2D

class CostomAdaptiveAvgPool2D(nn.Layer):def __init__(self, output_size, input_size):super(CostomAdaptiveAvgPool2D, self).__init__()self.output_size = output_sizeself.input_size  = input_sizedef forward(self, x):H_in,  W_in  = self.input_sizeH_out, W_out = [self.output_size, self.output_size] \if isinstance(self.output_size, int) \else self.output_sizeout_i = []for i in range(H_out):out_j = []for j in range(W_out):hs = int(np.floor(i * H_in / H_out))he = int(np.ceil((i+1) * H_in / H_out))ws = int(np.floor(j * W_in / W_out))we = int(np.ceil((j+1) * W_in / W_out))# print(hs, he, ws, we)kernel_size = [he-hs, we-ws]out = F.avg_pool2d(x[:, :, hs:he, ws:we], kernel_size) out_j.append(out)out_j = paddle.concat(out_j, -1)out_i.append(out_j)out_i = paddle.concat(out_i, -2)return out_i

用 CostomAdaptiveAvgPool2D 调换 AdaptiveAvgPool2D, 并且指定原图和输出图的大小即可

在这里插入图片描述

[14,14] 就是输入图的大小,我这个pp_liteseg 输入shape是 224 × 224 224\times 224 224×224,所以上一层的shape是

[-1, 512, 14, 14]

然后一次过三个AdaptiveAvgPool2D 变成

[-1, 512,  1,   1]
[-1, 512,  2,   2]
[-1, 512,  4,   4]

然后 paddle2onnx 导出即可

paddle2onnx --model_dir . \--model_filename model.pdmodel \--params_filename model.pdiparams \--opset_version 11 \--save_file output.onnx

最后测试一下:

import paddle
import numpy as np
import paddle.nn as nn
import paddle.nn.functional as Fclass CostomAdaptiveAvgPool2D(nn.Layer):def __init__(self, output_size, input_size):super(CostomAdaptiveAvgPool2D, self).__init__()self.output_size = output_sizeself.input_size  = input_sizedef forward(self, x):H_in,  W_in  = self.input_sizeH_out, W_out = [self.output_size, self.output_size] \if isinstance(self.output_size, int) \else self.output_sizeout_i = []for i in range(H_out):out_j = []for j in range(W_out):hs = int(np.floor(i * H_in / H_out))he = int(np.ceil((i+1) * H_in / H_out))ws = int(np.floor(j * W_in / W_out))we = int(np.ceil((j+1) * W_in / W_out))# print(hs, he, ws, we)kernel_size = [he-hs, we-ws]out = F.avg_pool2d(x[:, :, hs:he, ws:we], kernel_size) out_j.append(out)out_j = paddle.concat(out_j, -1)out_i.append(out_j)out_i = paddle.concat(out_i, -2)return out_i# 输入
input_data = np.random.rand(1, 3, 128, 128)
x = paddle.to_tensor(input_data)adaptive_avg_pool = paddle.nn.AdaptiveAvgPool2D(output_size=1)
pool_out = adaptive_avg_pool(x = x)
costom_avg_pool = CostomAdaptiveAvgPool2D(output_size=(1, 1), input_size=(128, 128))
costom_pool_out = costom_avg_pool(x = x)
>>> costom_pool_out
Tensor(shape=[1, 3, 1, 1], dtype=float64, place=Place(gpu:0), stop_gradient=True,[[[[0.49809119]],[[0.49674173]],[[0.50111742]]]])>>> pool_out
Tensor(shape=[1, 3, 1, 1], dtype=float64, place=Place(gpu:0), stop_gradient=True,[[[[0.49809119]],[[0.49674173]],[[0.50111742]]]])

http://chatgpt.dhexx.cn/article/G04LmHy2.shtml

相关文章

ICLR 2023 | 3D UX-Net:超强的医学图像分割新网络

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>CV微信技术交流群 转载自:CVHub Title: 3D UX-Net: a Large Kernel Volumetric ConvNet Modernizing Hierarchical Transformer for Medical Image Segmentation …

异构信息网络 Heterogeneous information network (HIN)

异构信息网络包含多类节点和多类连接关系,由于此类网络能够灵活的对异构数据及逆行建模,越来越多的被应用于推荐系统,处理复杂的多元异构的数据。 这里给出异构信息网络 Heterogeneous information network (HIN),网络模式 Networ…

[论文阅读] (ASONAM2019) Meta-GNN: 属性异构网络中用于半监督学习的元图神经网络

论文标题:Meta-GNN:Metagraph Neural Network for Semi-supervised learning in Attributed Heterogeneous Information Networks 作者:Aravind Sankar, Xinyang Zhang, Kevin Chen-Chuan Chang 单位:Department of Computer Sc…

【推荐系统】HIN异构信息网络(Hetegeneous Information Network)

异构信息网络 (Hetegeneous Information Network 以下简称 HIN),是由 UIUC 的 Han Jiawei 和 UCLA 的 Sun Yizhou 在 2011 年的 VLDB 论文中首次提出 [1]。 简单地理解,HIN 就是一个有向图,图中的节点和边都可以有不同的类型&…

HIN 异构信息网络(Heterogeneous Information Network)

信息网络(Information Network) 信息网络可以用一个有向图G (V, E) 来表示,其中V代表 Object,E代表 Edge。并且用映射函数 ϕ : V → A 来表示每一个object v ∈ V 属于object类型集合A: ϕ(v) ∈ A,用映射函数ψ : E → R.表示每条边 e ∈ E 属于边的…

HIN应用调研总结

文章目录 1. 代码安全iDev: enhancing social coding security by cross-platform user identification between GitHub and stack overflow【A】 2. API推荐Group preference based API recommendation via heterogeneous information network【A】 3.Andorid恶意软件检测Out-…

附件上传技术分享

开发工具与关键技术:VS,MVC 作者:陈梅 撰写时间:2019年7月12日 图片代码来源于老师教程 附件上传技术,是开发MVC项目中比较常见的一种技术,准确的来说,这是一种必须要用到的技术。现在我们来看一…

上传附件——单页面

上传附件——单页面 效果 代码 index.vue <el-form-itemv-iffileListIsShowlabel上传附件><el-upload:file-listfileList:http-requestuploadFile:limit1:on-exceedexceed:on-removehandleRemoveaccept.pdf, .jpg,.bmp,.png, .doc, .xls, .pptx,.xlsxaction#classu…

Servlet 实现上传附件(支持多附件)

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者&#xff1a; 永恒の_☆ 地址&#xff1a; http://blog.csdn.net/chenghui0317/article/details/9502143 一、简单介绍 使用 Servlet…

odoo 上传附件的几种方式

目录 1、上传图片 2、上传不同附件 3、page页面添加附件看板 4、如何在一个视图里面多个page页面添加文件&#xff1f; 1、上传图片 odoo中有一个product.image模型&#xff0c;继承该模型可以实现多张图片的上传和预览。实现效果如下图所示&#xff1a; python代码&#x…

原生js--封装点击上传附件

在日常开发中&#xff0c;经常会有点击按钮上传附件的功能需求。 在我们平时的开发中&#xff0c;已经习惯把当前项目所用到的UI框架中的上传组件拿来直接使用 例如&#xff1a;antd的上传组件 以及element的上传组件&#xff0c;其实在用法上都大同小异。 这种都是直接引用组…

uniapp 上传附件

附件上传 一、uni附件上传 一、uni附件上传 1、模板部分 <!-- 附件 --><view class""><view class"content-title"><span></span>附件:</view><view class"content-main" style"border: 0;"…

vue上传附件

流程&#xff1a;点击上传到–》文件服务器upload—》调用saveFile–》调用FileLists 文件操作列表&#xff1a; <FormItem label"附件信息"><Upload :action"uploadUrl()" name"multipartFile" multiple :on-remove"handleRemov…

WangEditor添加上传附件功能 vue3

看官方文档要求 WangEditor/editor 版本 >5.1.16 下载上传附件的插件 yarn add wangeditor/plugin-upload-attachment 首先要注册到编辑器&#xff0c;如果把下面的代码写在WangEditor的组件里出现第一次使用编辑没问题&#xff0c;但是第二次编辑会报错的问题&#xff0…

csdn如何上传附件

首先登陆你的csdn博客&#xff0c;看到首页有个下载 点击下载 进去之后点击上传资源 然后就可以上传附件了 不过他会审核两天&#xff0c;不要着急&#xff0c;过两天就发布出来了

java fileupload上传附件到服务器,可携带参数(简单易用)可跨域,看这篇就够了

一个很简单实用的上传附件实例 首先主要用到的包&#xff1a; 先看服务端代码&#xff0c;我这里是用了Servlet&#xff0c;在web.xml配置 <servlet><servlet-class>com.file.FileEntryServlet</servlet-class><servlet-name>FileServlet</servlet…

公众号的附件怎么上传(如Word、Excel、Pdf等)

公众号我们都接触过&#xff0c;有企业的、有单位的、有个人的&#xff0c;公众号主要用来发布文章和消息&#xff0c;可以提供企业单位的对外沟通&#xff0c;提升企业单位的形象。 随着公众号的日益强大&#xff0c;我们也可以利用公众号对外发布招聘、重大消息公示、资料收…

网络安全实验之《VPN》实验报告

一、实验目的 (1)课上实验&#xff1a; 1.在Windows中配置&#xff08;内置或者专有&#xff09;IPSec。 2.通过抓包工具抓取建立IPSec的协商密钥过程&#xff0c;和建立之后的加密通信数据包&#xff0c;并进行分析。 (2)课后实验&#xff1a; 1.配置Cisco Packet Tracer…

课程实验三-bomb实验

实验题目&#xff1a; 程序运行在linux环境中。程序运行中有6个关卡&#xff08;6个phase&#xff09;&#xff0c;每个phase需要用户在终端上输入特定的字符或者数字才能通关&#xff0c;否则会引爆炸弹&#xff01;需要使用gdb工具反汇编出汇编代码&#xff0c;结合c语言文件…

cachelab实验

计算机系统原理实验日志 一、实验内容 1、编写一个C程序&#xff08;csim.c&#xff0c;大约200-300行&#xff09;&#xff0c;用于模拟Cache的行为。 2、已提供一个参考的cache模拟器(可执行文件csim-ref)&#xff0c;目标是自己写的 csim和参考的csim-ref行为一致&#…