web-dev-qa-db-fra.com

Comment construire un réseau avec deux entrées dans PyTorch

Supposons que je veuille avoir l'architecture générale du réseau de neurones:

Input1 --> CNNLayer 
                    \
                     ---> FCLayer ---> Output
                    /
Input2 --> FCLayer

Input1 est une donnée d'image, input2 est une donnée non d'image. J'ai implémenté cette architecture dans Tensorflow.

Tous les exemples de pytorch que j'ai trouvés sont une entrée à travers chaque couche. Comment puis-je définir la fonction directe pour traiter 2 entrées séparément, puis les combiner dans une couche intermédiaire?

9
LeonG

Par "les combiner", je suppose que vous entendez concaténer les deux entrées.
En supposant que vous concatriez le long de la deuxième dimension:

import torch
from torch import nn

class TwoInputsNet(nn.Module):
  def __init__(self):
    super(TwoInputsNet, self).__init__()
    self.conv = nn.Conv2d( ... )  # set up your layer here
    self.fc1 = nn.Linear( ... )  # set up first FC layer
    self.fc2 = nn.Linear( ... )  # set up the other FC layer

  def forward(self, input1, input2):
    c = self.conv(input1)
    f = self.fc1(input2)
    # now we can reshape `c` and `f` to 2D and concat them
    combined = torch.cat((c.view(c.size(0), -1),
                          f.view(f.size(0), -1)), dim=1)
    out = self.fc2(combined)
    return out

Notez que lorsque vous définissez le nombre d'entrées à self.fc2 vous devez prendre en compte les deux out_channels de self.conv ainsi que les dimensions spatiales de sortie de c.

5
Shai