Возврат PyTorch softmax - PullRequest
       88

Возврат PyTorch softmax

0 голосов
/ 03 августа 2020

Я новичок в PyTorch и следую этому руководству по обучению с подкреплением. Моя среда - это пользовательская игра Pacman, которая не использует тренажерный зал. Об игре l oop позаботились. Объект в этой игре Pacman позволяет получить доступ к данным состояния. Я использую эти данные для отправки входных данных в мою сеть Deep Q. Сначала я меняю входные данные из списка python на тензор, чтобы моя сеть Deep Q могла принять его в качестве входных данных. Вот как я конвертирую свой список python в тензор:

#self.getFeatures() returns a dictionary, so I grab the values and convert it to a list
input = torch.FloatTensor(list(self.getFeatures(gameState, bestAction).values())) \
             .unsqueeze(0) \
             .to(torch.device("cuda" if torch.cuda.is_available() else "cpu"))

Затем я передаю этот ввод в свою политику Deep Q Network:

test_net = self.policy_net(input).max(1)[1].view(1, 1)

Ниже мой Deep Q Сеть:

class DQN(nn.Module):

def __init__(self, feature_size, action_size):
    super(DQN, self).__init__()
    self.input = nn.Linear(feature_size, 12)
    self.hidden1 = nn.Linear(12, 5)
    self.hidden2 = nn.Linear(5, action_size)

# Called with either one element to determine next action, or a batch
# during optimization. Returns tensor([[left0exp,right0exp]...]).
def forward(self, x):
    x = F.relu(self.input(x))
    x = F.relu(self.hidden1(x))
    x = F.softmax(self.hidden2(x), dim=1)
    return x

При вводе tensor([[0., 1., 1., 0., 1.]]) this test_net возвращает это tensor([[0]]). Я не знаю, что от этого получить. У меня создалось впечатление, что softmax возвращает вероятность каждого действия. В моей области действий доступно 5 действий. Я не знаю, что делать с выводом из test_net. Я хочу получить выбор действия из этого test_net, но получаю целое число.

Мои вопросы: должен ли ввод быть в другой форме? Правильно ли я конвертирую свой список ввода python в тензор? У меня есть 5 функций, а именно tensor([[0., 1., 1., 0., 1.]]). Должен ли вывод tensor([[0]]) быть числом с плавающей запятой, а не 0?

1 Ответ

0 голосов
/ 03 августа 2020

Softmax действительно назначает вероятность для каждого действия, но вы вызываете .max(1)[1] после получения результатов от DQN, который вычисляет max и argmax по оси 1 (.max(1)) и выбирает argmax ([1]). Впоследствии вы также просмотрели его в форме (1,1), поэтому в итоге у вас есть 2-мерный тензор только с одной ячейкой, содержащий индекс с наибольшей вероятностью, заданной сетью.

Попробуйте вызвать DQN напрямую, он вернет полный вывод softmax.

...