我想写我自己的激活函数,但我遇到了一个问题。说矩阵乘法将调用.data
。我搜索了一下,但没有得到多少有用的信息。任何帮助都将不胜感激。错误信息是
Traceback (most recent call last):
File "defineAutogradFuncion.py", line 126, in <module>
test = gradcheck(argmin, input, eps=1e-6, atol=1e-4)
File "/home/zhaosl/.local/lib/python2.7/site-packages/torch/autograd/gradcheck.py", line 154, in gradcheck
output = func(*inputs)
File "defineAutogradFuncion.py", line 86, in forward
output = output.mm(dismap).squeeze(-1)
File "/home/zhaosl/.local/lib/python2.7/site-packages/torch/autograd/variable.py", line 578, in mm
output = Variable(self.data.new(self.data.size(0), matrix.data.size(1)))
File "/home/zhaosl/.local/lib/python2.7/site-packages/torch/tensor.py", line 374, in data
raise RuntimeError('cannot call .data on a torch.Tensor: did you intend to use autograd.Variable?')
RuntimeError: cannot call .data on a torch.Tensor: did you intend to use autograd.Variable?
^{pr2}$
下面是一个简单激活的例子,它使用内部的火炬激活功能,但可以工作,并可以扩展到自定义。在
您使用的pytorch张量应该包装成
torch.Variable
对象,如下所示autograd假设张量被包装在变量中,然后可以使用
v.data
访问数据。Variable
类是Autograd在反向过程中用于执行数值导数的数据结构。确保传递的数据张量被包装在torch.Variable
中。在-月
PyTorch中最基本的元素是
Tensor
,它与numpy.ndarray
等价,唯一的区别是Tensor
可以放在GPU上进行任何计算。在Variable
是Tensor
的包装器,它包含三个属性:data
、grad
和{data
包含原始的Tensor
;grad
包含与此Variable
相关的某个值的导数/渐变;grad_fn
是指向创建此Variable
的Function
对象的指针。grad_fn
属性实际上是{Variables
执行微分。这不仅仅是关于通过您正在创建的自定义Function
对象来正确区分。在因此,每当您在计算中创建一些需要微分的
Tensor
,请将其包装为Variable
。首先,这将使Tensor
能够在调用backward()
之后保存生成的导数/渐变值。其次,这有助于autograd
建立正确的计算图。在另一件要注意的事情是,每当您将
Variable
发送到计算图中时,使用Variable
计算的任何值都将自动成为Variable
。因此,您不必手动将所有Tensors
打包到计算图中。在您可能想看看this。在
回到您的错误,要找出真正导致问题的原因有点困难,因为您没有显示您的所有代码(如您如何在计算图中使用这个自定义
Function
)的信息),但是我怀疑最可能发生的是您在一个需要differentiated through,当Pythorch在模型上使用数值梯度检查来查看微分是否正确时,它假设子图中的每个节点都是Variable
,因为这是通过该子图进行微分所必需的,然后它试图调用Variable
的data
属性,很可能是因为值在微分中的某个地方被使用,并且失败了,因为该节点实际上是一个Tensor
并且没有data
属性。在相关问题 更多 >
编程相关推荐