Toybrick

onnx 转 rknn 时发生 "ValueError: Dimensions must be equal..." 错误

Aiden

注册会员

积分
88
楼主
发表于 2020-5-25 22:20:10    查看: 9913|回复: 5 | [复制链接]    打印 | 只看该作者
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

版主

积分
894
沙发
发表于 2020-5-26 08:36:43 | 只看该作者
试看看把相关toolkit装以下版本:
tensorflow-gpu: 1.13.1
onnx: 1.4.1
torch: 1.2.0
回复

使用道具 举报

jefferyzhang

版主

积分
13580
板凳
发表于 2020-5-26 08:37:17 | 只看该作者
使用反卷积需要手动固定卷积核size大小,参看该贴:http://t.rock-chips.com/forum.ph ... 8811&fromuid=20
回复

使用道具 举报

Aiden

注册会员

积分
88
地板
 楼主| 发表于 2020-5-26 11:20:07 | 只看该作者
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

注册会员

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

我参考的帖子只找到了对于interpolate的描述。请问 conv2dtranspose 应该如何手动固定卷积核大小呢?
谢谢。
回复

使用道具 举报

Aiden

注册会员

积分
88
6#
 楼主| 发表于 2020-5-30 01:26:14 | 只看该作者
感谢各位的帮助。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表