nn.ParameterList的使用及copy的 0nly Tensors created explicitly by the user (graph leaves) support...报错

一、 nn.ParameterList的使用

1、功能:创建一个元素为Parameter的列表,并自动注册到模型的参数列表中

2、示例:

2.1 原代码: 

self.prompt = [nn.Parameter(torch.zeros(1, self.b, width)).cuda() for _ in range(layers)]

目的是创建一个列表,用于向encoder的每一层都加入一个prompt,进行高效参数微调

但这么做存在一个问题,在解释器的视角下,self,prompt视为一个list属性的元素,而不是模型的参数(Parameter)。这不会影响模型前向计算和梯度反向传播,但是当:

(1) 使用copy复制模型时,会报错,即标题二所示。

(2) 当对模型的参数量进行计算时,模型会自动忽视这部分的参数量的计算

即,当涉及到对模型的参数的操作时,都会出现问题。

2.2 修改后的代码:

prompt_list = [nn.Parameter(torch.zeros(1, self.b, width)) for _ in range(layers)]
self.prompt = nn.ParameterList(prompt_list).cuda()

使用nn.ParameterList,即可使self.prompt变为模型参数的一个部分,避免上述问题

2.3 Tips:

相信细心的同学会注意到对于prompt的.cuda()操作由原始代码中在列表推导式中进行,修改到在nn.ParameterList部分进行。这是因为nn.ParameterList只能对Parameter类型的数据生效,否则解释器会报错。

具体来说,

nn.Parameter(torch.zeros(1, self.b, width))可以生成一个Parameter类型的对象:

但是当我们把nn.Parameter的对象使用.cuda()移至GPU时,它的类型就自动变成了torch.tensor:

此时,不再满足nn.ParameterList的使用条件,因此,切记.cuda操作要在使用nn.ParameterList后再进行。

二、使用copy函数,报错RuntimeError: 0nly Tensors created explicitly by the user (graph leaves) support the deepcopy protocol at the moment

如标题一,即可解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值