-1

我已经训练了一个简单的神经网络skorch来使其sklearn兼容,我想知道如何检索实际估计的权重。

这是我需要的可复制示例。

这里介绍的神经网络使用 10 个特征,具有 2 个节点的隐藏层,使用 ReLu 激活函数并线性组合 2 个节点的输出。

import torch
import numpy as np
from torch.autograd import Variable

# Create example data 
np.random.seed(2022)
train_size = 1000
n_features= 10

X_train = np.random.rand(n_features, train_size).astype("float32")

l2_params_1 = np.random.rand(1,n_features).astype("float32")
l2_params_2 = np.random.rand(1,n_features).astype("float32")

l1_X = np.matmul(l2_params_1, X_train)
l2_X = np.matmul(l2_params_2, X_train)

y_train = l1_X + l2_X

# Defining my NN
class NNModule(torch.nn.Module):
    def __init__(self, in_features):
        super(NNModule, self).__init__()
        self.l1 =  torch.nn.Linear(in_features, 2)
        self.a1 = torch.nn.ReLU()
        self.l2 =  torch.nn.Linear(2, 1)

    def forward(self, x):
        x = self.l1(x)
        x = self.a1(x)

        return self.l2(x)

# Initialize the NN
torch.manual_seed(200)

model = NNModule(in_features = 10)

model.l1.weight.data.uniform_(0.0, 1.0)
model.l1.bias.data.uniform_(0.0, 1.0)

# Define criterion and optimizer
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# Train the NN
torch.manual_seed(200)

for epoch in range(100):
    inputs = Variable(torch.from_numpy(np.transpose(X_train)))
    labels = Variable(torch.from_numpy(np.transpose(y_train)))

    optimizer.zero_grad()

    outputs = model(inputs)

    loss = criterion(outputs, labels)

    loss.backward()

    optimizer.step()

我到达的参数如下:

list(model.parameters())

[Output]: 
[Parameter containing:
 tensor([[0.8997, 0.8345, 0.8284, 0.6950, 0.5949, 0.1217, 0.9067, 0.1824, 0.8272,
          0.2372],
         [0.7525, 0.6577, 0.4358, 0.6109, 0.8817, 0.5429, 0.5263, 0.7531, 0.1552,
          0.7066]], requires_grad=True),
 Parameter containing:
 tensor([0.6617, 0.1079], requires_grad=True),
 Parameter containing:
 tensor([[0.9225, 0.8339]], requires_grad=True),
 Parameter containing:
 tensor([0.0786], requires_grad=True)]

现在,用 包装我NNModuleskorch我正在使用这个:

from skorch import NeuralNetRegressor

torch.manual_seed(200)
net = NeuralNetRegressor(
    module=NNModule(in_features=10),
    criterion=torch.nn.MSELoss,
    optimizer=torch.optim.SGD,
    optimizer__lr=0.01,
    max_epochs=100,
    verbose=0
)

net.fit(np.transpose(X_train), np.transpose(y_train))

我想检索在训练中获得的权重。我曾经dir(net)查看权重是否存储在任何属性中无济于事。

4

1 回答 1

0

要检索权重,需要像这样输出它们:

list(net.module.parameters())
于 2022-02-17T00:08:19.090 回答