4 votes

Comment utiliser le paramètre groupes dans la fonction PyTorch conv2d ?

J'essaie de calculer une image de gradient par canal dans PyTorch. Pour ce faire, je veux effectuer une convolution 2D standard avec un filtre de Sobel sur chaque canal d'une image. J'utilise la fonction torch.nn.functional.conv2d pour cette fonction

Dans mon code d'exemple minimum fonctionnel ci-dessous, j'obtiens une erreur :

import torch
import torch.nn.functional as F

filters = torch.autograd.Variable(torch.randn(1,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1)

RuntimeError : Étant donné groups=1, weight[1, 1, 3, 3], donc attendu input[1, 3, 10, 10] pour avoir 1 canaux, mais j'ai obtenu 3 canaux à la place.

Cela suggère que groups doit être de 3. Cependant, lorsque je fais groups=3 j'obtiens une erreur différente :

import torch
import torch.nn.functional as F

filters = torch.autograd.Variable(torch.randn(1,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1, groups=3)

RuntimeError : argument invalide 4 : o /usr/local/src/pytorch/torch/lib/TH/generic/THTensor.c:440

Lorsque je vérifie ce bout de code dans la classe THTensor, il fait référence à un ensemble de contrôles de dimension, mais je ne sais pas où je me trompe.

Que signifie cette erreur ? Comment puis-je effectuer la convolution que je souhaite réaliser avec cette conv2d fonction ? Je crois que je comprends mal la groups paramètre.

6voto

entrophy Points 1471

Si vous voulez appliquer une convolution par canal, alors votre out-channel doit être le même que celui de votre in-channel . Ceci est attendu, étant donné que chacun de vos canaux d'entrée crée un canal de sortie distinct auquel il correspond.

En bref, cela fonctionnera

import torch
import torch.nn.functional as F

filters = torch.autograd.Variable(torch.randn(3,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1, groups=3)

alors que les filtres de taille (2, 1, 3, 3) o (1, 1, 3, 3) ne fonctionnera pas.

En outre, vous pouvez également faire votre out-channel un multiple de in-channel . Cela fonctionne dans les cas où vous voulez avoir plusieurs filtres de convolution pour chaque canal d'entrée.

Cependant, cela n'a de sens que si c'est un multiple. Sinon, pytorch se rabat sur le multiple le plus proche, un nombre inférieur à celui que vous avez spécifié. C'est encore une fois un comportement attendu. Par exemple, un filtre de taille (4, 1, 3, 3) o (5, 1, 3, 3) Le résultat est une out-channel de taille 3.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X