PyTorch указывает параметры модели - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь создать сверточную модель в PyTorch, где

  • один слой зафиксирован (инициализирован по заданным значениям)
  • другой слой (но начальное предположение берется из заданных значений).

Вот пример кода для определения модели:

import torch.nn as nn

class Net(nn.Module):
    def __init__(self, weights_fixed, weights_guess):
        super(Net, self).__init__()
        self.convL1 = nn.Conv1d(1, 3, 3, bias=False)
        self.convL1.weight = weights_fixed # I want to keep these weights fixed

        self.convL2 = nn.Conv1d(3, 1, 1, bias=False)
        self.convL1.weight = weights_guess # I want to learn these weights

    def forward(self, inp_batch):
        out1 = self.convL1(inp_batch)
        out2 = self.convL2(out1)

        return out2

и пример использования:

weights_fixed = ...
weights_guess = ...

model = Net(weights_fixed, weights_guess)

loss_fn = nn.CrossEntropyLoss()
optim = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)

train_dataset = ... #define training set here

for (X, y) in train_dataset:
    optim.zero_grad()
    out = model(X)
    loss = loss_fn(out, y)
    loss.backward()
    optim.step() 

Как я могу сделать веса weights_fixed - фиксированными и weights_guess - обучаемыми?

Мне кажется, что weights_fixed = nn.Parameter (W1, require_grad = False) weights_guess =nn.Parameter (W2, require_grad = True), где ради полноты импорта импортируйте numpy как факел импорта np

krnl = np.zeros((5,order+1))
krnl[:,0] = [ 0. , 1., 0. ]
krnl[:,1] = [-0.5, 0., 0.5]
krnl[:,2] = [ 1. ,-2., 1. ]
W1 = torch.tensor(krnl)

a = np.array((1.,2.,3.))
W2 = torch.tensor(a)

Но я совершенно запутался.Любые предложения или ссылки будут с благодарностью.Конечно, я просмотрел документы PyTorch, но это не добавило ясности моему пониманию.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Просто оберните обучаемый параметр с помощью nn.Parameter (requires_grad=True является значением по умолчанию, указывать его не нужно) и получите фиксированный вес в качестве тензора без оболочки nn.Parameter.

Все веса nn.Parameter автоматически добавляются к net.parameters(), поэтому при выполнении тренировок, подобных optimizer = optim.SGD(net.parameters(), lr=0.01), фиксированный вес не изменится.

Так что в основном это:

weights_fixed = W1
weights_guess = nn.Parameter(W2)
0 голосов
/ 21 марта 2019

Вы можете сделать это:

# this will be inside your class mostly
self.conv1.weight.requires_grad = False

И это будет то место, где вы определяете оптимизатор:

optimizer = optim.SGD(filter(lambda p: p.requires_grad, net.parameters()), lr=0.1)

Итак, оптимизатор будет использовать толькопараметры, у которых включены градиенты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...