如何在稳定的基线中获得 action_propability() 3
Posted
技术标签:
【中文标题】如何在稳定的基线中获得 action_propability() 3【英文标题】:How to get action_propability() in stable baselines 3 【发布时间】:2021-05-31 08:12:54 【问题描述】:我刚刚开始使用稳定基线 3 自学强化学习。我的长期目标是训练代理玩特定的回合制棋盘游戏。不过,目前我对新事物感到不知所措。
我已经实现了一个健身房环境,我可以使用它来手动玩游戏或让它选择随机动作。
目前,我一直在尝试让模型让我根据观察结果采取行动。我的环境的动作空间是DiscreteSpace(256)
。我创建环境为model = PPO('MlpPolicy', env, verbose=1)
的模型。当我后来打电话给model.predict(observation)
时,我确实得到了一个看起来像一个动作的号码。当重复运行时,我得到不同的数字,我认为这是在未经训练的模型上预期的。
不幸的是,在我的游戏中,大多数行为在大多数州都是非法的,我想过滤它们并选择最好的合法行为。或者只是将所有操作的输出结果转储出来,以了解正在发生的事情。
在浏览其他人的代码时,我看到了对model.action_probability(observation)
的引用。不幸的是,据我所知,方法不是稳定基线 3 的一部分。从稳定基线 2 迁移到 v3 的指南只提到它没有被实施 [1]。
你能告诉我如何继续吗?
【问题讨论】:
【参考方案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
【讨论】:
我不得不将 obs = obs_as_tensor(state, model.policy.device) 替换为 obs = model.policy.obs_to_tensor(state)[0]乙>。更改之后,一切都按预期进行。谢谢!【参考方案2】:关于这一点。当我稍后 调用 model.predict(observation) 时,我确实得到了一个看起来像动作的数字。
您可以使用以下行来防止这种行为
model.predict(observation, deterministic=True)
当您添加确定性=True 时,所有预测的动作将始终由最大概率决定,而不是由概率本身决定。
举个例子,假设你有以下概率:
25% 的动作 A 75% 的操作 B如果您不使用 deterministic=True,模型将使用这些概率返回预测。 如果您使用 deterministic=True,模型将始终返回操作 B。
【讨论】:
以上是关于如何在稳定的基线中获得 action_propability() 3的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TensorFlow 获得稳定的结果,设置随机种子