Я новичок в 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?