参数类型错误导致优化器执行报错:TypeError: For ‘Optimizer‘, the argument parameters must be Iterable type

在MindSpore1.7.0版本的GPU环境中,遇到TypeError,因为尝试将非可迭代的Tensor对象传给Optimizer。解决方案是将Tensor转换为Parameter并封装在list中,使参数变为可迭代,从而能被Adam优化器接受。修改后代码成功运行。
摘要由CSDN通过智能技术生成

1.系统环境

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

软件环境:

– MindSpore 版本: 1.7.0

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

– 操作系统平台: linux

2.报错信息

2.1 问题描述

将需要优化的参数放入优化器中,直接将Tensor类型的参数放入,由于优化器需要的数据类型是Iterable,导致执行报错。

2.2 报错信息

TypeError: For 'Optimizer', the argument parameters must be Iterable type, but got .

2.3 脚本代码

class Attack(object):

def __init__(self,input_img,target_img,seed=None): if (seed != None): np.random.seed(seed) self.MEAN = Tensor([0.485, 0.456, 0.406]) self.STD = Tensor([0.229, 0.224, 0.225]) self.LOSS = Tensor(0) self.expand_dims = mindspore.ops.ExpandDims() self.imageize = ToPILImage() self.tensorize = ToTensor() self.normalize = P.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) self.resnet = get_net() self.input_tensor = Tensor(self.normalize(self.tensorize(input_img))) self.target_tensor = Tensor(self.normalize(self.tensorize(target_img))) mp.imsave('./outputs/input图像.jpg', np.transpose(self._reverse_norm(self.input_tensor).asnumpy(), (1, 2, 0))) mp.imsave('./outputs/target图像.jpg', np.transpose(self._reverse_norm(self.target_tensor).asnumpy(), (1, 2, 0))) self.input_emb = self.resnet(self.expand_dims(self.input_tensor,0)) self.target_emb = self.resnet(self.expand_dims(self.target_tensor,0)) self.adversarial_emb = None self.mask_tensor = self._create_mask(input_img) self.ref = self.mask_tensor self.opt = nn.Adam(self.mask_tensor, learning_rate=0.01, weight_decay=0.0001) 复制

复制

3.根因分析

 看报错信息,翻译意思是实参参数必须是Iterable类型,即是可迭代的。

 调试发现self.mask_tensor是Tensor类型,不能进行迭代。

 通过查看文档,可以通过Parameter()更好的对训练参数进行设置。同时Python里有大量内置的iterable类型,如: list,str,tuple,dict等,可以将参数包装成list实现可迭代化。

4.解决方案

解决方案说明:把self.mask_tensor改成list类型:[Parameter(self.mask_tensor)],来实现可迭代化。

修改后代码:

class Attack(object):

def __init__(self,input_img,target_img,seed=None):

    if (seed != None): np.random.seed(seed)
    self.MEAN = Tensor([0.485, 0.456, 0.406])
    self.STD = Tensor([0.229, 0.224, 0.225])
    self.LOSS = Tensor(0)
    self.expand_dims = mindspore.ops.ExpandDims()
    self.imageize = ToPILImage()
    self.tensorize = ToTensor()
    self.normalize = P.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    self.resnet = get_net()
    self.input_tensor = Tensor(self.normalize(self.tensorize(input_img)))
    self.target_tensor = Tensor(self.normalize(self.tensorize(target_img)))
    mp.imsave('./outputs/input图像.jpg', np.transpose(self._reverse_norm(self.input_tensor).asnumpy(), (1, 2, 0)))
    mp.imsave('./outputs/target图像.jpg', np.transpose(self._reverse_norm(self.target_tensor).asnumpy(), (1, 2, 0)))


    self.input_emb = self.resnet(self.expand_dims(self.input_tensor,0))
    self.target_emb = self.resnet(self.expand_dims(self.target_tensor,0))
    self.adversarial_emb = None
    self.mask_tensor = self._create_mask(input_img)
    self.ref = self.mask_tensor
    self.opt = nn.Adam([Parameter(self.mask_tensor)], learning_rate=0.01, weight_decay=0.0001)

修改后程序正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值