问题描述
我制作了一个游戏,并试图使其在稳定的基准下正常工作。我尝试了不同的算法 我已经尝试阅读稳定的基准文档,但是我不知道从哪里开始调整。 我的游戏在这里:https://github.com/AbdullahGheith/BlockPuzzleGym
这是我用来训练它的代码:
import gym
import blockpuzzlegym
from stable_baselines import PPO2
env = gym.make("BlockPuzzleGym-v0")
model = PPO2('MlpPolicy',env,verbose=1)
model.learn(250000)
for _ in range(10000):
action,_states = model.predict(obs)
obs,rewards,dones,info = env.step(action)
env.render()
我尝试了25000000个时间步,但仍然无法正常工作。 您可能会说,我是ML的新手,这是我的第一个项目。欢迎任何迹象。
我尝试使用stable baselines zoo中的MiniGrid参数(没有环境包装器)
解决方法
您可以看到您使用了简单的默认 MlpPolicy,其中包括两个大小为 64 的 FC 层。如何实现您自己的网络? 这是一个如何实现您自己的网络的文档。 https://stable-baselines.readthedocs.io/en/master/guide/custom_policy.html
您应该了解稳定基线中的任何模型都对应于以下结构: feature_extractor -> mlp_extractor -> 策略\价值网络。
因此,您可以将 policy_kwargs
添加到模型中,其中 policy_kwargs
是一个 dict
,其中:
policy_kwargs = dict(
feature extractor=custom_extractor,net_arch=[64,dict(vf=[16],pi=[16])]
)
在这里您可以看到 net_arch
对应于 mlp_extractor 的结构和策略\值网络。 custom_extractor
是一个您可以实现的函数,它会在最后将您的输入数据处理到 FC 层。您可以在此处实现您想要的任何模型结构。例如,库中有一个默认的 cnn_extractor:
def nature_cnn(scaled_images,**kwargs):
activ = tf.nn.relu
layer_1 = activ(conv(scaled_images,'c1',n_filters=32,filter_size=8,stride=4,init_scale=np.sqrt(2),**kwargs))
layer_2 = activ(conv(layer_1,'c2',n_filters=64,filter_size=4,stride=2,**kwargs))
layer_3 = activ(conv(layer_2,'c3',filter_size=3,stride=1,**kwargs))
layer_3 = conv_to_fc(layer_3)
return activ(linear(layer_3,'fc1',n_hidden=512,init_scale=np.sqrt(2)))