J'essaie de construire un réseau neuronal mais je ne peux pas comprendre où je me trompe avec la couche de mise en commun maximale.

    self.embed1 = nn.Embedding(256, 8)
    self.conv_1 = nn.Conv2d(1, 64, (7,8), padding = (0,0))
    self.fc1 = nn.Linear(64, 2)

def forward(self,x):

    import pdb; pdb.set_trace()
    x = self.embed1(x) #input a tensor of ([1,217]) output size: ([1, 217, 8]) 
    x = x.unsqueeze(0) #conv lay needs a tensor of size (B x C x W x H) so unsqueeze here to make ([1, 1, 217, 8])
    x = self.conv_1(x) #creates 64 filter of size (7, 8).Outputs ([1, 64, 211, 1]) as 6 values lost due to not padding. 

    x = torch.max(x,0) #returning max over the 64 columns. This returns a tuple of length 2 with 64 values in each att, the max val and indices.
    x = x[0] #I only need the max values. This returns a tensor of size ([64, 211, 1])
    x = x.squeeze(2) #linear layer only wants the number of inputs and number of outputs so I squeeze the tensor to ([64, 211])
    x = self.fc1(x) #Error Size mismatch (M1: [64 x 211] M2: [64 x 2])

Je comprends pourquoi la couche linéaire n'accepte pas le 211, mais je ne comprends pas pourquoi mon tenseur après un maximum sur les colonnes n'est pas 64 x 2.

0
qz_99 7 mars 2019 à 12:34

3 réponses

Meilleure réponse

Vous utilisez torch.max renvoie deux sorties : la valeur max le long de dim=0 et le argmax le long de cette dimension. Ainsi, vous devez sélectionner uniquement la première sortie. (vous pouvez envisager d'utiliser le regroupement maximal adaptatif pour cette tâche).

Votre couche linéaire s'attend à ce que son entrée ait une dim 64 (c'est-à-dire un tenseur en forme de batch_size-by-64). Cependant, il semble que votre x[0] soit de forme 13504x1 - certainement pas 64.

Voir ce fil de discussion par exemple.

0
Shai 7 mars 2019 à 11:05

Si je devine correctement vos intentions, votre erreur est que vous utilisez torch.max pour le maxpooling 2d, au lieu de torch.nn.functional.max_pool2d. Le premier se réduit sur une dimension de tenseur (par exemple sur toutes les cartes de caractéristiques ou toutes les lignes horizontales), tandis que le second se réduit dans chaque voisinage spatial carré dans le [h, w] plan d'un tenseur [batch, features, h, w].

0
Jatentaki 7 mars 2019 à 10:13

Au lieu de cela:

  x = x.squeeze(2)

Vous pouvez le faire à la place:

  x = x.view(-1, 64) # view will now correctly resize it to [64 x 2]

Vous pouvez considérer la vue comme un remodelage numpy. Nous utilisons -1 pour signifier que nous ne savons pas combien de lignes nous voulons mais nous savons combien de colonnes nous avons, 64.

0
halfer 18 juin 2020 à 13:19