Инициализация параметров модели - PullRequest
0 голосов
/ 18 января 2019

Я новичок в PyTorch. Я пишу простую программу для линейной регрессии и хочу сравнить результаты, используя разные методы (SGD, импульс, ADAM и т. Д.). Проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы каждый раз, когда цикл заканчивался, параметры модели были повторно инициализированы до того же значения, с которого начиналась предыдущая модель, поэтому сравнение является действительным.

Это то, что у меня есть, это мои тренировочные данные:

      x1=np.arange(0,10,1).reshape(10,1)
      y1=2*x1+1+np.random.normal(0,1,(10,1))
      x=torch.from_numpy(x1)
      y=torch.from_numpy(y1)

Здесь я тренирую данные

      from torch.utils.data import TensorDataset,DataLoader
      train=TensorDataset(xdata,ydata) 
      size_batch=10
      dl=DataLoader(train,size_batch,shuffle=True)

Определите модель и выберите

     model=nn.Linear(1,1)
     opt=torch.optim.SGD(model.parameters(), lr=1e-4)
     import torch.nn.functional as F
     loss1=F.mse_loss
     loss=loss1(model(x),y)

Функция

     def fitmodel(nepochs, model, loss1, opt):
         for epoch in range(nepochs):
             for xm,ym in dl:
                 predict = model(xm)
                 loss = loss1(predict, ym)
                 loss.backward()
                 opt.step()
                 opt.zero_grad()  

вызов функции

     fitmodel(1000,model,loss1,opt)

Теперь я хочу повторить вышеописанное, но для других алгоритмов оптимизации. Если я просто перезапущу fitmodel, он будет использовать некоторые параметры, которые он уже рассчитал. Я хочу начать с тех же «начальных условий», что и при предыдущем запуске. У кого-нибудь есть идеи, как это сделать?

Редактировать Перед запуском fitmodel я копирую исходное смещение и вес

   w1=model.weight
   b1=model.bias
   fitmodel(1000,model,loss1,opt)
   model.weight=w1
   model.bias=b1
   loss=[]

Но я получаю эту ошибку: Ошибка типа: невозможно присвоить «список» в качестве параметра «смещение» (torch.nn.Parameter или None ожидается)

1 Ответ

0 голосов
/ 18 января 2019

Параметры линейного слоя хранятся в model.weight и model.bias. Вам нужно скопировать их перед тренировкой, а потом восстановить. Это немного сложнее, чем то, что вы делаете в своем коде. Пример ниже

# clone and detach so that we have an actual backup copy,
# not merely a reference to the parameters
w1=model.weight.clone().detach()
b1=model.bias.clone().detach()

for i in range(3): # as many experiments as you wish to run

    # since we have detached, w1 and b1 are no longer nn.Parameter -
    # we have to rewrap them. We keep copying so that the tensors used
    # in the computation are separate from the backup copies
    model.weight=nn.Parameter(w1.clone())
    model.bias=nn.Parameter(b1.clone())

    # we reinitialize the optimizer because it looks at model.parameters()
    # if not for this line, it would try to optimize the values from 
    # the previous experiment!
    opt=torch.optim.SGD(model.parameters(), lr=1e-4)

    fitmodel(1000,model,loss1,opt)
...