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