return回来的参数承接问题导致执行报错:AttributeError: ‘tuple‘ object has no attribute ‘asnumpy‘

1.系统环境

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

软件环境:

– MindSpore 版本: 1.7.0

执行模式: 静态图(GRAPH) – Python 版本: 3.7.6

– 操作系统平台: linux

2.报错信息

2.1 问题描述

调用函数return时只用了一个参数来承接return回来的参数,由于return有两个参数,导致承接的参数类型出现问题。。

2.2 报错信息

AttributeError: 'tuple' object has no attribute 'asnumpy'

2.3 脚本代码

 def train(self,attack_method):

        if attack_method == "non-target attack":
            LOSS = FaceLoss_no_target_attack(self.target_emb)
        if attack_method == "target_attack":
            LOSS = FaceLoss_target_attack(self.target_emb)
        net_with_criterion = MyWithLossCell(self.resnet, LOSS,self.input_tensor)
        train_net = TrainOneStepCell(net_with_criterion, self.opt)

        for i in range(1):
            self.mask_tensor = Tensor(self.pm)
            loss = train_net(self.mask_tensor)
            print("epoch %d ,loss: %f \n " % (i, loss.asnumpy().item()))
复制

3.根因分析

 看报错信息'tuple'对象没有属性'asnumpy'。说明loss的类型有问题。

 调试发现,loss的tuple中有两个。 :  

查看具体的TrainOneStepCell函数,发现return有两个参数。而我们只用了一个loss参数进行承接,导致loss包含了两个参数。导致打印loss值时报了错误。

4.解决方案

解决方案说明:增加一个参数来承接return回来的参数。

修改后代码:

 def train(self,attack_method):

        if attack_method == "non-target attack":
            LOSS = FaceLoss_no_target_attack(self.target_emb)
        if attack_method == "target_attack":
            LOSS = FaceLoss_target_attack(self.target_emb)
        net_with_criterion = MyWithLossCell(self.resnet, LOSS,self.input_tensor)
        train_net = TrainOneStepCell(net_with_criterion, self.opt)

        for i in range(1):
            self.mask_tensor = Tensor(self.pm)
            grads, loss = train_net(self.mask_tensor)
            print("epoch %d ,loss: %f \n " % (i, loss.asnumpy().item()))复制

结果loss值可以正常打印。

你可能感兴趣的:(python,深度学习,机器学习)