我在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, "''") + '" /> ');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="frm"></div>
关于我为什么做错的任何建议?
答案 0 :(得分:1)
确保所有继承nn.Module
的对象也调用.cuda()
。确保在向任何张量传递之前调用。 (基本上在训练之前)
例如,(我猜你的encoder
和decoder
就是这样的对象),请在致电train()
之前执行此操作。
encoder = encoder.cuda()
decoder = decoder.cuda()
这可以确保所有模型的参数都在cuda内存中初始化。
一般情况下,每当出现此类错误时,
RuntimeError:Gradients不是CUDA张量
某处,(从模型创建到定义输入,最后将输出提供给损失函数),您错过了将Variable
对象指定为GPU内存。您将完成模型中的每个步骤,验证所有Variable
对象是否在GPU内存中。
此外,您不必在输出上调用.cuda()
。鉴于输入在gpu的内存中,所有操作也都发生在gpu的内存中,输出也是如此。