Toybrick

torch模型转换rknn模型加载中出错 toolkit: 1.7.3

toytoyTAC

注册会员

积分
75
楼主
发表于 2023-7-13 18:02:39    查看: 3465|回复: 2 | [复制链接]    打印 | 只看该作者
本帖最后由 toytoyTAC 于 2023-7-13 18:04 编辑

1. 首先出现 E NotImplementedError: The following operators are not implemented: ['aten::reciprocal']
2. 因为模型中有用到GeM,把p设成了1/3,pow(self.p),之后出现load pytorch报错E ValueError: need more than 1 value to unpack
...
...
D Process clip_at_1417_176_176 ...
D RKNN output shape(clipbyvalue): (0 10 10 512)
D Tensor @clip_at_1417_176_176ut0 type: float32
E Catch exception when loading pytorch model: /home/kerry/test/project0710/models/torch_models/743newtest.pt!
E Traceback (most recent call last):
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 437, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 437, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 437, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer
E   [Previous line repeated 1 more time]
E   File "rknn/base/RKNNlib/RKNNnetbuilder.py", line 435, in rknn.base.RKNNlib.RKNNnetbuilder.RKNNNetBuilder.build_layer

E ValueError: need more than 1 value to unpack
...
...
3. 尝试把GeM中的pool_p4层拿掉后可以成功load,但是转rknn后精度下降比较明显。

回复

使用道具 举报

jefferyzhang

版主

积分
13574
沙发
发表于 2023-7-14 09:16:49 | 只看该作者
'aten::reciprocal' 这个算子不支持,你可以替换或者把输出节点放在这个操作之前,后处理时候再去实现他
回复

使用道具 举报

toytoyTAC

注册会员

积分
75
板凳
 楼主| 发表于 2023-7-14 14:34:43 | 只看该作者
模型的backbone是resnet50,后面接的GeM

这是一开始的GeM:
def gem(x, p=3, eps=1e-6):
    return F.avg_pool2d(x.clamp(min=eps).pow(p), (x.size(-2), x.size(-1))).pow(1.0 / p)

class GeM(nn.Module):
    def __init__(self, p=3, eps=1e-6):
        super(GeM, self).__init__()
        self.p = nn.Parameter(torch.ones(1) * p)
        self.eps = eps
    def forward(self, x):
        return gem(x, p=self.p, eps=self.eps)[:,:,0,0]
    def __repr__(self):
        return (
            self.__class__.__name__
            + f"(p={self.p.data.tolist()[0]:.4f}, eps={str(self.eps)})"
        )

为了避免reciprocal这个算子改成了下面这样:
def gem(x, p=1/3, eps=1e-6):
    return F.avg_pool2d(x.clamp(min=eps).pow(p), (x.size(-2), x.size(-1))).pow(p)

class GeM(nn.Module):
    def __init__(self, p=1/3, eps=1e-6):
        super(GeM, self).__init__()
        self.p = nn.Parameter(torch.ones(1) * p)
        self.eps = eps
    def forward(self, x):
        return gem(x, p=self.p, eps=self.eps)[:,:,0,0]
    def __repr__(self):
        return (
            self.__class__.__name__
            + f"(p={self.p.data.tolist()[0]:.4f}, eps={str(self.eps)})"
        )

大佬帮忙看看是不是修改GeM出现了问题?
回复

使用道具 举报

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

本版积分规则

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


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