web-dev-qa-db-fra.com

Comment écrire un modèle séquentiel PyTorch?

Jusqu'à présent, j'ai écrit mon MLP, RNN et CNN à Keras, mais maintenant PyTorch gagne en popularité au sein des communautés d'apprentissage en profondeur, et j'ai donc également commencé à apprendre ce cadre. Je suis un grand fan de modèles séquentiels à Keras, ce qui nous permet de faire des modèles simples très rapidement. J'ai également vu que PyTorch a cette fonctionnalité, mais je ne sais pas comment en coder une. J'ai essayé de cette façon

import torch
import torch.nn as nn

net = nn.Sequential()
net.add(nn.Linear(3, 4))
net.add(nn.Sigmoid())
net.add(nn.Linear(4, 1))
net.add(nn.Sigmoid())
net.float()

print(net)

mais il donne cette erreur

AttributeError: l'objet 'Sequential' n'a pas d'attribut 'add'

Aussi, si possible, pouvez-vous donner des exemples simples pour les modèles RNN et CNN dans le modèle séquentiel PyTorch?

8
Eka

Sequential n'a pas de méthode add pour le moment, bien qu'il y ait débat sur l'ajout de cette fonctionnalité.

Comme vous pouvez le lire dans la documentationnn.Sequential prend comme argument les couches séparées comme une séquence d'arguments ou un OrderedDict .

Si vous avez un modèle avec beaucoup de couches, vous pouvez d'abord créer une liste, puis utiliser le * opérateur pour développer la liste en arguments positionnels, comme ceci:

layers = []
layers.append(nn.Linear(3, 4))
layers.append(nn.Sigmoid())
layers.append(nn.Linear(4, 1))
layers.append(nn.Sigmoid())

net = nn.Sequential(*layers)

Cela se traduira par une structure similaire de votre code, comme l'ajout direct.

16
McLawrence

Comme décrit par la bonne réponse, voici à quoi cela ressemblerait comme une séquence d'arguments:

device = torch.device('cpu')
if torch.cuda.is_available():
    device = torch.device('cuda')

net = nn.Sequential(
      nn.Linear(3, 4),
      nn.Sigmoid(),
      nn.Linear(4, 1),
      nn.Sigmoid()
      ).to(device)


print(net)

Sequential(
  (0): Linear(in_features=3, out_features=4, bias=True)
  (1): Sigmoid()
  (2): Linear(in_features=4, out_features=1, bias=True)
  (3): Sigmoid()
  )
9
Chris Palmer

Comme l'a dit McLawrence nn.Sequential n'a pas la méthode add. Je pense que peut-être les codes dans lesquels vous avez trouvé l'utilisation de add pourraient avoir des lignes qui ont modifié le torch.nn.Module.add à une fonction comme celle-ci:

def add_module(self,module):
    self.add_module(str(len(self) + 1 ), module)

torch.nn.Module.add = add_module

après cela, vous pouvez ajouter un torch.nn.Module à un Sequential comme vous l'avez publié dans la question.

1
yrd241