自定义loss没有继承nn.Cell导致执行报错:ParseStatement] Unsupported statement ‘Try‘.

1.系统环境

硬件环境(Ascend/GPU/CPU): GPU

软件环境:

– MindSpore 版本: 1.7.0

执行模式: 动态图(PYNATIVE_MODE) – Python 版本: 3.7.6

– 操作系统平台: linux

2.报错信息

2.1 问题描述

自定义的loss函数中没有继承nn.Cell,并且没有实现construct函数。导致mindspore不支持。

2.2 报错信息

[mindspore \ccsrc\pipeline \jit\parse\parse . cc :584] ParseStatement] Unsupported statement 'Try'.

2.3 脚本代码

3.根因分析

 从报错信息较难看出具体出错的原因。经过调试发现在FaceLoss函数init中不支持diy_loss函数这样的写法。也需要继承nn.cell同时编写construct函数。

4.补充知识

 从mindspore文档也发现都需要继承nn.cell。

网络基本单元 Cell 当用户需要自定义网络时,需要继承Cell类,并重写__init__方法和construct方法。损失函数、优化器和模型层等本质上也属于网络结构,也需要继承Cell类才能实现功能,同样用户也可以根据业务需求自定义这部分内容。

5.解决方案

解决方案说明:重写diy_loss函数,继承nn.cell同时编写construct函数。

修改后代码:

class diy_loss(nn.Cell):
    def __init__(self,target_emb):
        super(diy_loss, self).__init__()
        self.uniformreal = ops.UniformReal(seed=2)
        self.sum = ops.ReduceSum(keep_dims=False)
        self.norm = nn.Norm(keep_dims=True)
        self.zeroslike = ops.ZerosLike()
        self.concat_op1 = ops.Concat(1)
        self.concat_op2 = ops.Concat(2)
        self.pow = ops.Pow()
        self.reduce_sum = ops.operations.ReduceSum()
        self.target_emb = target_emb
        self.abs = ops.Abs()
        self.reduce_mean = ops.ReduceMean()
        
def construct(self, adversarial_emb,input_emb,mask_tensor): vert_diff = mask_tensor[:, 1:] - mask_tensor[:, :-1] hor_diff = mask_tensor[:, :, 1:] - mask_tensor[:, :, :-1] vert_diff_sq = self.pow(vert_diff, 2) hor_diff_sq = self.pow(hor_diff, 2) A = self.zeroslike(Tensor(self.uniformreal((3, 1, 112)))) B = self.zeroslike(Tensor(self.uniformreal((3, 112, 1)))) vert_pad = self.concat_op1((vert_diff_sq, A)) hor_pad = self.concat_op2((hor_diff_sq, B)) tv_sum = vert_pad + hor_pad tv = ops.functional.sqrt(tv_sum + 1e-5) tv_final_sum = self.sum(tv) tv_loss = (1e-4) * tv_final_sum print("tv_loss:",tv_loss) prod_sum = self.reduce_sum(adversarial_emb * self.target_emb, (1,)) square1 = self.reduce_sum(ops.functional.square(adversarial_emb), (1,)) square2 = self.reduce_sum(ops.functional.square(self.target_emb), (1,)) denom = ops.functional.sqrt(square1) * ops.functional.sqrt(square2) cos_loss = -(prod_sum / denom) print("dis_loss:", cos_loss) return tv_loss+cos_loss 

修改后可以正常运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值