web-dev-qa-db-fra.com

PyTorch: Extraire correctement les poids appris

J'essaie d'extraire les poids d'une couche linéaire, mais ils ne semblent pas changer, bien que l'erreur baisse de façon monotone (c'est-à-dire que la formation se produit). En imprimant la somme des poids, rien ne se passe car elle reste constante:

np.sum (model.fc2.weight.data.numpy ())

Voici les extraits de code:

def train(epochs):
    model.train()
    for Epoch in range(1, epochs+1):
        # Train on train set
        print(np.sum(model.fc2.weight.data.numpy()))
        for batch_idx, (data, target) in enumerate(train_loader):
            data, target = Variable(data), Variable(data)
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()

et

# Define model
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(100, 80, bias=False)
        init.normal(self.fc1.weight, mean=0, std=1)
        self.fc2 = nn.Linear(80, 87)
        self.fc3 = nn.Linear(87, 94)
        self.fc4 = nn.Linear(94, 100)

    def forward(self, x):
        x = self.fc1(x)
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = F.relu(self.fc4(x))
        return x

Peut-être que je regarde les mauvais paramètres, bien que j'aie vérifié les documents. Merci de votre aide!

10
N8_Coder

Utilisez model.parameters() pour obtenir un poids entraînable pour n'importe quel modèle ou couche. N'oubliez pas de le mettre dans list (), sinon vous ne pourrez pas l'imprimer.

La capture de code suivante a fonctionné

>>> import torch
>>> import torch.nn as nn
>>> l = nn.Linear(3,5)
>>> w = list(l.parameters())
>>> w
16
Haha TTpro