Toybrick

楼主: 18651669016

关于pytorch转onnx的反卷积问题

jefferyzhang

版主

积分
13580
11#
发表于 2020-4-2 08:21:57 | 只看该作者
把模型和转换脚本打包上传百度网盘,然后发给我,我提一个bug给NPU部门
回复

使用道具 举报

gyq_

注册会员

积分
76
12#
发表于 2020-4-2 09:15:55 | 只看该作者
jefferyzhang 发表于 2020-4-2 08:21
把模型和转换脚本打包上传百度网盘,然后发给我,我提一个bug给NPU部门

链接: https://pan.baidu.com/s/1jGD54_j_n0o6dj-xF-8SCw  密码: wor0
回复

使用道具 举报

jefferyzhang

版主

积分
13580
13#
发表于 2020-4-2 09:22:04 | 只看该作者
gyq_ 发表于 2020-4-2 09:15
链接: https://pan.baidu.com/s/1jGD54_j_n0o6dj-xF-8SCw  密码: wor0

你的问题已经上报了。
楼主的问题楼主怎么不见了?
回复

使用道具 举报

gyq_

注册会员

积分
76
14#
发表于 2020-4-2 09:51:18 | 只看该作者
jefferyzhang 发表于 2020-4-2 09:22
你的问题已经上报了。
楼主的问题楼主怎么不见了?

还有一个问题,这里的反卷积是不是执行错了,正确的h,w应该是从16到32到64到128的,结果反过来缩小到2了
回复

使用道具 举报

jefferyzhang

版主

积分
13580
15#
发表于 2020-4-2 09:54:49 | 只看该作者
gyq_ 发表于 2020-4-2 09:51
还有一个问题,这里的反卷积是不是执行错了,正确的h,w应该是从16到32到64到128的,结果反过来缩小到2了 ...

这里看不出来,你可以按troubleshoot文档试着dump出每一层结果来看下是不是预期
回复

使用道具 举报

gyq_

注册会员

积分
76
16#
发表于 2020-4-3 11:54:04 | 只看该作者
我又尝试了一下先转成onnx再转成rknn。发现了一个问题,当反卷积层的输入通道数不等于输出通道数时,会出现如下错误:
D RKNN output shape(convolution): (1 16 16 1280)
D Real output shape: (1, 16, 16, 1280)
D Process ConvTranspose_30_9 ...
D RKNN output shape(deconvolution): (1 32 32 1280)
E Catch exception when building RKNN model!
E Traceback (most recent call last):
E   File "rknn/api/rknn_base.py", line 737, in rknn.api.rknn_base.RKNNBase.build
E   File "rknn/api/rknn_base.py", line 1644, in rknn.api.rknn_base.RKNNBase._quantize2
E   File "rknn/base/RKNNlib/app/medusa/quantization.py", line 105, in rknn.base.RKNNlib.app.medusa.quantization.Quantization.run
E   File "rknn/base/RKNNlib/app/medusa/quantization.py", line 44, in rknn.base.RKNNlib.app.medusa.quantization.Quantization._run_quantization
E   File "rknn/base/RKNNlib/app/medusa/workspace.py", line 129, in rknn.base.RKNNlib.app.medusa.workspace.Workspace.run
E   File "rknn/base/RKNNlib/app/medusa/workspace.py", line 99, in rknn.base.RKNNlib.app.medusa.workspace.Workspace._setup_graph
E   File "rknn/base/RKNNlib/app/medusa/workspace.py", line 100, in rknn.base.RKNNlib.app.medusa.workspace.Workspace._setup_graph
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 274, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 278, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 305, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 305, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 305, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
E   [Previous line repeated 2 more times]
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 331, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 336, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
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 100, in rknn.base.RKNNlib.layer.deconvolution.Deconvolution.compute_out_tensor
E   File "/Users/gyq/DeepLearning/CenterNet_in_mac/venv/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 1242, in conv2d_transpose
E     filter.get_shape()[2]))
E ValueError: output_shape does not match filter's output channels, 1280 != 16


如果两个通道数相等则不会出现错误。
  1. import torch
  2. import torch.nn as nn
  3. import cv2
  4. from rknn.api import RKNN

  5. #
  6. channels = 1280

  7. model = nn.Sequential(
  8.     nn.Conv2d(
  9.                 3, 32,
  10.                 kernel_size=4, stride=2,
  11.                 padding=1, dilation=1, bias=False),
  12.     nn.Conv2d(
  13.                 32, 32,
  14.                 kernel_size=4, stride=2,
  15.                 padding=1, dilation=1, bias=False),
  16.     nn.Conv2d(
  17.         32, 32,
  18.         kernel_size=4, stride=2,
  19.         padding=1, dilation=1, bias=False),
  20.     nn.Conv2d(
  21.         32, 32,
  22.         kernel_size=4, stride=2,
  23.         padding=1, dilation=1, bias=False),
  24.     nn.Conv2d(
  25.         32, channels,
  26.         kernel_size=4, stride=2,
  27.         padding=1, dilation=1, bias=False),
  28.     # 当ConvTranspose2d输入通道数不等于输出通道数是,在build过程中会出错
  29.     # 加一层conv2D转换一下后就可以跑通了
  30.     # nn.Conv2d(
  31.     #     channels, 16,
  32.     #     kernel_size=3, stride=1,
  33.     #     padding=1, dilation=1, bias=False),
  34.     nn.ConvTranspose2d(
  35.                     in_channels=channels,
  36.                     # in_channels=16,
  37.                     out_channels=16,
  38.                     kernel_size=4,
  39.                     stride=2,
  40.                     padding=1,
  41.                     output_padding=0,
  42.                     bias=True),
  43.     nn.BatchNorm2d(16, momentum=0.1),
  44.     nn.ReLU(inplace=True),

  45.     nn.ConvTranspose2d(
  46.                     in_channels=16,
  47.                     out_channels=16,
  48.                     kernel_size=4,
  49.                     stride=2,
  50.                     padding=1,
  51.                     output_padding=0,
  52.                     bias=False),
  53.     nn.BatchNorm2d(16, momentum=0.1),
  54.     nn.ReLU(inplace=True),

  55.     nn.ConvTranspose2d(
  56.                     in_channels=16,
  57.                     out_channels=16,
  58.                     kernel_size=4,
  59.                     stride=2,
  60.                     padding=1,
  61.                     output_padding=0,
  62.                     bias=False),
  63.     nn.BatchNorm2d(16, momentum=0.1),
  64.     nn.ReLU(inplace=True),

  65. )



  66. # 保存为onnx
  67. torch.onnx.export(model,
  68.                   torch.Tensor(1, 3, 512, 512),
  69.                   'test_error2.onnx',
  70.                   verbose=True,
  71.                   do_constant_folding=False,  # 是否执行常量折叠优化
  72.                   input_names=["input"],  # 输入名
  73.                   output_names=["output"],  # 输出名
  74.                   )

  75. input_size_list = [[3, 512, 512]]

  76. # Create RKNN object
  77. rknn = RKNN(verbose=True)
  78. print('--> Loading model')

  79. ret = rknn.load_onnx(model='test_error2.onnx')
  80. print('--> building model')
  81. ret = rknn.build(do_quantization=True, dataset='dataset.txt')

  82. print('--> export model')
  83. ret = rknn.export_rknn('test_error2.rknn')

  84. ret = rknn.load_rknn('test_error2.rknn')

  85. img = cv2.imread('space_shuttle_512.jpg')
  86. ret = rknn.init_runtime()

  87. print('--> inference')
  88. outputs = rknn.inference(inputs=[img])
  89. print(outputs[0].shape)
复制代码
回复

使用道具 举报

gyq_

注册会员

积分
76
17#
发表于 2020-4-3 11:55:45 | 只看该作者
请问这是什么原因?
回复

使用道具 举报

gyq_

注册会员

积分
76
18#
发表于 2020-4-3 14:26:02 | 只看该作者
jefferyzhang 发表于 2020-4-2 09:54
这里看不出来,你可以按troubleshoot文档试着dump出每一层结果来看下是不是预期 ...

我输出出来看过了,确实是和预期的相反。
刚刚我又试了一下把第一个反卷积层的输入通道和输出通道改成相等的,保存为.pt,再转成rknn,可以跑通,但最后inference输出的结果也是和预期的相反(反卷积越卷越小)。
回复

使用道具 举报

jefferyzhang

版主

积分
13580
19#
发表于 2020-4-3 14:55:52 | 只看该作者
gyq_ 发表于 2020-4-3 14:26
我输出出来看过了,确实是和预期的相反。
刚刚我又试了一下把第一个反卷积层的输入通道和输出通道改成相 ...

试下beta7:
链接:https://pan.baidu.com/s/1DuLeBawfoBP62mu0ADNGAA
提取码:qtys
回复

使用道具 举报

gyq_

注册会员

积分
76
20#
发表于 2020-4-3 15:49:46 | 只看该作者
jefferyzhang 发表于 2020-4-3 14:55
试下beta7:
链接:https://pan.baidu.com/s/1DuLeBawfoBP62mu0ADNGAA
提取码:qtys

可以正常转换了,非常感谢!
回复

使用道具 举报

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

本版积分规则

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


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