PyTorch运行时错误:渐变不是CUDA张量

PyTorch运行时错误:渐变不是CUDA张量,pytorch,Pytorch,我在对字符执行seq-to-seq操作并将其馈送到LSTM,并使用注意力解码到单词时,出现以下错误。正向传播很好,但在计算loss.backward()时,我得到了以下错误 运行时错误:渐变不是CUDA张量 我的train()函数如下所示 def序列(输入批次、输入批次长度、目标批次、目标批次长度、批次大小): #两个优化器的零梯度 encoderchar\u优化器.zero\u grad() 编码器\优化器。零\梯度() 解码器\u优化器.zero\u grad() 编码器输入=变量(火炬浮动

我在对字符执行seq-to-seq操作并将其馈送到LSTM,并使用注意力解码到单词时,出现以下错误。正向传播很好,但在计算loss.backward()时,我得到了以下错误

运行时错误:渐变不是CUDA张量

我的train()函数如下所示

def序列(输入批次、输入批次长度、目标批次、目标批次长度、批次大小):
#两个优化器的零梯度
encoderchar\u优化器.zero\u grad()
编码器\优化器。零\梯度()
解码器\u优化器.zero\u grad()
编码器输入=变量(火炬浮动张量(透镜(输入批次),批次大小,500))
对于ix,枚举中的w(输入批次):
w=w.连续()视图(15,批次大小)
重塑的_输入_长度=[x[ix]表示输入中的x_批次_长度]35;[15,…30倍]*128
如果使用_CUDA:
w=w.cuda()
#整形输入长度=变量(torch.LongTensor(整形输入长度)).cuda()
hidden_all,output=encoderchar(w,整形输入长度)
编码器输入[ix]=输出.转置(0,1).continuous()视图(批处理大小,-1)
如果使用_CUDA:
编码器\输入=编码器\输入.cuda()
临时目标批次长度=[15]*批次大小
编码器\隐藏\全部,编码器\输出=编码器(编码器\输入,目标\批量\长度)
解码器输入=变量(火炬长传感器([SOS令牌]*批量大小))
解码器\u隐藏=编码器\u输出
最大目标长度=最大(临时目标长度)
所有解码器输出=变量(火炬零点(最大目标长度、批次大小、解码器输出大小))
#将新变量移动到CUDA
如果使用_CUDA:
解码器\输入=解码器\输入.cuda()
all_decoder_outputs=所有_decoder_outputs.cuda()
target\u batch=target\u batch.cuda()
#一次一个时间步运行解码器
对于范围内的t(最大目标长度):
解码器输出,解码器隐藏,解码器附件=解码器(
解码器输入、解码器隐藏、编码器隐藏
)
所有解码器输出[t]=解码器输出
解码器_输入=目标_批处理[t]#下一个输入是当前目标
如果使用_CUDA:
解码器\输入=解码器\输入.cuda()
#损耗计算与反向传播
损失=掩蔽的交叉熵(
所有解码器输出。转置(0,1)。连续()
target#batch.transpose(0,1).continuous(),#->batch x seq
目标批次长度
)
loss.backward()
#剪辑梯度范数
ecc=torch.nn.utils.clip\u grad\u norm(encoderchar.parameters(),clip)
ec=torch.nn.utils.clip\u grad\u norm(encoder.parameters(),clip)
dc=torch.nn.utils.clip\u grad\u norm(decoder.parameters(),clip)
#使用优化器更新参数
encoderchar_优化器.step()
编码器\优化器。步骤()
解码器\优化器.step()
返回损失。数据[0],ec,dc
这里有完整的堆栈跟踪。
运行时错误回溯(最近一次调用)
在()
11数据目标批次索引=变量(火炬长传感器(数据目标批次索引))。转置(0,1)
12#发送数据进行培训
--->13损失,ar1,ar2=列车(数据输入批次索引,数据输入批次长度,数据目标批次索引,数据目标批次长度,批次大小)
14
15#跟踪损失
列车内(输入批次、输入批次长度、目标批次、目标批次长度、批次大小)
54目标批次长度
55     )
--->56.损失向后()
57
58#剪辑梯度规范
/home/ubuntu/anaconda3/envs/tensorflow/lib/python3.6/site-packages/torch/autograd/variable.py向后(self、gradient、retain_变量)
144'或带有梯度w.r.t.变量')
145 gradient=self.data.new()
-->146 self.\u执行\u引擎。向后运行((self,),(gradient,),保留变量)
147
148 def寄存器挂钩(自身,挂钩):
/home/ubuntu/anaconda3/envs/tensorflow/lib/python3.6/site-packages/torch/autograd/function.py in\u do\u backward(self、gradients、retain\u变量)
207 def_do_backward(自、梯度、保留变量):
208 self.retain\u变量=retain\u变量
-->209结果=super(嵌套定义、自身)。\u do\u向后(梯度、保留变量)
210如果不保留变量:
211 del self.\u嵌套\u输出
/home/ubuntu/anaconda3/envs/tensorflow/lib/python3.6/site-packages/torch/autograd/function.py向后(self,*渐变)
215 def向后(自,*梯度):
216嵌套的\u渐变=\u取消平滑(渐变,自嵌套的\u输出)
-->217结果=自向后扩展(*嵌套梯度)
218返回元组(_iter_None_张量(结果))
219
/home/ubuntu/anaconda3/envs/tensorflow/lib/python3.6/site-packages/torch/nn//u functions/rnn.py向后扩展(self,grad\u output,grad\u hy)
314年级,
315梯度输入,
-->316梯度(hx)
317
318如果有(自身需要输入等级[1:]):
/home/ubuntu/anaconda3/envs/tensorflow/lib/python3.6/site-packages/torch/backends/cudnn/rnn.py反向梯度(fn,输入,hx,重量,输出,梯度输出,梯度hy,梯度输入,梯度hx)
371隐藏的大小,dcy.size())
372如果不是dhy.is_cuda或不是dy.is_cuda或(dcy不是None,也不是dcy.is_cuda):
-->373 raise RUNTIMERROR('梯度不是CUDA张量')
374
375检查_错误(cudnn.lib.cudnnrnbackarddata(
运行时错误:渐变不是CUDA张量

关于我做错了什么有什么建议吗?

确保继承
nn.Module
的所有对象也调用它们的
.cuda()
。在向它们传递任何张量之前,确保调用它们。(基本上在训练之前)

例如,(我猜你的encoder = encoder.cuda() decoder = decoder.cuda()