Различается ли использование optimizer.step или model.step в pytorch? - PullRequest
0 голосов
/ 14 ноября 2018

В pytorch, чтобы обновить модель, я должен использовать optimizer.step() или model.step()?

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

import torch
import torch nn
class SomeNeuralNet(nn.Module):
    def __init__(self,hs,es,dropout):
          SomeNeuralNet(ClaimRecognizer, self).__init__()
          # Some initialization here
    def forward(x):
          # forward propagation here

model = SomeNeuralNet(es,hs,dp)
optimizer = optim.Adam(model.parameters())
loss_function = nn.NLLLoss()
for epoch in N:
   for x in data:
      logp = model(x)
      loss = loss_function(logp,gold_outs)
      loss.backward()
       # Which one I should call ? Optimizer.step() or model.step() or both ?
       optimizer.step()
       model.step()

1 Ответ

0 голосов
/ 14 ноября 2018

Чтобы сделать шаг градиентного спуска, вы обычно используете optimizer.step().
Вот также пример, взятый из документации (та же ссылка внизу) , как это выглядит в целом:

for input, target in dataset:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()

Не знаюне знаешь, откуда у тебя это model.step()?Вы пробовали это?

Если ваша модель действительно обладает какой-то step() -функцией , возможно, она делает что-то иное.

Но если вы не определите что-то дополнительное, ваш model получитего функции от nn.Module и у него нет функции step!

См. этот пример в документации Pytorch :

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

model = Model()
model.step()

Попытка вызова step() приводит к AttributeError:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-41-b032813f7eda> in <module>
     13 
     14 model = Model()
---> 15 model.step()

~/miniconda3/envs/py37/lib/python3.7/site-packages/torch/nn/modules/module.py in __getattr__(self, name)
    530                 return modules[name]
    531         raise AttributeError("'{}' object has no attribute '{}'".format(
--> 532             type(self).__name__, name))
    533 
    534     def __setattr__(self, name, value):

AttributeError: 'Model' object has no attribute 'step'

Чтобы подвести итог, обычно ваш model должен не иметь функцию step(), optimizer.step() - это путь, если вы хотите выполнить шаг оптимизации .

См. Также здесь: https://pytorch.org/docs/stable/optim.html#taking-an-optimization-step

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