为定制环境调整稳定的基准代理

问题描述

我制作了一个游戏,并试图使其在稳定的基准下正常工作。我尝试了不同的算法 我已经尝试阅读稳定的基准文档,但是我不知道从哪里开始调整。 我的游戏在这里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)))