Don';t在PyTorch中包含梯度计算操作

Don';t在PyTorch中包含梯度计算操作,pytorch,autograd,Pytorch,Autograd,我有一个自定义图层。将该层称为“高斯” class Gaussian(nn.Module): def __init__(): super(Gaussian, self).__init__() #@torch.no_grad def forward(self, x): _r = np.random.randint(0, x.shape[0], x.shape[0]) _sample = x[_r] _d = (_sample - x)

我有一个自定义图层。将该层称为“高斯”

class Gaussian(nn.Module):
  def __init__():  
    super(Gaussian, self).__init__()
 
 #@torch.no_grad     
  def forward(self, x):
    _r = np.random.randint(0, x.shape[0], x.shape[0]) 
    _sample = x[_r] 
    _d = (_sample - x)
    _number = int(self.k * x.shape[0])
    x[1: _number] = x[1: _number] + (self.n * _d[1: _number]).detach()

    return x
上述类别将按如下方式使用:

cnn_model = nn.Sequential(nn.Conv2d(1, 32, 5), Gaussian(), nn.ReLU(), nn.Conv2d(32, 32, 5))
如果输入是
x
,我希望
x
的梯度排除高斯模块中存在的操作,但包括神经网络其他层(nn.Conv2d等)中的计算

最后,我的目标是使用高斯模块来执行计算,但梯度计算中不应包括该计算

我试着做到以下几点:

  • 使用@torch.no_grad高于高斯函数的正向方法

  • 在高斯模块中的每次操作后使用“分离”:

    x[1:\u number]=x[1:\u number]+(self.n*\u d[1:\u number]).detach()
    以及类似的其他操作

  • 在forward方法中使用y=x.detach()。对y执行操作,然后对x.data=y执行操作

  • 上述方法正确吗


    附言:问题编辑

    当有参数需要优化时,梯度计算有意义


    如果您的模块没有任何参数,则不会存储渐变,因为没有可关联的参数。

    您不能。如果其他操作修改x。你会破坏计算。所以我想,在这种情况下,我不能使用nn.Sequential,而是应该使用其他方法来定义我的网络,对吗?你想实现什么?如果其他操作不修改x,则可以使用ex.y=x.detach().item()并在y上执行操作。否则,它将违反autograd的逻辑,其他方法也不会帮助您。我想要实现的是,在x上执行操作(属于模块“高斯”的一部分),该操作不应影响为x存储的梯度[存储的梯度是从高斯模块中不存在的其他操作中获得的]。因此,如果我在y上执行操作(其中y在高斯模块内初始化为y=x.detach()),然后我将其值传递回来,例如x.data=y,这不会因为对y的操作而在x上添加任何梯度,对吧?我的神经网络有参数,所以我需要存储梯度。但是是的,在模块中,我没有定义任何nn.parameters,但这是否确保了梯度不会在模块中计算?考虑到模块是一组具有梯度的参数,梯度会在每个模块中计算和存储。由于并没有定义的参数(例如使用
    nn.parameters
    ),所以不会为您的模块计算梯度。非常感谢。如果可能的话,请提供pytorch文档中的任何参考资料,以便我了解更多。检查pytorch中的梯度力学。关于这一点,这里有一整节。此外,检查如何训练DNN模型的理论。关于梯度的事情并不是Pytork所特有的,它只是根据理论和反向传播算法应该做的事情。