Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Could not open file mnist.onnx #228

Closed
chegnyanjun opened this issue Nov 19, 2019 · 13 comments
Closed

Could not open file mnist.onnx #228

chegnyanjun opened this issue Nov 19, 2019 · 13 comments
Labels
API: C++ Export: torch.onnx https://pytorch.org/docs/stable/onnx.html Framework: PyTorch invalid This doesn't seem right ONNX

Comments

@chegnyanjun
Copy link

Hi, I am trying to serialize the mnist.onnx to get engine file through c++ code,but it indicated such problem,so i was very weried and i want to know the reason.the whole problem is such:
Could not open file mnist.onnx.
Could not open file mnist.onnx.
[TRT] Network must have at least one output.
My environment is:ubuntu14.04+cuda10.1+gtx1060+qt5.5+onnx1.6+pytorch1.2+tensorrt6.0.1.5.
I hope for your reply.tkx.

@rmccorm4
Copy link
Collaborator

Hi @chegnyanjun,

Can you provide more information?

Does the mnist.onnx file exist at the specified path?

Any errors after that are likely caused from the mnist.onnx file not being read/parsed.

@rmccorm4 rmccorm4 added API: C++ invalid This doesn't seem right ONNX labels Nov 20, 2019
@chegnyanjun
Copy link
Author

chegnyanjun commented Nov 20, 2019

Hi,@rmccorm4 ,thanks for you reply.
I have solved this problem by use official instance.,Before that i use some old api ,so it can not open mnist.onnx.But after that,when i was try to convrt unet++.onnx model to engine,it indicated that:

ERROR: Network must have at least one output,
    f.write(engine.serialize()) # save engine by serialize engine
AttributeError: 'NoneType' object has no attribute 'serialize'.

As some issues talks,maybe there has some unsupported layer that the tensorrt not supports.But actually, your know the unet++ model(I train it by pytorch) is a very simple model , and i set the nn.Upsample() mode in nearest (actually i need bilinear mode, but i thought the tensorrt6.0.1.5 supports the nearest mode ,so i try it),so for whole model,the tensorrt6.0.1.5 should supports all layers.

I use torch.onnx.export() to covnert .pth model to .onnx model, after that,i use tensorrt to parse the .onnx model to get engine, but it parses the .onnx model failed as some issues mentioned (i use c++ api and python api ,both failed,above is python failed result,and the c++ api sent:

ERROR: onnx2trt_utils.hpp:347 In function convert_axis:
[8] Assertion failed: axis >= 0 && axis < nbDims).

So i was a little weird, Didn't tensorrt6.0.1.5 says it supports the upsample in nearest mode?

Besides,I thinks the parse indicate info is very little in tensorrt inner api,i hope it richer to help people quicker to find the problem. Also, i hope tensorrt can release more pytorch model apply demo,such as sementic segmentation, gan and so on. It is such little so i was spend so much time to get them.

At last, i think there has some bug in tensorrt c++ api official doc should be solved and both c++ api or python api doc should more detailed.

Hope for your reply. Greatly appreciated for your patience to read this issues. tkx.

@rmccorm4
Copy link
Collaborator

Hi @chegnyanjun,

If you share both of your:

  • PyTorch code
  • ONNX model

I can take a look at this when I get a chance tomorrow

@rmccorm4 rmccorm4 added Export: torch.onnx https://pytorch.org/docs/stable/onnx.html Framework: PyTorch labels Nov 20, 2019
@chegnyanjun
Copy link
Author

chegnyanjun commented Nov 20, 2019

@rmccorm4,thanks very much.There is my pytorch model and onnx model.
pytorch code, it is a simple unet++ model::

import torch.nn as nn
import torch
import numpy as np
from skimage.io import imsave

class ConvBlock(nn.Module):
    """
    Convolution Block
    """
    def __init__(self, in_ch, out_ch, kernel_size=3, stride=1, padding=1, dilation=1):
        super(ConvBlock, self).__init__()
        block = [nn.Conv2d(in_channels=in_ch, out_channels=out_ch, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, bias=True)]
        block += [nn.BatchNorm2d(out_channels=out_ch)]
        block += [nn.ReLU(inplace=True)]
        self.block = nn.Sequential(*block)

    def forward(self, x):
        return self.block(x)

class UpConvBlock(nn.Module):
    """
    Upsampling Convolution Block
    """
    def __init__(self, in_ch, out_ch, kernel_size=3, stride=1, padding=1, dilation=1):
        super(UpConvBlock, self).__init__()
        block = [nn.Upsample(scale_factor=2)]
        block += [nn.Conv2d(in_channels=in_ch, out_channels=out_ch, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, bias=True)]
        block += [nn.BatchNorm2d(out_channels=out_ch)]
        block += [nn.ReLU(inplace=True)]
        self.block = nn.Sequential(*block)

    def forward(self, x):
        return self.block(x)

class ResBlock(nn.Module):
    """
    Residual Block
    """
    def __init__(self, in_ch, out_ch, stride=1):
        super(ResBlock, self).__init__()
        self.relu = nn.ReLU(inplace=True)
        self.conv1 = nn.Conv2d(in_channels=in_ch, out_channels=out_ch, kernel_size=3, stride=stride, padding=1, dilation=1, bias=True)
        self.bn1 = nn.BatchNorm2d(out_ch)
        self.conv2 = nn.Conv2d(in_channels=out_ch, out_channels=out_ch, kernel_size=3, stride=stride, padding=1, dilation=1, bias=True)
        self.bn2 = nn.BatchNorm2d(out_ch)

    def forward(self, x):
        identity = self.conv1(x)
        out = self.bn1(identity)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)

        out += identity
        out = self.relu(out)
        return out

class NestedUNet(nn.Module):
    """
    Implementation of nested Unet (Unet++)
    """
    
    def __init__(self, in_ch=3, out_ch=1, n=32):
        super(NestedUNet, self).__init__()

        filters = [n, n * 2, n * 4, n * 8, n * 16]#32, 64, 128, 256, 512

        self.conv0_0 = ResBlock(in_ch, filters[0])
        self.conv1_0 = ResBlock(filters[0], filters[1])
        self.conv2_0 = ResBlock(filters[1], filters[2])
        self.conv3_0 = ResBlock(filters[2], filters[3])
        self.conv4_0 = ResBlock(filters[3], filters[4])

        self.conv0_1 = ResBlock(filters[0] + filters[1], filters[0])
        self.conv1_1 = ResBlock(filters[1] + filters[2], filters[1])
        self.conv2_1 = ResBlock(filters[2] + filters[3], filters[2])
        self.conv3_1 = ResBlock(filters[3] + filters[4], filters[3])

        self.conv0_2 = ResBlock(filters[0] * 2 + filters[1], filters[0])
        self.conv1_2 = ResBlock(filters[1] * 2 + filters[2], filters[1])
        self.conv2_2 = ResBlock(filters[2] * 2 + filters[3], filters[2])

        self.conv0_3 = ResBlock(filters[0] * 3 + filters[1], filters[0])
        self.conv1_3 = ResBlock(filters[1] * 3 + filters[2], filters[1])

        self.conv0_4 = ResBlock(filters[0] * 4 + filters[1], filters[0])

        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        # self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)# original code
        self.up = nn.Upsample(scale_factor=2, mode='nearest')

        self.final1 = nn.Conv2d(filters[0], out_ch, kernel_size=1)
        self.final2 = nn.Conv2d(filters[0], out_ch, kernel_size=1)
        self.final3 = nn.Conv2d(filters[0], out_ch, kernel_size=1)
        self.final4 = nn.Conv2d(filters[0], out_ch, kernel_size=1)
        self.final5 = nn.Conv2d(4, out_ch, kernel_size=1)

    def forward(self, x):

        x0_0 = self.conv0_0(x)

        x1_0 = self.conv1_0(self.pool(x0_0))
        x0_1 = self.conv0_1(torch.cat((x0_0, self.up(x1_0)), 1))

        x2_0 = self.conv2_0(self.pool(x1_0))
        x1_1 = self.conv1_1(torch.cat((x1_0, self.up(x2_0)), 1))
        x0_2 = self.conv0_2(torch.cat((x0_0, x0_1, self.up(x1_1)), 1))

        x3_0 = self.conv3_0(self.pool(x2_0))
        x2_1 = self.conv2_1(torch.cat((x2_0, self.up(x3_0)), 1))
        x1_2 = self.conv1_2(torch.cat((x1_0, x1_1, self.up(x2_1)), 1))
        x0_3 = self.conv0_3(torch.cat((x0_0, x0_1, x0_2, self.up(x1_2)), 1))

        x4_0 = self.conv4_0(self.pool(x3_0))
        x3_1 = self.conv3_1(torch.cat((x3_0, self.up(x4_0)), 1))
        x2_2 = self.conv2_2(torch.cat((x2_0, x2_1, self.up(x3_1)), 1))
        x1_3 = self.conv1_3(torch.cat((x1_0, x1_1, x1_2, self.up(x2_2)), 1))
        x0_4 = self.conv0_4(torch.cat((x0_0, x0_1, x0_2, x0_3, self.up(x1_3)), 1))

        output1 = self.final1(x0_1) # 4*1*256*256
        output2 = self.final2(x0_2) # 4*1*256*256
        output3 = self.final3(x0_3) # 4*1*256*256
        output4 = self.final4(x0_4) # 4*1*256*256
        output5 = self.final5(torch.cat((output1, output2, output3, output4), 1)) # 4*1*256*256

        # return [output1, output2, output3, output4, output5] # return a list,it is not good for torch.git.trace,should replace it with a tuple
        return (output1, output2, output3, output4, output5) # return a tuple

if __name__ == '__main__':
    a = torch.ones((16, 6, 256, 256))
    Unet = NestedUNet(in_ch=6, out_ch=1)
    output = Unet(a)

my onnx model, I located it in the link:
https://pan.baidu.com/s/1iB278LbssAbyQE770xlNiw,
extracted code:piqi
Thank you very much ,hope for your reply.

@rmccorm4
Copy link
Collaborator

rmccorm4 commented Nov 22, 2019

Hi @chegnyanjun,

Sorry for the delay, I've been very busy this week. I'll try to take a look next week.

@chegnyanjun
Copy link
Author

@rmccorm4,Thanks for your enthusiastic,I can understand your feel and it doesn't matter.Wait for your reply,tkx.

@rmccorm4
Copy link
Collaborator

rmccorm4 commented Nov 26, 2019

Hi @chegnyanjun,

  1. I need a login to get that ONNX model you linked, can you update the permissions?
  2. Can you share the full torch.onnx.export(...) command that you used to export the model? I'm getting a different error than you report.

@chegnyanjun
Copy link
Author

chegnyanjun commented Nov 26, 2019

Hi @rmccorm4,it's no problem.The log is:

graph(%input_merge : Float(1, 6, 256, 256),
      %conv0_0.conv1.weight : Float(32, 6, 3, 3),
      %conv0_0.conv1.bias : Float(32),
      %conv0_0.bn1.weight : Float(32),
      %conv0_0.bn1.bias : Float(32),
      %conv0_0.bn1.running_mean : Float(32),
      %conv0_0.bn1.running_var : Float(32),
      %conv0_0.bn1.num_batches_tracked : Long(),
      %conv0_0.conv2.weight : Float(32, 32, 3, 3),
      %conv0_0.conv2.bias : Float(32),
      %conv0_0.bn2.weight : Float(32),
      %conv0_0.bn2.bias : Float(32),
      %conv0_0.bn2.running_mean : Float(32),
      %conv0_0.bn2.running_var : Float(32),
      %conv0_0.bn2.num_batches_tracked : Long(),
      %conv1_0.conv1.weight : Float(64, 32, 3, 3),
      %conv1_0.conv1.bias : Float(64),
      %conv1_0.bn1.weight : Float(64),
      %conv1_0.bn1.bias : Float(64),
      %conv1_0.bn1.running_mean : Float(64),
      %conv1_0.bn1.running_var : Float(64),
      %conv1_0.bn1.num_batches_tracked : Long(),
      %conv1_0.conv2.weight : Float(64, 64, 3, 3),
      %conv1_0.conv2.bias : Float(64),
      %conv1_0.bn2.weight : Float(64),
      %conv1_0.bn2.bias : Float(64),
      %conv1_0.bn2.running_mean : Float(64),
      %conv1_0.bn2.running_var : Float(64),
      %conv1_0.bn2.num_batches_tracked : Long(),
      %conv2_0.conv1.weight : Float(128, 64, 3, 3),
      %conv2_0.conv1.bias : Float(128),
      %conv2_0.bn1.weight : Float(128),
      %conv2_0.bn1.bias : Float(128),
      %conv2_0.bn1.running_mean : Float(128),
      %conv2_0.bn1.running_var : Float(128),
      %conv2_0.bn1.num_batches_tracked : Long(),
      %conv2_0.conv2.weight : Float(128, 128, 3, 3),
      %conv2_0.conv2.bias : Float(128),
      %conv2_0.bn2.weight : Float(128),
      %conv2_0.bn2.bias : Float(128),
      %conv2_0.bn2.running_mean : Float(128),
      %conv2_0.bn2.running_var : Float(128),
      %conv2_0.bn2.num_batches_tracked : Long(),
      %conv3_0.conv1.weight : Float(256, 128, 3, 3),
      %conv3_0.conv1.bias : Float(256),
      %conv3_0.bn1.weight : Float(256),
      %conv3_0.bn1.bias : Float(256),
      %conv3_0.bn1.running_mean : Float(256),
      %conv3_0.bn1.running_var : Float(256),
      %conv3_0.bn1.num_batches_tracked : Long(),
      %conv3_0.conv2.weight : Float(256, 256, 3, 3),
      %conv3_0.conv2.bias : Float(256),
      %conv3_0.bn2.weight : Float(256),
      %conv3_0.bn2.bias : Float(256),
      %conv3_0.bn2.running_mean : Float(256),
      %conv3_0.bn2.running_var : Float(256),
      %conv3_0.bn2.num_batches_tracked : Long(),
      %conv4_0.conv1.weight : Float(512, 256, 3, 3),
      %conv4_0.conv1.bias : Float(512),
      %conv4_0.bn1.weight : Float(512),
      %conv4_0.bn1.bias : Float(512),
      %conv4_0.bn1.running_mean : Float(512),
      %conv4_0.bn1.running_var : Float(512),
      %conv4_0.bn1.num_batches_tracked : Long(),
      %conv4_0.conv2.weight : Float(512, 512, 3, 3),
      %conv4_0.conv2.bias : Float(512),
      %conv4_0.bn2.weight : Float(512),
      %conv4_0.bn2.bias : Float(512),
      %conv4_0.bn2.running_mean : Float(512),
      %conv4_0.bn2.running_var : Float(512),
      %conv4_0.bn2.num_batches_tracked : Long(),
      %conv0_1.conv1.weight : Float(32, 96, 3, 3),
      %conv0_1.conv1.bias : Float(32),
      %conv0_1.bn1.weight : Float(32),
      %conv0_1.bn1.bias : Float(32),
      %conv0_1.bn1.running_mean : Float(32),
      %conv0_1.bn1.running_var : Float(32),
      %conv0_1.bn1.num_batches_tracked : Long(),
      %conv0_1.conv2.weight : Float(32, 32, 3, 3),
      %conv0_1.conv2.bias : Float(32),
      %conv0_1.bn2.weight : Float(32),
      %conv0_1.bn2.bias : Float(32),
      %conv0_1.bn2.running_mean : Float(32),
      %conv0_1.bn2.running_var : Float(32),
      %conv0_1.bn2.num_batches_tracked : Long(),
      %conv1_1.conv1.weight : Float(64, 192, 3, 3),
      %conv1_1.conv1.bias : Float(64),
      %conv1_1.bn1.weight : Float(64),
      %conv1_1.bn1.bias : Float(64),
      %conv1_1.bn1.running_mean : Float(64),
      %conv1_1.bn1.running_var : Float(64),
      %conv1_1.bn1.num_batches_tracked : Long(),
      %conv1_1.conv2.weight : Float(64, 64, 3, 3),
      %conv1_1.conv2.bias : Float(64),
      %conv1_1.bn2.weight : Float(64),
      %conv1_1.bn2.bias : Float(64),
      %conv1_1.bn2.running_mean : Float(64),
      %conv1_1.bn2.running_var : Float(64),
      %conv1_1.bn2.num_batches_tracked : Long(),
      %conv2_1.conv1.weight : Float(128, 384, 3, 3),
      %conv2_1.conv1.bias : Float(128),
      %conv2_1.bn1.weight : Float(128),
      %conv2_1.bn1.bias : Float(128),
      %conv2_1.bn1.running_mean : Float(128),
      %conv2_1.bn1.running_var : Float(128),
      %conv2_1.bn1.num_batches_tracked : Long(),
      %conv2_1.conv2.weight : Float(128, 128, 3, 3),
      %conv2_1.conv2.bias : Float(128),
      %conv2_1.bn2.weight : Float(128),
      %conv2_1.bn2.bias : Float(128),
      %conv2_1.bn2.running_mean : Float(128),
      %conv2_1.bn2.running_var : Float(128),
      %conv2_1.bn2.num_batches_tracked : Long(),
      %conv3_1.conv1.weight : Float(256, 768, 3, 3),
      %conv3_1.conv1.bias : Float(256),
      %conv3_1.bn1.weight : Float(256),
      %conv3_1.bn1.bias : Float(256),
      %conv3_1.bn1.running_mean : Float(256),
      %conv3_1.bn1.running_var : Float(256),
      %conv3_1.bn1.num_batches_tracked : Long(),
      %conv3_1.conv2.weight : Float(256, 256, 3, 3),
      %conv3_1.conv2.bias : Float(256),
      %conv3_1.bn2.weight : Float(256),
      %conv3_1.bn2.bias : Float(256),
      %conv3_1.bn2.running_mean : Float(256),
      %conv3_1.bn2.running_var : Float(256),
      %conv3_1.bn2.num_batches_tracked : Long(),
      %conv0_2.conv1.weight : Float(32, 128, 3, 3),
      %conv0_2.conv1.bias : Float(32),
      %conv0_2.bn1.weight : Float(32),
      %conv0_2.bn1.bias : Float(32),
      %conv0_2.bn1.running_mean : Float(32),
      %conv0_2.bn1.running_var : Float(32),
      %conv0_2.bn1.num_batches_tracked : Long(),
      %conv0_2.conv2.weight : Float(32, 32, 3, 3),
      %conv0_2.conv2.bias : Float(32),
      %conv0_2.bn2.weight : Float(32),
      %conv0_2.bn2.bias : Float(32),
      %conv0_2.bn2.running_mean : Float(32),
      %conv0_2.bn2.running_var : Float(32),
      %conv0_2.bn2.num_batches_tracked : Long(),
      %conv1_2.conv1.weight : Float(64, 256, 3, 3),
      %conv1_2.conv1.bias : Float(64),
      %conv1_2.bn1.weight : Float(64),
      %conv1_2.bn1.bias : Float(64),
      %conv1_2.bn1.running_mean : Float(64),
      %conv1_2.bn1.running_var : Float(64),
      %conv1_2.bn1.num_batches_tracked : Long(),
      %conv1_2.conv2.weight : Float(64, 64, 3, 3),
      %conv1_2.conv2.bias : Float(64),
      %conv1_2.bn2.weight : Float(64),
      %conv1_2.bn2.bias : Float(64),
      %conv1_2.bn2.running_mean : Float(64),
      %conv1_2.bn2.running_var : Float(64),
      %conv1_2.bn2.num_batches_tracked : Long(),
      %conv2_2.conv1.weight : Float(128, 512, 3, 3),
      %conv2_2.conv1.bias : Float(128),
      %conv2_2.bn1.weight : Float(128),
      %conv2_2.bn1.bias : Float(128),
      %conv2_2.bn1.running_mean : Float(128),
      %conv2_2.bn1.running_var : Float(128),
      %conv2_2.bn1.num_batches_tracked : Long(),
      %conv2_2.conv2.weight : Float(128, 128, 3, 3),
      %conv2_2.conv2.bias : Float(128),
      %conv2_2.bn2.weight : Float(128),
      %conv2_2.bn2.bias : Float(128),
      %conv2_2.bn2.running_mean : Float(128),
      %conv2_2.bn2.running_var : Float(128),
      %conv2_2.bn2.num_batches_tracked : Long(),
      %conv0_3.conv1.weight : Float(32, 160, 3, 3),
      %conv0_3.conv1.bias : Float(32),
      %conv0_3.bn1.weight : Float(32),
      %conv0_3.bn1.bias : Float(32),
      %conv0_3.bn1.running_mean : Float(32),
      %conv0_3.bn1.running_var : Float(32),
      %conv0_3.bn1.num_batches_tracked : Long(),
      %conv0_3.conv2.weight : Float(32, 32, 3, 3),
      %conv0_3.conv2.bias : Float(32),
      %conv0_3.bn2.weight : Float(32),
      %conv0_3.bn2.bias : Float(32),
      %conv0_3.bn2.running_mean : Float(32),
      %conv0_3.bn2.running_var : Float(32),
      %conv0_3.bn2.num_batches_tracked : Long(),
      %conv1_3.conv1.weight : Float(64, 320, 3, 3),
      %conv1_3.conv1.bias : Float(64),
      %conv1_3.bn1.weight : Float(64),
      %conv1_3.bn1.bias : Float(64),
      %conv1_3.bn1.running_mean : Float(64),
      %conv1_3.bn1.running_var : Float(64),
      %conv1_3.bn1.num_batches_tracked : Long(),
      %conv1_3.conv2.weight : Float(64, 64, 3, 3),
      %conv1_3.conv2.bias : Float(64),
      %conv1_3.bn2.weight : Float(64),
      %conv1_3.bn2.bias : Float(64),
      %conv1_3.bn2.running_mean : Float(64),
      %conv1_3.bn2.running_var : Float(64),
      %conv1_3.bn2.num_batches_tracked : Long(),
      %conv0_4.conv1.weight : Float(32, 192, 3, 3),
      %conv0_4.conv1.bias : Float(32),
      %conv0_4.bn1.weight : Float(32),
      %conv0_4.bn1.bias : Float(32),
      %conv0_4.bn1.running_mean : Float(32),
      %conv0_4.bn1.running_var : Float(32),
      %conv0_4.bn1.num_batches_tracked : Long(),
      %conv0_4.conv2.weight : Float(32, 32, 3, 3),
      %conv0_4.conv2.bias : Float(32),
      %conv0_4.bn2.weight : Float(32),
      %conv0_4.bn2.bias : Float(32),
      %conv0_4.bn2.running_mean : Float(32),
      %conv0_4.bn2.running_var : Float(32),
      %conv0_4.bn2.num_batches_tracked : Long(),
      %up1_0.weight : Float(64, 64, 2, 2),
      %up1_0.bias : Float(64),
      %up2_0.weight : Float(128, 128, 2, 2),
      %up2_0.bias : Float(128),
      %up3_0.weight : Float(256, 256, 2, 2),
      %up3_0.bias : Float(256),
      %up4_0.weight : Float(512, 512, 2, 2),
      %up4_0.bias : Float(512),
      %final1.weight : Float(1, 32, 1, 1),
      %final1.bias : Float(1),
      %final2.weight : Float(1, 32, 1, 1),
      %final2.bias : Float(1),
      %final3.weight : Float(1, 32, 1, 1),
      %final3.bias : Float(1),
      %final4.weight : Float(1, 32, 1, 1),
      %final4.bias : Float(1),
      %final5.weight : Float(1, 4, 1, 1),
      %final5.bias : Float(1)):
  %229 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%input_merge, %conv0_0.conv1.weight, %conv0_0.conv1.bias), scope: NestedUNet/ResBlock[conv0_0]/Conv2d[conv1]
  %230 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%229, %conv0_0.bn1.weight, %conv0_0.bn1.bias, %conv0_0.bn1.running_mean, %conv0_0.bn1.running_var), scope: NestedUNet/ResBlock[conv0_0]/BatchNorm2d[bn1] 
  %231 : Float(1, 32, 256, 256) = onnx::Relu(%230), scope: NestedUNet/ResBlock[conv0_0]/ReLU[relu] 
  %232 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%231, %conv0_0.conv2.weight, %conv0_0.conv2.bias), scope: NestedUNet/ResBlock[conv0_0]/Conv2d[conv2] 
  %233 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%232, %conv0_0.bn2.weight, %conv0_0.bn2.bias, %conv0_0.bn2.running_mean, %conv0_0.bn2.running_var), scope: NestedUNet/ResBlock[conv0_0]/BatchNorm2d[bn2] 
  %234 : Float(1, 32, 256, 256) = onnx::Add(%233, %229), scope: NestedUNet/ResBlock[conv0_0]
  %235 : Float(1, 32, 256, 256) = onnx::Relu(%234), scope: NestedUNet/ResBlock[conv0_0]/ReLU[relu]
  %236 : Float(1, 32, 128, 128) = onnx::MaxPool[kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%235), scope: NestedUNet/MaxPool2d[pool] 
  %237 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%236, %conv1_0.conv1.weight, %conv1_0.conv1.bias), scope: NestedUNet/ResBlock[conv1_0]/Conv2d[conv1] 
  %238 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%237, %conv1_0.bn1.weight, %conv1_0.bn1.bias, %conv1_0.bn1.running_mean, %conv1_0.bn1.running_var), scope: NestedUNet/ResBlock[conv1_0]/BatchNorm2d[bn1] orch/nn/functional.py:1656:0
  %239 : Float(1, 64, 128, 128) = onnx::Relu(%238), scope: NestedUNet/ResBlock[conv1_0]/ReLU[relu]
  %240 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%239, %conv1_0.conv2.weight, %conv1_0.conv2.bias), scope: NestedUNet/ResBlock[conv1_0]/Conv2d[conv2] 
  %241 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%240, %conv1_0.bn2.weight, %conv1_0.bn2.bias, %conv1_0.bn2.running_mean, %conv1_0.bn2.running_var), scope: NestedUNet/ResBlock[conv1_0]/BatchNorm2d[bn2]
  %242 : Float(1, 64, 128, 128) = onnx::Add(%241, %237), scope: NestedUNet/ResBlock[conv1_0] 
  %243 : Float(1, 64, 128, 128) = onnx::Relu(%242), scope: NestedUNet/ResBlock[conv1_0]/ReLU[relu]
  %244 : Float(1, 64, 256, 256) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%243, %up1_0.weight, %up1_0.bias), scope: NestedUNet/ConvTranspose2d[up1_0]
  %245 : Float(1, 96, 256, 256) = onnx::Concat[axis=1](%235, %244), scope: NestedUNet 
  %246 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%245, %conv0_1.conv1.weight, %conv0_1.conv1.bias), scope: NestedUNet/ResBlock[conv0_1]/Conv2d[conv1] 
  %247 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%246, %conv0_1.bn1.weight, %conv0_1.bn1.bias, %conv0_1.bn1.running_mean, %conv0_1.bn1.running_var), scope: NestedUNet/ResBlock[conv0_1]/BatchNorm2d[bn1] 
  %248 : Float(1, 32, 256, 256) = onnx::Relu(%247), scope: NestedUNet/ResBlock[conv0_1]/ReLU[relu] 
  %249 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%248, %conv0_1.conv2.weight, %conv0_1.conv2.bias), scope: NestedUNet/ResBlock[conv0_1]/Conv2d[conv2] 
  %250 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%249, %conv0_1.bn2.weight, %conv0_1.bn2.bias, %conv0_1.bn2.running_mean, %conv0_1.bn2.running_var), scope: NestedUNet/ResBlock[conv0_1]/BatchNorm2d[bn2]
  %251 : Float(1, 32, 256, 256) = onnx::Add(%250, %246), scope: NestedUNet/ResBlock[conv0_1] 
  %252 : Float(1, 32, 256, 256) = onnx::Relu(%251), scope: NestedUNet/ResBlock[conv0_1]/ReLU[relu]
  %253 : Float(1, 64, 64, 64) = onnx::MaxPool[kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%243), scope: NestedUNet/MaxPool2d[pool] 
  %254 : Float(1, 128, 64, 64) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%253, %conv2_0.conv1.weight, %conv2_0.conv1.bias), scope: NestedUNet/ResBlock[conv2_0]/Conv2d[conv1] 
  %255 : Float(1, 128, 64, 64) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%254, %conv2_0.bn1.weight, %conv2_0.bn1.bias, %conv2_0.bn1.running_mean, %conv2_0.bn1.running_var), scope: NestedUNet/ResBlock[conv2_0]/BatchNorm2d[bn1] 
  %256 : Float(1, 128, 64, 64) = onnx::Relu(%255), scope: NestedUNet/ResBlock[conv2_0]/ReLU[relu] 
  %257 : Float(1, 128, 64, 64) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%256, %conv2_0.conv2.weight, %conv2_0.conv2.bias), scope: NestedUNet/ResBlock[conv2_0]/Conv2d[conv2] 
  %258 : Float(1, 128, 64, 64) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%257, %conv2_0.bn2.weight, %conv2_0.bn2.bias, %conv2_0.bn2.running_mean, %conv2_0.bn2.running_var), scope: NestedUNet/ResBlock[conv2_0]/BatchNorm2d[bn2] 
  %259 : Float(1, 128, 64, 64) = onnx::Add(%258, %254), scope: NestedUNet/ResBlock[conv2_0] 
  %260 : Float(1, 128, 64, 64) = onnx::Relu(%259), scope: NestedUNet/ResBlock[conv2_0]/ReLU[relu] 
  %261 : Float(1, 128, 128, 128) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%260, %up2_0.weight, %up2_0.bias), scope: NestedUNet/ConvTranspose2d[up2_0] 
  %262 : Float(1, 192, 128, 128) = onnx::Concat[axis=1](%243, %261), scope: NestedUNet 
  %263 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%262, %conv1_1.conv1.weight, %conv1_1.conv1.bias), scope: NestedUNet/ResBlock[conv1_1]/Conv2d[conv1] 
  %264 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%263, %conv1_1.bn1.weight, %conv1_1.bn1.bias, %conv1_1.bn1.running_mean, %conv1_1.bn1.running_var), scope: NestedUNet/ResBlock[conv1_1]/BatchNorm2d[bn1] 
  %265 : Float(1, 64, 128, 128) = onnx::Relu(%264), scope: NestedUNet/ResBlock[conv1_1]/ReLU[relu] 
  %266 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%265, %conv1_1.conv2.weight, %conv1_1.conv2.bias), scope: NestedUNet/ResBlock[conv1_1]/Conv2d[conv2] 
  %267 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%266, %conv1_1.bn2.weight, %conv1_1.bn2.bias, %conv1_1.bn2.running_mean, %conv1_1.bn2.running_var), scope: NestedUNet/ResBlock[conv1_1]/BatchNorm2d[bn2] 
  %268 : Float(1, 64, 128, 128) = onnx::Add(%267, %263), scope: NestedUNet/ResBlock[conv1_1] 
  %269 : Float(1, 64, 128, 128) = onnx::Relu(%268), scope: NestedUNet/ResBlock[conv1_1]/ReLU[relu] 
  %270 : Float(1, 64, 256, 256) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%269, %up1_0.weight, %up1_0.bias), scope: NestedUNet/ConvTranspose2d[up1_0] 
  %271 : Float(1, 128, 256, 256) = onnx::Concat[axis=1](%235, %252, %270), scope: NestedUNet 
  %272 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%271, %conv0_2.conv1.weight, %conv0_2.conv1.bias), scope: NestedUNet/ResBlock[conv0_2]/Conv2d[conv1]
  %273 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%272, %conv0_2.bn1.weight, %conv0_2.bn1.bias, %conv0_2.bn1.running_mean, %conv0_2.bn1.running_var), scope: NestedUNet/ResBlock[conv0_2]/BatchNorm2d[bn1] 
  %274 : Float(1, 32, 256, 256) = onnx::Relu(%273), scope: NestedUNet/ResBlock[conv0_2]/ReLU[relu]
  %275 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%274, %conv0_2.conv2.weight, %conv0_2.conv2.bias), scope: NestedUNet/ResBlock[conv0_2]/Conv2d[conv2] 
  %276 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%275, %conv0_2.bn2.weight, %conv0_2.bn2.bias, %conv0_2.bn2.running_mean, %conv0_2.bn2.running_var), scope: NestedUNet/ResBlock[conv0_2]/BatchNorm2d[bn2]
  %277 : Float(1, 32, 256, 256) = onnx::Add(%276, %272), scope: NestedUNet/ResBlock[conv0_2] 
  %278 : Float(1, 32, 256, 256) = onnx::Relu(%277), scope: NestedUNet/ResBlock[conv0_2]/ReLU[relu]
  %279 : Float(1, 128, 32, 32) = onnx::MaxPool[kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%260), scope: NestedUNet/MaxPool2d[pool] 
  %280 : Float(1, 256, 32, 32) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%279, %conv3_0.conv1.weight, %conv3_0.conv1.bias), scope: NestedUNet/ResBlock[conv3_0]/Conv2d[conv1] 
  %281 : Float(1, 256, 32, 32) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%280, %conv3_0.bn1.weight, %conv3_0.bn1.bias, %conv3_0.bn1.running_mean, %conv3_0.bn1.running_var), scope: NestedUNet/ResBlock[conv3_0]/BatchNorm2d[bn1]
  %282 : Float(1, 256, 32, 32) = onnx::Relu(%281), scope: NestedUNet/ResBlock[conv3_0]/ReLU[relu] 
  %283 : Float(1, 256, 32, 32) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%282, %conv3_0.conv2.weight, %conv3_0.conv2.bias), scope: NestedUNet/ResBlock[conv3_0]/Conv2d[conv2] 
  %284 : Float(1, 256, 32, 32) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%283, %conv3_0.bn2.weight, %conv3_0.bn2.bias, %conv3_0.bn2.running_mean, %conv3_0.bn2.running_var), scope: NestedUNet/ResBlock[conv3_0]/BatchNorm2d[bn2] 
  %285 : Float(1, 256, 32, 32) = onnx::Add(%284, %280), scope: NestedUNet/ResBlock[conv3_0] 
  %286 : Float(1, 256, 32, 32) = onnx::Relu(%285), scope: NestedUNet/ResBlock[conv3_0]/ReLU[relu] 
  %287 : Float(1, 256, 64, 64) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%286, %up3_0.weight, %up3_0.bias), scope: NestedUNet/ConvTranspose2d[up3_0]
  %288 : Float(1, 384, 64, 64) = onnx::Concat[axis=1](%260, %287), scope: NestedUNet 
  %289 : Float(1, 128, 64, 64) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%288, %conv2_1.conv1.weight, %conv2_1.conv1.bias), scope: NestedUNet/ResBlock[conv2_1]/Conv2d[conv1] 
  %290 : Float(1, 128, 64, 64) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%289, %conv2_1.bn1.weight, %conv2_1.bn1.bias, %conv2_1.bn1.running_mean, %conv2_1.bn1.running_var), scope: NestedUNet/ResBlock[conv2_1]/BatchNorm2d[bn1] 
  %291 : Float(1, 128, 64, 64) = onnx::Relu(%290), scope: NestedUNet/ResBlock[conv2_1]/ReLU[relu]
  %292 : Float(1, 128, 64, 64) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%291, %conv2_1.conv2.weight, %conv2_1.conv2.bias), scope: NestedUNet/ResBlock[conv2_1]/Conv2d[conv2]
  %293 : Float(1, 128, 64, 64) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%292, %conv2_1.bn2.weight, %conv2_1.bn2.bias, %conv2_1.bn2.running_mean, %conv2_1.bn2.running_var), scope: NestedUNet/ResBlock[conv2_1]/BatchNorm2d[bn2] 
  %294 : Float(1, 128, 64, 64) = onnx::Add(%293, %289), scope: NestedUNet/ResBlock[conv2_1] 
  %295 : Float(1, 128, 64, 64) = onnx::Relu(%294), scope: NestedUNet/ResBlock[conv2_1]/ReLU[relu]
  %296 : Float(1, 128, 128, 128) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%295, %up2_0.weight, %up2_0.bias), scope: NestedUNet/ConvTranspose2d[up2_0] 
  %297 : Float(1, 256, 128, 128) = onnx::Concat[axis=1](%243, %269, %296), scope: NestedUNet 
  %298 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%297, %conv1_2.conv1.weight, %conv1_2.conv1.bias), scope: NestedUNet/ResBlock[conv1_2]/Conv2d[conv1] 
  %299 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%298, %conv1_2.bn1.weight, %conv1_2.bn1.bias, %conv1_2.bn1.running_mean, %conv1_2.bn1.running_var), scope: NestedUNet/ResBlock[conv1_2]/BatchNorm2d[bn1]
  %300 : Float(1, 64, 128, 128) = onnx::Relu(%299), scope: NestedUNet/ResBlock[conv1_2]/ReLU[relu] 
  %301 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%300, %conv1_2.conv2.weight, %conv1_2.conv2.bias), scope: NestedUNet/ResBlock[conv1_2]/Conv2d[conv2] 
  %302 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%301, %conv1_2.bn2.weight, %conv1_2.bn2.bias, %conv1_2.bn2.running_mean, %conv1_2.bn2.running_var), scope: NestedUNet/ResBlock[conv1_2]/BatchNorm2d[bn2] 
  %303 : Float(1, 64, 128, 128) = onnx::Add(%302, %298), scope: NestedUNet/ResBlock[conv1_2]
  %304 : Float(1, 64, 128, 128) = onnx::Relu(%303), scope: NestedUNet/ResBlock[conv1_2]/ReLU[relu] 
  %305 : Float(1, 64, 256, 256) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%304, %up1_0.weight, %up1_0.bias), scope: NestedUNet/ConvTranspose2d[up1_0] 
  %306 : Float(1, 160, 256, 256) = onnx::Concat[axis=1](%235, %252, %278, %305), scope: NestedUNet 
  %307 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%306, %conv0_3.conv1.weight, %conv0_3.conv1.bias), scope: NestedUNet/ResBlock[conv0_3]/Conv2d[conv1] 
  %308 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%307, %conv0_3.bn1.weight, %conv0_3.bn1.bias, %
  %309 : Float(1, 32, 256, 256) = onnx::Relu(%308), scope: NestedUNet/ResBlock[conv0_3]/ReLU[relu] 
  %310 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%309, %conv0_3.conv2.weight, %conv0_3.conv2.bias), scope: NestedUNet/ResBlock[conv0_3]/Conv2d[conv2] 
  %311 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%310, %conv0_3.bn2.weight, %conv0_3.bn2.bias, %conv0_3.bn2.running_mean, %conv0_3.bn2.running_var), scope: NestedUNet/ResBlock[conv0_3]/BatchNorm2d[bn2] 
  %312 : Float(1, 32, 256, 256) = onnx::Add(%311, %307), scope: NestedUNet/ResBlock[conv0_3] 
  %313 : Float(1, 32, 256, 256) = onnx::Relu(%312), scope: NestedUNet/ResBlock[conv0_3]/ReLU[relu] 
  %314 : Float(1, 256, 16, 16) = onnx::MaxPool[kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%286), scope: NestedUNet/MaxPool2d[pool] 
  %315 : Float(1, 512, 16, 16) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%314, %conv4_0.conv1.weight, %conv4_0.conv1.bias), scope: NestedUNet/ResBlock[conv4_0]/Conv2d[conv1]
  %316 : Float(1, 512, 16, 16) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%315, %conv4_0.bn1.weight, %conv4_0.bn1.bias, %conv4_0.bn1.running_mean, %conv4_0.bn1.running_var), scope: NestedUNet/ResBlock[conv4_0]/BatchNorm2d[bn1] 
  %317 : Float(1, 512, 16, 16) = onnx::Relu(%316), scope: NestedUNet/ResBlock[conv4_0]/ReLU[relu] 
  %318 : Float(1, 512, 16, 16) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%317, %conv4_0.conv2.weight, %conv4_0.conv2.bias), scope: NestedUNet/ResBlock[conv4_0]/Conv2d[conv2] 
  %319 : Float(1, 512, 16, 16) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%318, %conv4_0.bn2.weight, %conv4_0.bn2.bias, %conv4_0.bn2.running_mean, %conv4_0.bn2.running_var), scope: NestedUNet/ResBlock[conv4_0]/BatchNorm2d[bn2] 
  %320 : Float(1, 512, 16, 16) = onnx::Add(%319, %315), scope: NestedUNet/ResBlock[conv4_0] 
  %321 : Float(1, 512, 16, 16) = onnx::Relu(%320), scope: NestedUNet/ResBlock[conv4_0]/ReLU[relu] 
  %322 : Float(1, 512, 32, 32) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%321, %up4_0.weight, %up4_0.bias), scope: NestedUNet/ConvTranspose2d[up4_0] 
  %323 : Float(1, 768, 32, 32) = onnx::Concat[axis=1](%286, %322), scope: NestedUNet 
  %324 : Float(1, 256, 32, 32) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%323, %conv3_1.conv1.weight, %conv3_1.conv1.bias), scope: NestedUNet/ResBlock[conv3_1]/Conv2d[conv1] 
  %325 : Float(1, 256, 32, 32) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%324, %conv3_1.bn1.weight, %conv3_1.bn1.bias, %conv3_1.bn1.running_mean, %conv3_1.bn1.running_var), scope: NestedUNet/ResBlock[conv3_1]/BatchNorm2d[bn1] 
  %326 : Float(1, 256, 32, 32) = onnx::Relu(%325), scope: NestedUNet/ResBlock[conv3_1]/ReLU[relu] 
  %327 : Float(1, 256, 32, 32) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%326, %conv3_1.conv2.weight, %conv3_1.conv2.bias), scope: NestedUNet/ResBlock[conv3_1]/Conv2d[conv2] 
  %328 : Float(1, 256, 32, 32) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%327, %conv3_1.bn2.weight, %conv3_1.bn2.bias, %conv3_1.bn2.running_mean, %conv3_1.bn2.running_var), scope: NestedUNet/ResBlock[conv3_1]/BatchNorm2d[bn2] 
  %329 : Float(1, 256, 32, 32) = onnx::Add(%328, %324), scope: NestedUNet/ResBlock[conv3_1] 
  %330 : Float(1, 256, 32, 32) = onnx::Relu(%329), scope: NestedUNet/ResBlock[conv3_1]/ReLU[relu] 
  %331 : Float(1, 256, 64, 64) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%330, %up3_0.weight, %up3_0.bias), scope: NestedUNet/ConvTranspose2d[up3_0] 
  %332 : Float(1, 512, 64, 64) = onnx::Concat[axis=1](%260, %295, %331), scope: NestedUNet 
  %333 : Float(1, 128, 64, 64) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%332, %conv2_2.conv1.weight, %conv2_2.conv1.bias), scope: NestedUNet/ResBlock[conv2_2]/Conv2d[conv1] 
  %334 : Float(1, 128, 64, 64) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%333, %conv2_2.bn1.weight, %conv2_2.bn1.bias, %conv2_2.bn1.running_mean, %conv2_2.bn1.running_var), scope: NestedUNet/ResBlock[conv2_2]/BatchNorm2d[bn1]
  %335 : Float(1, 128, 64, 64) = onnx::Relu(%334), scope: NestedUNet/ResBlock[conv2_2]/ReLU[relu] 
  %336 : Float(1, 128, 64, 64) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%335, %conv2_2.conv2.weight, %conv2_2.conv2.bias), scope: NestedUNet/ResBlock[conv2_2]/Conv2d[conv2] 
  %337 : Float(1, 128, 64, 64) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%336, %conv2_2.bn2.weight, %conv2_2.bn2.bias, %conv2_2.bn2.running_mean, %conv2_2.bn2.running_var), scope: NestedUNet/ResBlock[conv2_2]/BatchNorm2d[bn2] 
  %338 : Float(1, 128, 64, 64) = onnx::Add(%337, %333), scope: NestedUNet/ResBlock[conv2_2] 
  %339 : Float(1, 128, 64, 64) = onnx::Relu(%338), scope: NestedUNet/ResBlock[conv2_2]/ReLU[relu] 
  %340 : Float(1, 128, 128, 128) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%339, %up2_0.weight, %up2_0.bias), scope: NestedUNet/ConvTranspose2d[up2_0] 
  %341 : Float(1, 320, 128, 128) = onnx::Concat[axis=1](%243, %269, %304, %340), scope: NestedUNet 
  %342 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%341, %conv1_3.conv1.weight, %conv1_3.conv1.bias), scope: NestedUNet/ResBlock[conv1_3]/Conv2d[conv1] 
  %343 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%342, %conv1_3.bn1.weight, %conv1_3.bn1.bias, %conv1_3.bn1.running_mean, %conv1_3.bn1.running_var), scope: NestedUNet/ResBlock[conv1_3]/BatchNorm2d[bn1] 
  %344 : Float(1, 64, 128, 128) = onnx::Relu(%343), scope: NestedUNet/ResBlock[conv1_3]/ReLU[relu] 
  %345 : Float(1, 64, 128, 128) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%344, %conv1_3.conv2.weight, %conv1_3.conv2.bias), scope: NestedUNet/ResBlock[conv1_3]/Conv2d[conv2] 
  %346 : Float(1, 64, 128, 128) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%345, %conv1_3.bn2.weight, %conv1_3.bn2.bias, %conv1_3.bn2.running_mean, %conv1_3.bn2.running_var), scope: NestedUNet/ResBlock[conv1_3]/BatchNorm2d[bn2] 
  %347 : Float(1, 64, 128, 128) = onnx::Add(%346, %342), scope: NestedUNet/ResBlock[conv1_3] 
  %348 : Float(1, 64, 128, 128) = onnx::Relu(%347), scope: NestedUNet/ResBlock[conv1_3]/ReLU[relu] 
  %349 : Float(1, 64, 256, 256) = onnx::ConvTranspose[dilations=[1, 1], group=1, kernel_shape=[2, 2], pads=[0, 0, 0, 0], strides=[2, 2]](%348, %up1_0.weight, %up1_0.bias), scope: NestedUNet/ConvTranspose2d[up1_0] 
  %350 : Float(1, 192, 256, 256) = onnx::Concat[axis=1](%235, %252, %278, %313, %349), scope: NestedUNet 
  %351 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%350, %conv0_4.conv1.weight, %conv0_4.conv1.bias), scope: NestedUNet/ResBlock[conv0_4]/Conv2d[conv1] 
  %352 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%351, %conv0_4.bn1.weight, %conv0_4.bn1.bias, %conv0_4.bn1.running_mean, %conv0_4.bn1.running_var), scope: NestedUNet/ResBlock[conv0_4]/BatchNorm2d[bn1] 
  %353 : Float(1, 32, 256, 256) = onnx::Relu(%352), scope: NestedUNet/ResBlock[conv0_4]/ReLU[relu] 
  %354 : Float(1, 32, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%353, %conv0_4.conv2.weight, %conv0_4.conv2.bias), scope: NestedUNet/ResBlock[conv0_4]/Conv2d[conv2] 
  %355 : Float(1, 32, 256, 256) = onnx::BatchNormalization[epsilon=1e-05, momentum=0.9](%354, %conv0_4.bn2.weight, %conv0_4.bn2.bias, %conv0_4.bn2.running_mean, %conv0_4.bn2.running_var), scope: NestedUNet/ResBlock[conv0_4]/BatchNorm2d[bn2] 
  %356 : Float(1, 32, 256, 256) = onnx::Add(%355, %351), scope: NestedUNet/ResBlock[conv0_4] 
  %357 : Float(1, 32, 256, 256) = onnx::Relu(%356), scope: NestedUNet/ResBlock[conv0_4]/ReLU[relu] 
  %outputs : Float(1, 1, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[1, 1], pads=[0, 0, 0, 0], strides=[1, 1]](%252, %final1.weight, %final1.bias), scope: NestedUNet/Conv2d[final1] 
  %359 : Float(1, 1, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[1, 1], pads=[0, 0, 0, 0], strides=[1, 1]](%278, %final2.weight, %final2.bias), scope: NestedUNet/Conv2d[final2] 
  %360 : Float(1, 1, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[1, 1], pads=[0, 0, 0, 0], strides=[1, 1]](%313, %final3.weight, %final3.bias), scope: NestedUNet/Conv2d[final3] 
  %361 : Float(1, 1, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[1, 1], pads=[0, 0, 0, 0], strides=[1, 1]](%357, %final4.weight, %final4.bias), scope: NestedUNet/Conv2d[final4] 
  %362 : Float(1, 4, 256, 256) = onnx::Concat[axis=1](%outputs, %359, %360, %361), scope: NestedUNet 
  %363 : Float(1, 1, 256, 256) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[1, 1], pads=[0, 0, 0, 0], strides=[1, 1]](%362, %final5.weight, %final5.bias), scope: NestedUNet/Conv2d[final5] 
  return (%outputs, %359, %360, %361, %363)

save onnx model finish!
Process finished with exit code 0
That is the log. And the convert code is:

def saveONNX(model, filepath): # pytorch --> onnx
    input = torch.randn(1, 6, 256, 256, device='cuda')
    input_names = ['input_merge']
    output_names = ['outputs']
    torch.onnx.export(model, input, filepath, verbose=True, input_names=input_names, output_names=output_names)

the model is unet++ ,and the filepath is the save dir. Do you think where is the problem happend?Does the problem of my code?Hope for your reply.

@rmccorm4
Copy link
Collaborator

I played around with your model a bit, but I'm not sure of the exact fix. Issue seems to be coming from the Upsample op which is creating undesired Gather ops or something in the ONNX graph.

[8] Assertion failed: !(data->getType() == nvinfer1::DataType::kINT32 && nbDims == 1 && inputs.at(0).is_tensor()) && "Cannot perform gather on a shape tensor!"

This post might help fix that if you know the expected output shape of the upsample: onnx/onnx-tensorrt#192 (comment)

@chegnyanjun
Copy link
Author

chegnyanjun commented Nov 26, 2019

Yep,I also find maybe the problem come from the define of Upsample(it send out the problem of Gather ops in ONNX graph),but I check the supports ops in tensorrt6.0.1.5 for ONNX1.6, it represents the tensorrt6.0.1.5 supports Gather op in Onnx1.6,So maybe the tensortt6.0.1.5 does not supports very well for Upsample,right?.Besides,Thanks for your suggestion and i wiil try it,Thank you very much for your kind help.

@rmccorm4
Copy link
Collaborator

See this thread for looking into Upsample op issues: #284

@rmccorm4
Copy link
Collaborator

Hi @chegnyanjun,

Can you try to export your model with PyTorch 1.4 and then parse that model with TensorRT 7?

According to @daquexian, an issue on pytorch side of things should've been fixed in v1.4

@ZahraTaleb7
Copy link

Hi @rmccorm4
Could you please help me to convert my keras model to a way that I can use in deepstream?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
API: C++ Export: torch.onnx https://pytorch.org/docs/stable/onnx.html Framework: PyTorch invalid This doesn't seem right ONNX
Projects
None yet
Development

No branches or pull requests

3 participants