Часть моего кода 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. Пожалуйста, помогите мне понять, как я могу реорганизовать свой код.