Disons que j'ai un objet de modèle de réseau appelé m
. Maintenant, je n'ai aucune information préalable sur le nombre de couches de ce réseau. Comment créer une boucle for pour itérer sur sa couche?
Je recherche quelque chose comme:
Weight=[] for layer in m._modules: Weight.append(layer.weight)
4 Réponses :
Disons que vous avez le réseau de neurones suivant.
conv1.weight torch.Size([6, 1, 5, 5]) conv1.bias torch.Size([6]) conv2.weight torch.Size([16, 6, 5, 5]) conv2.bias torch.Size([16]) fc1.weight torch.Size([120, 400]) fc1.bias torch.Size([120]) fc2.weight torch.Size([84, 120]) fc2.bias torch.Size([84]) fc3.weight torch.Size([10, 84]) fc3.bias torch.Size([10])
Maintenant, imprimons la taille des paramètres de poids associés à chaque couche NN.
model = Net() for name, param in model.named_parameters(): print(name, param.size())
model.named_parameters ()
est-il le moyen universel de parcourir les paramètres?
Vous pouvez simplement l'obtenir en utilisant model.named_parameters ()
, qui renverrait un générateur sur lequel vous pouvez itérer et obtenir les tenseurs, son nom, etc.
Voici le code pour le modèle pré-entraîné resnet:
conv1.weight torch.Size([64, 3, 7, 7]) bn1.weight torch.Size([64]) bn1.bias torch.Size([64]) layer1.0.conv1.weight torch.Size([64, 64, 1, 1]) layer1.0.bn1.weight torch.Size([64]) layer1.0.bn1.bias torch.Size([64]) ........ ........ and so on
qui afficherait
In [106]: resnet = torchvision.models.resnet101(pretrained=True) In [107]: for name, param in resnet.named_parameters(): ...: print(name, param.shape)
Vous pouvez trouver une discussion sur ce sujet dans comment-manipuler-les-paramètres-de-couches -par-ses-noms /
En supposant que m
est votre module, alors vous pouvez faire:
for layer in m.children(): weights = list(layer.parameters())
vous pouvez également le faire:
# https://discuss.pytorch.org/t/how-to-get-the-module-names-of-nn-sequential/39682 # looping through modules but get the one with a specific name import torch import torch.nn as nn from collections import OrderedDict params = OrderedDict([ ('fc0', nn.Linear(in_features=4,out_features=4)), ('ReLU0', nn.ReLU()), ('fc1L:final', nn.Linear(in_features=4,out_features=1)) ]) mdl = nn.Sequential(params) # throws error # mdl['fc0'] for m in mdl.children(): print(m) print() for m in mdl.modules(): print(m) print() for name, m in mdl.named_modules(): print(name) print(m) print() for name, m in mdl.named_children(): print(name) print(m)
Référence:
for name, m in mdl.named_children(): print(name) print(m.parameters())
Avez-vous besoin d'accéder aux paramètres couche par couche?
Oui, j'ai besoin de savoir quel paramètre appartient à quelle couche.
voir ceci: discuter.pytorch .org / t /… ou ceci: stackoverflow.com/a/63309562/1601580