<p>PyTorch中最基本的元素是<code>Tensor</code>,它与<code>numpy.ndarray</code>等价,唯一的区别是<code>Tensor</code>可以放在GPU上进行任何计算。在</p>
<p><code>Variable</code>是<code>Tensor</code>的包装器,它包含三个属性:<code>data</code>、<code>grad</code>和{<cd8>}。<code>data</code>包含原始的<code>Tensor</code>;<code>grad</code>包含与此<code>Variable</code>相关的某个值的导数/渐变;<code>grad_fn</code>是指向创建此<code>Variable</code>的<code>Function</code>对象的指针。<code>grad_fn</code>属性实际上是{<cd17>}正常工作的关键,因为PyTorch在每次迭代时都使用这些指针来构建计算图,并相应地对图中的所有<code>Variables</code>执行微分。这不仅仅是关于通过您正在创建的自定义<code>Function</code>对象来正确区分。在</p>
<p><a href="https://i.stack.imgur.com/4uw27.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/4uw27.png" alt="enter image description here"/></a></p>
<p>因此,每当您在计算中创建一些需要微分的<code>Tensor</code>,请将其包装为<code>Variable</code>。首先,这将使<code>Tensor</code>能够在调用<code>backward()</code>之后保存生成的导数/渐变值。其次,这有助于<code>autograd</code>建立正确的计算图。在</p>
<p>另一件要注意的事情是,每当您将<code>Variable</code>发送到计算图中时,使用<code>Variable</code>计算的任何值都将自动成为<code>Variable</code>。因此,您不必手动将所有<code>Tensors</code>打包到计算图中。在</p>
<p>您可能想看看<a href="http://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html" rel="nofollow noreferrer">this</a>。在</p>
<p>回到您的错误,要找出真正导致问题的原因有点困难,因为您没有显示您的所有代码(如您如何在计算图中使用这个自定义<code>Function</code>)的信息),但是我怀疑最可能发生的是您在一个需要differentiated through,当Pythorch在模型上使用数值梯度检查来查看微分是否正确时,它假设子图中的每个节点都是<code>Variable</code>,因为这是通过该子图进行微分所必需的,然后它试图调用<code>Variable</code>的<code>data</code>属性,很可能是因为值在微分中的某个地方被使用,并且失败了,因为该节点实际上是一个<code>Tensor</code>并且没有<code>data</code>属性。在</p>