Toybrick

pytorch一个模型转化过程中的报错

luxiaofei

高级会员

积分
654
楼主
发表于 2020-3-12 16:59:42    查看: 20736|回复: 16 | [复制链接]    打印 | 只看该作者
本帖最后由 luxiaofei 于 2020-3-12 17:03 编辑

pytorch等版本都是正确的,可以运行官方pytorch转rknn的demo

出错部分的代码:
net = SiamRPN()
net.load_state_dict(torch.load(join(realpath(dirname(__file__)), 'SiamRPNVOT.model')))
net.eval()

net2 = torch.jit.trace(net, (torch.Tensor(1,3,271,271),torch.Tensor(1,3,127,127)))
net2.save('./net2.pt')

model = './net2.pt'
input_size_list = [[3, 271, 271], [3, 127, 127]]

rknn = RKNN()

# pre-process config
print('--> config model')
rknn.config(channel_mean_value='0 0 0 1#0 0 0 1', reorder_channel='0 1 2#0 1 2')
print('done')

# Load pytorch model
print('--> Loading model')
ret = rknn.load_pytorch(model=model, input_size_list=input_size_list)
if ret != 0:
    print('Load pytorch model failed!')
    exit(ret)
print('done')

# Build model
print('--> Building model')
ret = rknn.build(do_quantization=False)
if ret != 0:
    print('Build pytorch failed!')
    exit(ret)
print('done')

报错部分的信息:
--> Loading model
/usr/local/lib/python3.6/dist-packages/onnx_tf/common/__init__.py:87: UserWarning: FrontendHandler.get_outputs_names is deprecated. It will be removed in future release.. Use node.outputs instead.
  warnings.warn(message)
./net2.pt ********************
WARNING: Token 'COMMENT' defined, but not used
WARNING: There is 1 unused token
Syntax error in input! LexToken(<,'<',5,162)
done
--> Building model
W Genreate input meta fail, please check model.
W External input meta file "/tmp/tmpekkbyfa9/net2_inputmeta.yml" is not exists.
Traceback (most recent call last):
  File "/home/xiaofei/PycharmProjects/DaSiam_0311/demo.py", line 43, in <module>
    ret = rknn.build(do_quantization=False)
  File "/usr/local/lib/python3.6/dist-packages/rknn/api/rknn.py", line 238, in build
    ret = self.rknn_base.build(do_quantization=do_quantization, dataset=dataset, pack_vdata=pre_compile, batch_size=rknn_batch_size)
  File "rknn/api/rknn_base.py", line 719, in rknn.api.rknn_base.RKNNBase.build
  File "rknn/api/rknn_base.py", line 2249, in rknn.api.rknn_base.RKNNBase._generate_inputmeta
IndexError: list index out of range


pytorch模型的定义:
class SiamRPN(nn.Module):
    def __init__(self, size=1, feature_out=256, anchor=5):
        configs = [3, 96, 256, 384, 384, 256]
        configs = list(map(lambda x: 3 if x==3 else x*size, configs))
        feat_in = configs[-1]
        super(SiamRPN, self).__init__()
        self.featureExtract = nn.Sequential(
            nn.Conv2d(configs[0], configs[1] , kernel_size=11, stride=2),
            nn.BatchNorm2d(configs[1]),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[1], configs[2], kernel_size=5),
            nn.BatchNorm2d(configs[2]),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[2], configs[3], kernel_size=3),
            nn.BatchNorm2d(configs[3]),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[3], configs[4], kernel_size=3),
            nn.BatchNorm2d(configs[4]),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[4], configs[5], kernel_size=3),
            nn.BatchNorm2d(configs[5]),
        )#ALexNet

        self.anchor = anchor
        self.feature_out = feature_out

        self.conv_r1 = nn.Conv2d(feat_in, feature_out*4*anchor, 3)
        self.conv_r2 = nn.Conv2d(feat_in, feature_out, 3)
        self.conv_cls1 = nn.Conv2d(feat_in, feature_out*2*anchor, 3)
        self.conv_cls2 = nn.Conv2d(feat_in, feature_out, 3)
        self.regress_adjust = nn.Conv2d(4*anchor, 4*anchor, 1)

        self.r1_kernel = []
        self.cls1_kernel = []


    def forward(self, x,z):
        z_f = self.featureExtract(z)
        r1_kernel_raw = self.conv_r1(z_f)
        cls1_kernel_raw = self.conv_cls1(z_f)
        kernel_size = r1_kernel_raw.data.size()[-1]
        self.r1_kernel = r1_kernel_raw.view(self.anchor*4, self.feature_out, kernel_size, kernel_size)
        self.cls1_kernel = cls1_kernel_raw.view(self.anchor*2, self.feature_out, kernel_size, kernel_size)

        x_f = self.featureExtract(x)
        return self.regress_adjust(F.conv2d(self.conv_r2(x_f), self.r1_kernel)), \
               F.conv2d(self.conv_cls2(x_f), self.cls1_kernel)



回复

使用道具 举报

luxiaofei

高级会员

积分
654
沙发
 楼主| 发表于 2020-3-12 17:00:34 | 只看该作者
本帖最后由 luxiaofei 于 2020-3-12 17:06 编辑

我用论坛的代码块结果发出来都是乱码,所以就直接把代码发在正文里了。
模型载入和转换都是按照demo来的,找不出是哪里的问题。但loading_model的时候有一句
Syntax error in input! LexToken(<,'<',5,162)
这句话在官方demo的输出中没有见过,不知道是什么error?和下一步build_model报错退出有关系吗


还有就是我定义的pytorch的网络模型有问题吗?是继承了nn.module的子类,有两个输入两个输出,
回复

使用道具 举报

luxiaofei

高级会员

积分
654
板凳
 楼主| 发表于 2020-3-12 17:10:14 | 只看该作者
pytorch进行网络推理时,
    delta, score = net(x_crop,z)
输入x_crop的尺寸[1,3,271,271],z的尺寸[1,3,127,127],输出delta的尺寸[1,20,19,19],score的尺寸[1,10,19,19]
是可以得到结果。搞不懂为啥子转换不了,麻烦版主看看
回复

使用道具 举报

jefferyzhang

版主

积分
12953
地板
发表于 2020-3-12 17:20:42 | 只看该作者
问题我也上报给NPU部门了,方便的话可以提供下模型+转换脚本,便于他们复现问题
回复

使用道具 举报

luxiaofei

高级会员

积分
654
5#
 楼主| 发表于 2020-3-12 17:26:24 | 只看该作者
jefferyzhang 发表于 2020-3-12 17:20
问题我也上报给NPU部门了,方便的话可以提供下模型+转换脚本,便于他们复现问题 ...

好的,模型大于10Mb了论坛好像不能上传,有邮箱吗?我把模型和代码发到您邮箱里?
回复

使用道具 举报

jefferyzhang

版主

积分
12953
6#
发表于 2020-3-12 17:37:10 | 只看该作者
luxiaofei 发表于 2020-3-12 17:26
好的,模型大于10Mb了论坛好像不能上传,有邮箱吗?我把模型和代码发到您邮箱里? ...

发百度网盘给链接就可以。
回复

使用道具 举报

luxiaofei

高级会员

积分
654
7#
 楼主| 发表于 2020-3-12 18:06:15 | 只看该作者
jefferyzhang 发表于 2020-3-12 17:37
发百度网盘给链接就可以。

链接:https://pan.baidu.com/s/1wK-fXX1fxtOuaxIGjlOtwQ
提取码:h6td
回复

使用道具 举报

christian

注册会员

积分
132
8#
发表于 2020-3-14 17:03:19 | 只看该作者
你好,这个问题有解吗?我也遇到了,版本一致,demo运行也正常。
回复

使用道具 举报

jefferyzhang

版主

积分
12953
9#
发表于 2020-3-17 11:10:07 | 只看该作者
问题将在1.4.0版本中解决,1.3.0中不支持conv2d的weight为另外一个卷积的输出。
回复

使用道具 举报

luxiaofei

高级会员

积分
654
10#
 楼主| 发表于 2020-3-17 14:17:33 | 只看该作者
jefferyzhang 发表于 2020-3-17 11:10
问题将在1.4.0版本中解决,1.3.0中不支持conv2d的weight为另外一个卷积的输出。

1.4.0版本大概什么时候推出啊老哥?
回复

使用道具 举报

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

本版积分规则

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


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