Softmax Dims и переменная изменчивость в PyTorch - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть код для предыдущей версии PyTorch, и я получаю 2 предупреждения для 3-й строки:

import torch.nn.functional as F

def select_action(self, state):
        probabilities = F.softmax(self.model(Variable(state, volatile = True))*100) # T=100
        action = probs.multinomial(num_samples=1)
        return action.data[0,0]

UserWarning: volatile была удалена и теперь не имеет никакого эффекта. Вместо этого используйте with torch.no_grad():.

UserWarning: неявный выбор размера для softmax устарел. Измените вызов, чтобы включить dim = X> в качестве аргумента.

Я обнаружил, что:

Volatile рекомендуется для режима чистого вывода, когда вы уверены, что выиграли даже не звонит .backward (). Он более эффективен, чем любая другая настройка автограда - он использует абсолютный минимальный объем памяти для оценки модели. volatile также определяет, что require_grad является False.

Прав ли я, что мне следует просто удалить его? И потому что я хочу получить вероятности, поэтому я должен использовать dim = 1? и 3-я строка моего кода должна выглядеть так:

    probabilities = F.softmax(self.model(Variable(state), dim=1)*100) # T=100

состояние создается здесь:

def update(self, reward, new_signal):
   new_state = torch.Tensor(new_signal).float().unsqueeze(0)
   self.memory.push((self.last_state, new_state, torch.LongTensor([int(self.last_action)]), torch.Tensor([self.last_reward])))
   action = self.select_action(new_state)
   if len(self.memory.memory) > 100:
       batch_state, batch_next_state, batch_action, batch_reward = self.memory.sample(100)
       self.learn(batch_state, batch_next_state, batch_reward, batch_action)
   self.last_action = action
   self.last_state = new_state
   self.last_reward = reward
   self.reward_window.append(reward)
   if len(self.reward_window) > 1000:
       del self.reward_window[0]
   return action

1 Ответ

2 голосов
/ 21 апреля 2020

Вы правы, но не "в полной мере" правы.

Кроме упомянутых вами изменений, вы должны использовать torch.no_grad(), как указано ниже:

def select_action(self, state):
    with torch.no_grad():
        probabilities = F.softmax(self.model(state), dim=1)*100
        action = probs.multinomial(num_samples=1)
        return action.data[0,0]

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

Также обратите внимание, что Variable также устарела (отметьте здесь ), и state должно быть просто torch.tensor создан с requires_grad=True.

Кстати. У вас есть probs и probabilities, но я предполагаю, что это то же самое и просто опечатка.

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