Как мне справиться с этой ошибкой "Неверный индекс в сборе" - PullRequest
0 голосов
/ 16 марта 2020

Часть моего кода DQN:

class QValues ​​(): device = torch.device ("cuda", если torch.cuda.is_available (), иначе "cpu")

@staticmethod
def get_current(policy_net, states, actions):
    return policy_net(states).gather(dim=1, index=actions.unsqueeze(-1))

У меня есть тензоры состояний, действий, наград и next_states, извлеченные как:

def extract_tensors(experiences):
# Convert batch of Experiences to Experience of batches
batch = Experience(*zip(*experiences))

t1 = torch.cat(batch.state)
t2 = torch.cat(batch.action)
t3 = torch.stack(batch.reward)
t4 = torch.cat(batch.next_state)

return (t1,t2,t3,t4)

И они распакованы как:

experiences = memory.sample(batch_size)
states, actions, rewards, next_states = extract_tensors(experiences)

Тензор опыта для партии печатается как:

[Experience(state=tensor([ 5.0000, 16.0000,  0.1000, 50.0000]), action=tensor([4]), next_state=tensor([ 5.0000, 22.0000,  0.3000,  4.0000]), reward=tensor(0.3971)), Experience(state=tensor([ 5.0000, 15.0000,  0.2700, 30.0000]), action=tensor([20]), next_state=tensor([12.0000, 13.0000,  0.3400, 20.0000]), reward=tensor(0.6897)), Experience(state=tensor([ 3.0000,  5.0000,  0.3200, 40.0000]), action=tensor([90]), next_state=tensor([24.0000,  3.0000,  0.1100, 90.0000]), reward=tensor(0.1311)), Experience(state=tensor([ 2.0000,  3.0000,  0.3500, 35.0000]), action=tensor([95]), next_state=tensor([20.0000,  7.0000,  0.3700, 95.0000]), reward=tensor(0.1072)), Experience(state=tensor([ 5.0000, 22.0000,  0.3000,  4.0000]), action=tensor([35]), next_state=tensor([ 2.0000,  3.0000,  0.3500, 35.0000]), reward=tensor(0.3360)), Experience(state=tensor([24.0000,  3.0000,  0.1100, 90.0000]), action=tensor([50]), next_state=tensor([ 5.0000, 16.0000,  0.1000, 50.0000]), reward=tensor(0.2066)), Experience(state=tensor([12.0000, 13.0000,  0.3400, 20.0000]), action=tensor([70]), next_state=tensor([ 3.0000, 14.0000,  0.2800, 70.0000]), reward=tensor(0.1569)), Experience(state=tensor([20.0000,  7.0000,  0.3700, 95.0000]), action=tensor([70]), next_state=tensor([ 8.0000, 19.0000,  0.2900, 70.0000]), reward=tensor(0.2649)), Experience(state=tensor([ 3.0000, 14.0000,  0.2800, 70.0000]), action=tensor([60]), next_state=tensor([ 7.0000,  8.0000,  0.2200, 60.0000]), reward=tensor(0.5128)), Experience(state=tensor([ 7.0000,  8.0000,  0.2200, 60.0000]), action=tensor([40]), next_state=tensor([ 3.0000,  5.0000,  0.3200, 40.0000]), reward=tensor(0.4167))]

Когда я запускаю тренировку l oop, я получаю ошибку:

RuntimeError                              Traceback (most recent call last)

в 210 211 -> 212 current_q_values ​​= QValues.get_current (policy _net , состояния, действия) 213 next_q_values ​​= QValues.get_next (target _net, next_states) 214 target_q_values ​​= (next_q_values ​​* gamma) + награды

в get_current (политика _net, состояния, действия) 160 @staticmethod 161 def get_current (политика _net, состояния, действия): -> 162 политика возврата _net (состояния). Сборщик (dim = 1, индекс = actions.unsqueeze (-1)) 163 164 @ staticmethod

RuntimeError: Неверный индекс в сборе в c: \ a \ w \ 1 \ s \ tmp_conda_3.7_070024 \ conda \ conda-bld \ pytorch-cpu_1544079887239 \ work \ aten \ src \ th \ generic / THTensorEvenMoreMath. cpp: 457

Я новичок в Deep RL. Пожалуйста, помогите мне понять, как я могу реорганизовать свой код.

...