Cela dépend de ce que vous entendez par "non différentiable". La première définition qui a du sens ici est que PyTorch ne sait pas comment calculer les dégradés. Si vous essayez néanmoins de calculer des dégradés, cela provoquera une erreur. Les deux scénarios possibles sont les suivants:
a) Vous utilisez une opération PyTorch personnalisée pour laquelle des gradients n'ont pas été implémentés, par ex. torch.svd()
. Dans ce cas, vous obtiendrez un TypeError
:
import torch
from torch.autograd import Function
from torch.autograd import Variable
A = Variable(torch.randn(10,10), requires_grad=True)
u, s, v = torch.svd(A) # raises TypeError
b) Vous avez mis en place votre propre opération, mais n'a pas défini backward()
. Dans ce cas, vous obtiendrez un NotImplementedError
:
class my_function(Function): # forgot to define backward()
def forward(self, x):
return 2 * x
A = Variable(torch.randn(10,10))
B = my_function()(A)
C = torch.sum(B)
C.backward() # will raise NotImplementedError
La deuxième définition qui fait sens est « mathématiquement non-différentiables ». Clairement, une opération mathématiquement non différentiable ne doit pas avoir une méthode backward()
implémentée ou un sous-gradient sensible. Considérons par exemple torch.abs()
dont backward()
méthode renvoie le 0 à 0 sous-gradient:
A = Variable(torch.Tensor([-1,0,1]),requires_grad=True)
B = torch.abs(A)
B.backward(torch.Tensor([1,1,1]))
A.grad.data
Pour ces cas, vous devez vous référer à la documentation PyTorch directement et creuser la méthode backward()
de l'opération respective directement.
De rien. Impossible d'ouvrir le lien malheureusement. – mexmex
J'ai supprimé la question parce que je l'ai résolu. Mais pouvez-vous m'aider dans cette question - https://stackoverflow.com/questions/44580450/cuda-vs-dataparallel-why-the-difference? –