2017-06-24 8 views
3

私は線形レイヤーから重みを抽出しようとしていますが、誤差は単調に減少しています(つまりトレーニングが行われています)。それは一定であるため重み合計を印刷、何も起こりません:ここでPyTorch:学習した重みを正しく抽出します

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

は、コードスニペットは、次のとおりです。

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() 

# 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 

私はドキュメントをチェックするが、たぶん私は、間違ったパラメータに探しています。ご協力いただきありがとうございます!

+1

を働いたあなたは、変数に関して勾配が変化しているかどうかを確認しました?この変数に 'register_hook()'関数を使うことができますか? – Kashyap

+0

エラーが見つかりました。両方の変数が同じメモリを指していた...申し訳ありません!ところで、ニース機能! –

答えて

3

model.parameters()を使用すると、任意のモデルまたはレイヤーで訓練可能な重量を取得できます。それをlist()の中に入れることを忘れないでください。そうしないと、それを印刷することはできません。

次のコードスニップは

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