RuntimeError: ONNX symbolic expected a constant value in the trace

RuntimeError: ONNX symbolic expected a constant value in the trace

在把pytorch训练的模型转换到onnx的时候出现了这个问题,网上查询以后发现需要把网络定义中的可变参数(结构的超参数)转换为固定数值。我理解是因为在export的时候程序不会再计算涉及到超参数的数值,只会按照固定的数值转换网络结构。
原始程序中

    def forward(self, x): 
    #报错的原程序代码如下,其中x.size()[2:]这种表示即H和W的值是通过计算得出的,
    #需要替换成确定的数值                                      
        H0, W0 = x.size()[2:]
        feat8, feat16, feat32 = self.resnet(x)
        H8, W8 = feat8.size()[2:]
        H16, W16 = feat16.size()[2:]
        H32, W32 = feat32.size()[2:]

        avg = F.avg_pool2d(feat32, feat32.size()[2:])
        avg = self.conv_avg(avg)
        avg_up = F.interpolate(avg, (H32, W32), mode='nearest')

我的修改如下,可以类似参考

    def forward(self, x):
        #H0, W0 = x.size()[2:]
        #print("H0 and W0 is:", x.size()[2:])
        #不清楚网络结构不知道参数实际是多少可以先打印出来然后再参照修改
        H0 = 1101
        W0 = 1101
        feat8, feat16, feat32 = self.resnet(x)
        #H8, W8 = feat8.size()[2:]
        #print("H8 and W8 is :", feat8.size()[2:])
        H8 = 138
        W8 = 138
        #H16, W16 = feat16.size()[2:]
        #print("H16 and W16 is :", feat16.size()[2:])
        H16 = 69
        W16 = 69
        #H32, W32 = feat32.size()[2:]
        #print("H32 and W32 is :", feat32.size()[2:])
        H32 = 35
        W32 = 35

同理其他的网络层,如

F.avg_pool2d(feat, feat.size()[2:])  #也需要使用实际值替换

全部替换完成问题解决。
欢迎交流指导: vx fjj19930707

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值