boyu-ai/Hands-on-RL

第七章DQN代运行报错

Opened this issue · 3 comments

第七章DQN代运行报错

`

ValueError Traceback (most recent call last)
Cell In[12], line 33
31 done = False
32 while not done:
---> 33 action = agent.take_action(state)
34 next_state, reward, done, _ = env.step(action)
35 replay_buffer.add(state, action, reward, next_state, done)

Cell In[9], line 24, in DQN.take_action(self, state)
22 action = np.random.randint(self.action_dim)
23 else:
---> 24 state = torch.tensor([state], dtype=torch.float).to(self.device)
25 action = self.q_net(state).argmax().item()
26 return action

ValueError: expected sequence of length 4 at dim 2 (got 0)
`

官方提供的代码报错,主要体现在gym更新到0.26之后,部分方法参数和输出有变化,我重新整理了官方代码,并且运行正常,参考:链接

这是因为gym版本升级之后函数发生变化,只需要修改三处

  1. # env.seed(0)改为env.reset(seed=0)
  2. state = env.reset()下一行添加一行state = state[0]
  3. next_state, reward, done, _ = env.step(action)等号左边添加一个, _,即新版函数增加了一个输出

这是因为gym版本升级之后函数发生变化,只需要修改三处

  1. # env.seed(0)改为env.reset(seed=0)
  2. state = env.reset()下一行添加一行state = state[0]
  3. next_state, reward, done, _ = env.step(action)等号左边添加一个, _,即新版函数增加了一个输出

我照着这个修改之后运行,画出来的Return图像感觉有点问题欸,最大值都大于Return可能取到的值了,这是为什么呀?


已解决,新版gym把以前的done(terminaled)拆成了两部分:done(terminaled环境自然结束)和truncated(达到一定步数结束),所以还需要修改:
next_state, reward, done, _ = env.step(action) 改为 next_state, reward, done, truncated, _ = env.step(action)
再在下面添加一行done=done or truncated把这两个再合并成一个