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

KeyError: 'onnx::Conv_197' on converting torchvision resnet18 #156

Open
nihui opened this issue May 11, 2023 · 1 comment
Open

KeyError: 'onnx::Conv_197' on converting torchvision resnet18 #156

nihui opened this issue May 11, 2023 · 1 comment
Labels
bug Something isn't working

Comments

@nihui
Copy link

nihui commented May 11, 2023

python 3.11
torch-2.0.0+cpu

import torch
import torchvision
import torch.onnx

model = torchvision.models.resnet18()
model = model.eval()

x = torch.rand(1, 3, 224, 224)

torch.onnx.export(model, x, "resnet18.onnx", export_params=True, opset_version=13)

from onnx2torch import convert

torch_model_1 = convert('resnet18.onnx')
============== Diagnostic Run torch.onnx.export version 2.0.0+cpu ==============
verbose: False, log level: Level.ERROR
======================= 0 NONE 0 NOTE 0 WARNING 0 ERROR ========================

Traceback (most recent call last):
  File "/home/nihui/osd/ncnn-nihui/tools/pnnx/build2/src/test.py", line 15, in <module>
    torch_model_1 = convert('resnet18.onnx')
                    ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/nihui/.local/lib/python3.11/site-packages/onnx2torch/converter.py", line 110, in convert
    torch_module, onnx_mapping = converter(onnx_node, onnx_graph)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/nihui/.local/lib/python3.11/site-packages/onnx2torch/node_converters/conv.py", line 33, in _
    bias = graph.initializers[bias_value_name]
           ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'onnx::Conv_197'
[nihui@nihuini-LC2 src]$ pip list
Package                 Version
----------------------- --------------------
absl-py                 1.4.0
argcomplete             2.0.0
asttokens               2.2.1
attrs                   22.1.0
Babel                   2.10.3
backcall                0.2.0
Beaker                  1.10.0
beautifulsoup4          4.12.0
blivet                  3.5.0
blivet-gui              2.4.1
cached-property         1.5.2
cachetools              5.3.0
cffi                    1.15.1
chardet                 5.1.0
charset-normalizer      2.1.0
contourpy               1.0.7
cryptography            37.0.2
cupshelpers             1.0
cycler                  0.11.0
dasbus                  1.6
dbus-python             1.3.2
decorator               5.1.1
distro                  1.7.0
dnspython               2.2.1
einops                  0.6.0
executing               1.2.0
fb-re2                  1.0.7
file-magic              0.4.0
filelock                3.9.0
fonttools               4.38.0
gitdb                   4.0.10
GitPython               3.1.31
google-auth             2.16.0
google-auth-oauthlib    0.4.6
gpg                     1.17.0
grpcio                  1.51.1
gssapi                  1.7.3
humanize                3.13.1
idna                    3.3
iniconfig               1.1.1
initial-setup           0.3.95
ipython                 8.10.0
jedi                    0.18.2
Jinja2                  3.1.2
kiwisolver              1.4.4
koji                    1.32.0
langtable               0.0.61
libcomps                0.1.18
lit                     15.0.7
lxml                    4.9.1
Mako                    1.1.4
Markdown                3.4.1
MarkupSafe              2.1.1
matplotlib              3.7.0
matplotlib-inline       0.1.6
mercurial               6.2.3
meson                   1.0.1
mpmath                  1.2.1
ncnn                    1.0.20230426
networkx                3.0
nftables                0.1
ntpsec                  1.2.2
numpy                   1.23.5
oauthlib                3.2.2
olefile                 0.46
onnx                    1.13.1
onnx2torch              1.5.6
opencv-python           4.7.0.68
packaging               21.3
pandas                  1.5.3
parso                   0.8.3
Paste                   3.5.0
pexpect                 4.8.0
pickleshare             0.7.5
pid                     2.2.3
Pillow                  9.2.0
pip                     22.2.2
pluggy                  1.0.0
ply                     3.11
portalocker             2.7.0
productmd               1.35
progressbar2            3.53.2
prompt-toolkit          3.0.36
protobuf                3.20.3
psutil                  5.9.4
ptyprocess              0.6.0
pure-eval               0.2.2
pwquality               1.4.5
py                      1.11.0
pyasn1                  0.4.8
pyasn1-modules          0.2.8
pycairo                 1.21.0
pycparser               2.20
pycrypto                2.6.1
pycups                  2.0.1
pycurl                  7.45.1
pygit2                  1.7.1
Pygments                2.14.0
PyGObject               3.42.2
pykickstart             3.41
pyOpenSSL               21.0.0
pyparsing               3.0.9
pyparted                3.12.0
PySocks                 1.7.1
pytest                  7.1.3
python-augeas           1.1.0
python-dateutil         2.8.2
python-gettext          4.0
python-manatools        0.0.4
python-meh              0.50
python-utils            3.1.0
pytz                    2023.3
pyudev                  0.23.2
PyYAML                  6.0
requests                2.28.1
requests_download       0.1.2
requests-file           1.5.1
requests-ftp            0.3.1
requests-gssapi         1.2.3
requests-oauthlib       1.3.1
rpm                     4.18.0
rpmautospec             0.3.5
rsa                     4.9
SciPy                   1.8.1
seaborn                 0.12.2
selinux                 3.5
sepolicy                3.5
setools                 4.4.0
setproctitle            1.2.3
setuptools              62.6.0
simpleline              1.9.0
six                     1.16.0
slip                    0.6.4
slip.dbus               0.6.4
smmap                   5.0.0
sos                     4.4
soupsieve               2.3.2.post1
SSSDConfig              2.8.2
stack-data              0.6.2
sympy                   1.11.1
systemd-python          235
Tempita                 0.5.2
tensorboard             2.12.0
tensorboard-data-server 0.7.0
tensorboard-plugin-wit  1.8.1
thop                    0.1.1.post2209072238
toml                    0.10.2
tomli                   2.0.1
torch                   2.0.0+cpu
torchaudio              2.0.1+cpu
torchvision             0.15.1+cpu
tqdm                    4.64.1
traitlets               5.9.0
typing_extensions       4.4.0
urllib3                 1.26.12
wcwidth                 0.2.6
Werkzeug                2.2.3
wheel                   0.38.4

@github-actions github-actions bot added Stale and removed Stale labels Jun 11, 2023
@ENOT-AutoDL ENOT-AutoDL deleted a comment from github-actions bot Jul 5, 2023
@senysenyseny16 senysenyseny16 added the bug Something isn't working label Jul 5, 2023
@github-actions github-actions bot added the Stale label Aug 5, 2023
@ENOT-AutoDL ENOT-AutoDL deleted a comment from github-actions bot Aug 7, 2023
@github-actions github-actions bot added the Stale label Sep 7, 2023
@07571026
Copy link

07571026 commented Sep 26, 2023

Hi,
I had a similar issue to yours, and I solved it.

Traceback (most recent call last):
  File "d:\onnx2torch\convert.py", line 6, in <module>
    torch_model = convert(model)
  File "c:\Python\Python39\pyenv\lib\site-packages\onnx2torch\converter.py", line 110, in convert
    torch_module, onnx_mapping = converter(onnx_node, onnx_graph)
  File "c:\Python\Python39\pyenv\lib\site-packages\onnx2torch\node_converters\conv.py", line 29, in _        
    weights = graph.initializers[weights_value_name]
KeyError: 'conv2d_0.w_0'

I found that if a node is trainable, its category must be 'Initializer' rather than 'Constant' in ONNX.
Therefore, I changed the trainable node, which was in the 'Constant' category, to 'Initializer,' and the issue was resolved.

Could you check you node's category if Constant or not?
You can use netron check the node

If you need to change the category of a node, you can follow these steps:

  1. use onnx.helper.make_tensor to creat a tensor
  2. use graph.initializer.extend to extend the tensor
  3. use graph.node.remove to original node
  4. onnx.checker.check_model check your onnx model

a demo for you:

import onnx
import numpy as np
from onnx import helper

model_path = "Orinigal.onnx"
NewModel_path = "New.onnx"

onnx_model = onnx.load(model_path)
graph = onnx_model.graph

for node in graph.node:
    if node.name == "TargetNode":
        for attr in node.attribute:
            initializer_node = helper.make_tensor(
                                        name=attr.t.name,
                                        data_type = attr.t.data_type,
                                        dims = attr.t.dims,
                                        vals= np.frombuffer(attr.t.raw_data, np.float32)
                                    )
            graph.initializer.extend([initializer_node])
            graph.node.remove(node)
            onnx.checker.check_model(onnx_model)

onnx.save(onnx_model, NewModel_path)

PS: it's just demo, so you may change code and test.
If there is any question, please let me know.

@github-actions github-actions bot added the Stale label Oct 27, 2023
@ENOT-AutoDL ENOT-AutoDL deleted a comment from github-actions bot Oct 31, 2023
@ENOT-AutoDL ENOT-AutoDL deleted a comment from github-actions bot Oct 31, 2023
@ENOT-AutoDL ENOT-AutoDL deleted a comment from nihui Oct 31, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants