Toybrick

标题: onnx 转 rknn 时发生 "ValueError: Dimensions must be equal..." 错误 [打印本页]

作者: Aiden    时间: 2020-5-25 22:20
标题: onnx 转 rknn 时发生 "ValueError: Dimensions must be equal..." 错误
Hi,

使用 rknn 转换一个由 pytoch 导出的 onnx 模型时, 在 rknn.build 阶段发生了错误。还请各位帮忙诊断原因。 感谢。

错误信息:
E Catch exception when building RKNN model!
E Traceback (most recent call last):
E   File "/home/bowie/miniconda3/envs/rknn/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 1607, in _create_c_op
E     c_op = c_api.TF_FinishOperation(op_desc)
E tensorflow.python.framework.errors_impl.InvalidArgumentError: Dimensions must be equal, but are 512 and 256 for 'ConvTranspose_251_31_2/Add' (op: 'Add') with input shapes: [100,16,16,512], [256].
E During handling of the above exception, another exception occurred:
......
E   File "rknn/base/RKNNlib/layer/RKNNlayer.py", line 287, in rknn.base.RKNNlib.layer.RKNNlayer.RKNNLayer.compute_tensor
E   File "rknn/base/RKNNlib/layer/deconvolution.py", line 121, in rknn.base.RKNNlib.layer.deconvolution.Deconvolution.compute_out_tensor
......
E   File "/home/bowie/miniconda3/envs/rknn/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 1770, in __init__
E     control_input_ops)
E   File "/home/bowie/miniconda3/envs/rknn/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 1610, in _create_c_op
E     raise ValueError(str(e))
E ValueError: Dimensions must be equal, but are 512 and 256 for 'ConvTranspose_251_31_2/Add' (op: 'Add') with input shapes: [100,16,16,512], [256].


onnx 模型可以正常由 onnxruntime 进行推理,并且结果正常。

运行环境如下:


操作系统        Linux 5.4.0-31-generic #35-Ubuntu SMP x86_64
python         Python 3.6.10 |Anaconda, Inc.
rknn-toolkit           1.3.2
torch                  1.3.1
tensorflow-gpu         1.15.0
onnx                   1.4.1
onnxruntime            1.3.0

转换代码:
rknn = RKNN()
rknn.config(channel_mean_value='128 128 128 128', target_platform=['rk3399pro'])
rknn.load_onnx('model.onnx')
rknn.build(do_quantization=True)

另外,经过测试,在模型输入层后插入的 Sub、Div 等层也会遇到这种 “Dimensions must be equal” 的错误。

还请各位帮忙诊断一下问题。

感谢。



作者: leok    时间: 2020-5-26 08:36
试看看把相关toolkit装以下版本:
tensorflow-gpu: 1.13.1
onnx: 1.4.1
torch: 1.2.0
作者: jefferyzhang    时间: 2020-5-26 08:37
使用反卷积需要手动固定卷积核size大小,参看该贴:http://t.rock-chips.com/forum.ph ... 8811&fromuid=20
作者: Aiden    时间: 2020-5-26 11:20
leok 发表于 2020-5-26 08:36
试看看把相关toolkit装以下版本:
tensorflow-gpu: 1.13.1
onnx: 1.4.1

感谢。安装指定版本后,似乎有了进展。现在错误提示变成了:

  1. ...
  2. E   File "/home/bowie/miniconda3/envs/rknn/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 1641, in conv2d_transpose
  3. E     filter.get_shape()[2]))
  4. E ValueError: output_shape does not match filter's output channels, 512 != 256
复制代码

作者: Aiden    时间: 2020-5-26 11:23
jefferyzhang 发表于 2020-5-26 08:37
使用反卷积需要手动固定卷积核size大小,参看该贴:http://t.rock-chips.com/forum.php?mod=redirect&goto= ...

我参考的帖子只找到了对于interpolate的描述。请问 conv2dtranspose 应该如何手动固定卷积核大小呢?
谢谢。
作者: Aiden    时间: 2020-5-30 01:26
感谢各位的帮助。

最后也没有找到能固定卷积核size的方法. 我现在的解决方案是从 pytorch 中将模型导出为 TorchScript, 然后再导入 rknn 的 export_pytorch 就可以正常 build 了。




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3