Pytorch - RuntimeError: invalid multinomial distribution (encountering probability entry < 0)
Pytorch - RuntimeError: invalid multinomial distribution (encountering probability entry < 0)
我正在使用 Stable Baselines 3 训练代理人玩 Connect 4 游戏。当代理作为第二个玩家开始游戏时,我正在尝试考虑这种情况。
self.env = self.ks_env.train([opponent, None])
当我尝试 运行 代码时,出现以下错误:
invalid multinomial distribution (encountering probability entry < 0)
/opt/conda/lib/python3.7/site-packages/torch/distributions/categorical.py in sample(self, sample_shape)
samples_2d = torch.multinomial(probs_2d, sample_shape.numel(), True).T
但是,当代理是第一个玩家时没有问题:
self.env = self.ks_env.train([None, opponent])
我认为问题与 Pytorch 库有关。我的问题是如何解决这个问题?
检查您提供的代码后,问题似乎不是来自什么代理启动游戏,而是游戏完成后没有重新启动环境。
我刚刚更改了你的步进函数,如下所示:
def step(self, action):
# Check if agent's move is valid
is_valid = (self.obs['board'][int(action)] == 0)
if is_valid: # Play the move
self.obs, old_reward, done, _ = self.env.step(int(action))
reward = self.change_reward(old_reward, done)
else: # End the game and penalize agent
reward, done, _ = -10, True, {}
if done:
self.reset()
return board_flip(self.obs.mark,
np.array(self.obs['board']).reshape(1, self.rows, self.columns) / 2),
reward, done, _
有了这个,模型就可以训练了,您可以使用以下代码段检查它是否按预期工作:
done = True
for step in range(500):
if done:
state = env.reset()
state, reward, done, info = env.step(env.action_space.sample())
print(reward)
Link 到我的版本 your notebook
我正在使用 Stable Baselines 3 训练代理人玩 Connect 4 游戏。当代理作为第二个玩家开始游戏时,我正在尝试考虑这种情况。
self.env = self.ks_env.train([opponent, None])
当我尝试 运行 代码时,出现以下错误:
invalid multinomial distribution (encountering probability entry < 0)
/opt/conda/lib/python3.7/site-packages/torch/distributions/categorical.py in sample(self, sample_shape)
samples_2d = torch.multinomial(probs_2d, sample_shape.numel(), True).T
但是,当代理是第一个玩家时没有问题:
self.env = self.ks_env.train([None, opponent])
我认为问题与 Pytorch 库有关。我的问题是如何解决这个问题?
检查您提供的代码后,问题似乎不是来自什么代理启动游戏,而是游戏完成后没有重新启动环境。
我刚刚更改了你的步进函数,如下所示:
def step(self, action):
# Check if agent's move is valid
is_valid = (self.obs['board'][int(action)] == 0)
if is_valid: # Play the move
self.obs, old_reward, done, _ = self.env.step(int(action))
reward = self.change_reward(old_reward, done)
else: # End the game and penalize agent
reward, done, _ = -10, True, {}
if done:
self.reset()
return board_flip(self.obs.mark,
np.array(self.obs['board']).reshape(1, self.rows, self.columns) / 2),
reward, done, _
有了这个,模型就可以训练了,您可以使用以下代码段检查它是否按预期工作:
done = True
for step in range(500):
if done:
state = env.reset()
state, reward, done, info = env.step(env.action_space.sample())
print(reward)
Link 到我的版本 your notebook