我刚刚开始自学稳定基线强化学习3。我的长期目标是训练一个代理去玩一个特定的回合制桌面游戏。不过,目前我对新事物感到不知所措。
我已经实现了一个健身房环境,我可以用它来手动玩我的游戏,或者让它选择随机的动作。
目前,我被困在试图让一个模型给我的行动,以响应观察。我的环境的动作空间是DiscreteSpace(256)
。我创建了一个环境为model = PPO('MlpPolicy', env, verbose=1)
的模型。当我后来打电话给model.predict(observation)
时,我确实得到了一个看起来像动作的号码。当反复运行时,我得到不同的数字,我认为这是在未经训练的模型上所期望的。
不幸的是,在我的游戏中,大多数行为在大多数州都是非法的,我想过滤它们并选择最好的合法行为。或者简单地转储所有操作的输出结果,以便了解发生了什么。
在浏览其他人的代码中,我看到了model.action_probability(observation)
的参考。不幸的是,据我所知,方法不是稳定基线的一部分。从稳定基线2迁移到v3的指南只提到它没有被实现[1]。
你能给我点提示,告诉我怎么继续下去吗?
如果将来有人看到这篇文章,这是你为PPO做的。
import numpy as np
from stable_baselines3.common.policies import obs_as_tensor
def predict_proba(model, state):
obs = obs_as_tensor(state, model.policy.device)
dis = model.policy.get_distribution(obs)
probs = dis.distribution.probs
probs_np = probs.detach().numpy()
return probs_np
关于这点。
当我之后调用model.predict(observation)我确实得到了一个看起来像动作的数字。
您可以使用以下行
来防止这种行为model.predict(observation, deterministic=True)
当您添加deterministic=True时,所有预测的动作将始终由最大概率决定,而不是由概率本身决定。
只是给你一个例子,让我们假设你有以下概率:
- 动作A的25%
- 动作B的75%
如果不使用deterministic=True,该模型将使用这些概率返回预测。
如果使用deterministic=True,模型将总是返回动作b