Pythorch:定义自定义函数

2024-05-23 20:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写我自己的激活函数,但我遇到了一个问题。说矩阵乘法将调用.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}$

Tags: inpyhomeoutputdataliblocalline
3条回答

下面是一个简单激活的例子,它使用内部的火炬激活功能,但可以工作,并可以扩展到自定义。在

import torch as pt
import torch.nn as nn
from torch.nn.modules import Module
# custom activation 
class Act(Module):
def forward(self, z):
    if(do_ratio > 0):
        return nn.functional.dropout(pt.tanh(z), do_ratio)
    else:
        return pt.tanh(z)
act_fn = Act()
model = pt.nn.Sequential(
    pt.nn.Linear(features, n_layer0, bias=enable_bias),
    act_fn,
    pt.nn.Linear(n_layer0, n_layer1, bias=enable_bias),
    act_fn,
    pt.nn.Linear(n_layer1, n_layer2, bias=enable_bias)
    )

您使用的pytorch张量应该包装成torch.Variable对象,如下所示

v=torch.Variable(mytensor)

autograd假设张量被包装在变量中,然后可以使用v.data访问数据。Variable类是Autograd在反向过程中用于执行数值导数的数据结构。确保传递的数据张量被包装在torch.Variable中。在

-月

PyTorch中最基本的元素是Tensor,它与numpy.ndarray等价,唯一的区别是Tensor可以放在GPU上进行任何计算。在

VariableTensor的包装器,它包含三个属性:datagrad和{}。data包含原始的Tensorgrad包含与此Variable相关的某个值的导数/渐变;grad_fn是指向创建此VariableFunction对象的指针。grad_fn属性实际上是{}正常工作的关键,因为PyTorch在每次迭代时都使用这些指针来构建计算图,并相应地对图中的所有Variables执行微分。这不仅仅是关于通过您正在创建的自定义Function对象来正确区分。在

enter image description here

因此,每当您在计算中创建一些需要微分的Tensor,请将其包装为Variable。首先,这将使Tensor能够在调用backward()之后保存生成的导数/渐变值。其次,这有助于autograd建立正确的计算图。在

另一件要注意的事情是,每当您将Variable发送到计算图中时,使用Variable计算的任何值都将自动成为Variable。因此,您不必手动将所有Tensors打包到计算图中。在

您可能想看看this。在

回到您的错误,要找出真正导致问题的原因有点困难,因为您没有显示您的所有代码(如您如何在计算图中使用这个自定义Function)的信息),但是我怀疑最可能发生的是您在一个需要differentiated through,当Pythorch在模型上使用数值梯度检查来查看微分是否正确时,它假设子图中的每个节点都是Variable,因为这是通过该子图进行微分所必需的,然后它试图调用Variabledata属性,很可能是因为值在微分中的某个地方被使用,并且失败了,因为该节点实际上是一个Tensor并且没有data属性。在

相关问题 更多 >