PyTorch RuntimeError:渐变不是CUDA张量

时间:2017-07-20 06:14:02

标签: pytorch

我在seq on seq on characters和feed to LSTM,并使用注意解码为单词时遇到以下错误。前向传播很好,但在计算loss.backward()时,我收到以下错误。

  

RuntimeError:Gradients不是CUDA张量

我的train()函数如下。

var a = 'M=1234&b=sdaks&c=sdkssad&strXML=<a><b mode="abc"><c>string content</c></b></a>'

var b = a.split('&');
var frm = $(".frm")
$.each(b, function(index) {
  var paramsV = b[index].split(/=(.+)/);
  frm.append('<input type="" name="' + paramsV[0] + '" value="' + paramsV[1].replace(/\"/g, "''") + '" /> ');
});

Full Stack Trace就在这里。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="frm"></div>

关于我为什么做错的任何建议?

1 个答案:

答案 0 :(得分:1)

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

例如,(我猜你的encoderdecoder就是这样的对象),请在致电train()之前执行此操作。

encoder = encoder.cuda()
decoder = decoder.cuda()

这可以确保所有模型的参数都在cuda内存中初始化。

修改

一般情况下,每当出现此类错误时,

  

RuntimeError:Gradients不是CUDA张量

某处,(从模型创建到定义输入,最后将输出提供给损失函数),您错过了将Variable对象指定为GPU内存。您将完成模型中的每个步骤,验证所有Variable对象是否在GPU内存中。

此外,您不必在输出上调用.cuda()。鉴于输入在gpu的内存中,所有操作也都发生在gpu的内存中,输出也是如此。