# 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. 根因分析**

![](figures/1-106.png)

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

![](figures/2-107.png)

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

![](figures/3-108.png)

查看具体的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值可以正常打印。

