tutorials icon indicating copy to clipboard operation
tutorials copied to clipboard

Problem with F.avg_pool2d

Open ghost opened this issue 5 years ago • 2 comments

Trying to convert this pytorch model with ONNX gives me this error. I've searched github and this error came up before in version 1.1.0 but was apparently rectified. Now I'm on torch 1.4.0. (python 3.6.9) and I see this error.

File "/usr/local/lib/python3.6/dist-packages/torch/onnx/init.py", line 148, in export strip_doc_string, dynamic_axes, keep_initializers_as_inputs) File "/usr/local/lib/python3.6/dist-packages/torch/onnx/utils.py", line 66, in export dynamic_axes=dynamic_axes, keep_initializers_as_inputs=keep_initializers_as_inputs) File "/usr/local/lib/python3.6/dist-packages/torch/onnx/utils.py", line 416, in _export fixed_batch_size=fixed_batch_size) File "/usr/local/lib/python3.6/dist-packages/torch/onnx/utils.py", line 296, in _model_to_graph fixed_batch_size=fixed_batch_size, params_dict=params_dict) File "/usr/local/lib/python3.6/dist-packages/torch/onnx/utils.py", line 135, in _optimize_graph graph = torch._C._jit_pass_onnx(graph, operator_export_type) File "/usr/local/lib/python3.6/dist-packages/torch/onnx/init.py", line 179, in _run_symbolic_function return utils._run_symbolic_function(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/torch/onnx/utils.py", line 657, in _run_symbolic_function return op_fn(g, *inputs, **attrs) File "/usr/local/lib/python3.6/dist-packages/torch/onnx/symbolic_helper.py", line 128, in wrapper args = [_parse_arg(arg, arg_desc) for arg, arg_desc in zip(args, arg_descriptors)] File "/usr/local/lib/python3.6/dist-packages/torch/onnx/symbolic_helper.py", line 128, in args = [_parse_arg(arg, arg_desc) for arg, arg_desc in zip(args, arg_descriptors)] File "/usr/local/lib/python3.6/dist-packages/torch/onnx/symbolic_helper.py", line 81, in _parse_arg "', since it's not constant, please try to make " RuntimeError: Failed to export an ONNX attribute 'onnx::Gather', since it's not constant, please try to make things (e.g., kernel size) static if possible

How to fix it? I've also tried latest nightly build, same error comes up.

My code: from model import BiSeNet import torch.onnx import torch

net = BiSeNet(19) net.cuda() net.load_state_dict(torch.load('/content/drive/My Drive/Collab/fp/res/cp/79999_iter.pth')) net.eval()

dummy = torch.rand(1,3,512,512).cuda() torch.onnx.export(net, dummy, "Model.onnx", input_names=["image"], output_names=["output"]) ` I also tried downgrading to torch 1.0.0 and the error is still there "RuntimeError: ONNX symbolic expected a constant value in the trace"

ghost avatar Mar 14 '20 09:03 ghost

I added print (v.node ()) to symbolic_helper.py just before the runtime error is raised to see what's causing the error.

This is the output: %595 : Long() = onnx::Gather[axis=0](%592, %594) # /content/drive/My Drive/Collab/fp/model.py:111:0

And that line in 111 in model.py is: avg = F.avg_pool2d(feat32, feat32.size()[2:])

ghost avatar Mar 14 '20 09:03 ghost

Based on my further research I found this source stating that:

Both resNet50 and 32 are fine, but to resNet18, ONNX model cannot be exported.

The model I’m using is indeed based on resnet18.

The source suggests the following changes:

From this:

import torch.nn.functional as F def forward(self, x): feat = self.base(x) feat = F.avg_pool2d(feat, feat.size()[2:])

To this:

class Model(nn.Module): def init(): … self.avg_pool2d = nn.AvgPool2d(kernel_size=k_s, ceil_mode=False) … def forward(self, x): … feat = self.avg_pool2d(feat, feat.size()[2:]) …

However after this change I have another error:

forward() takes 2 positional arguments but 3 were given

ghost avatar Mar 15 '20 14:03 ghost