首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TFUniform /Learner:TFUniform ReplayBuffer维度问题-重放缓冲区的无效形状与Actor更新

TFUniform /Learner:TFUniform ReplayBuffer维度问题-重放缓冲区的无效形状与Actor更新
EN

Stack Overflow用户
提问于 2022-11-19 21:11:25
回答 2查看 38关注 0票数 0

我尝试将这个tf-agents actor<->learner dimensional示例修改到我的windows机器上,使用的是TFUniformReplayBuffer,而不是仅在linux机器上工作的ReverbReplayBuffer,但我面临一个维度问题。

代码语言:javascript
复制
    [...]
    ---> 67 init_buffer_actor.run()
    [...]
    InvalidArgumentError: {{function_node __wrapped__ResourceScatterUpdate_device_/job:localhost/replica:0/task:0/device:CPU:0}} Must have updates.shape = indices.shape + params.shape[1:] or updates.shape = [], got updates.shape [84,84,4], indices.shape [1], params.shape [1000,84,84,4] [Op:ResourceScatterUpdate]

问题如下: tf参与者尝试访问重放缓冲区并根据该深纸使用一定数量的随机形状样本(84,84,4)初始化它,但是重放缓冲区需要形状样本(1,84,84,4)。

我的代码如下:

代码语言:javascript
复制
    def train_pong(
        env_name='ALE/Pong-v5',
        initial_collect_steps=50000,
        max_episode_frames_collect=50000,
        batch_size=32,
        learning_rate=0.00025,
        replay_capacity=1000):
  
        # load atari environment
        collect_env = suite_atari.load(
            env_name,
            max_episode_steps=max_episode_frames_collect,
            gym_env_wrappers=suite_atari.DEFAULT_ATARI_GYM_WRAPPERS_WITH_STACKING)

        # create tensor specs
        observation_tensor_spec, action_tensor_spec, time_step_tensor_spec = (
            spec_utils.get_tensor_specs(collect_env))
  
        # create training util
        train_step = train_utils.create_train_step()
  
        # calculate no. of actions
        num_actions = action_tensor_spec.maximum - action_tensor_spec.minimum + 1
  
        # create agent
        agent = dqn_agent.DqnAgent(
            time_step_tensor_spec,
            action_tensor_spec,
            q_network=create_DL_q_network(num_actions),
            optimizer=tf.compat.v1.train.RMSPropOptimizer(learning_rate=learning_rate))
    
        # create uniform replay buffer
        replay_buffer = tf_uniform_replay_buffer.TFUniformReplayBuffer(
            data_spec=agent.collect_data_spec,
            batch_size=1,
            max_length=replay_capacity)

        # observer of replay buffer
        rb_observer = replay_buffer.add_batch
        
        # create batch dataset
        dataset = replay_buffer.as_dataset(
            sample_batch_size=batch_size,
            num_steps = 2,
            single_deterministic_pass=False).prefetch(3)
    
        # create callable function for actor
        experience_dataset_fn = lambda: dataset
  
        # create random policy for buffer init
        random_policy = random_py_policy.RandomPyPolicy(collect_env.time_step_spec(),
                                                  collect_env.action_spec())
  
        # create initalizer
        init_buffer_actor = actor.Actor(
            collect_env,
            random_policy,
            train_step,
            steps_per_run=initial_collect_steps,
            observers=[replay_buffer.add_batch])

        # initialize buffer with random samples
        init_buffer_actor.run()

(方法是使用OpenAI Gym以及相应的包装器函数)

我和keras-rl2和tf-代理一起工作,没有演员<->学习其他atari游戏来创建DQN,而且都在一些改编之后工作得很好。我想我当前的代码也会在tf-agent libary函数中进行一些调整之后工作,但这将消除libary的目的。

我目前的假设是:--演员<->学习方法无法与TFUniformReplayBuffer一起工作(正如我所期望的那样),因为缺少TFPyEnvironment的支持,或者我仍然有一些关于tf-agents方法的知识缺陷。

先前的(成功)尝试:

代码语言:javascript
复制
    from tf_agents.environments.tf_py_environment import TFPyEnvironment
    tf_collect_env = TFPyEnvironment(collect_env)
    init_driver = DynamicStepDriver(
        tf_collect_env,
        random_policy,
        observers=[replay_buffer.add_batch],
        num_steps=200) 
     init_driver.run()

如果有人能解释我在这里监督什么,我会非常感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-24 13:40:50

完整的修复如下所示..。

-->维度问题有效,应表明(上传的)批处理样本的形状不正确

->发生此问题的原因是"add_batch“方法加载形状错误的值

代码语言:javascript
复制
    rb_observer = replay_buffer.add_batch

长话短说,这句话应该用

代码语言:javascript
复制
  rb_observer = lambda x: replay_buffer.add_batch(batch_nested_array(x))

完整的重放缓冲区如下所示:

代码语言:javascript
复制
  # create buffer for storing experience
  replay_buffer = tf_uniform_replay_buffer.TFUniformReplayBuffer(
    agent.collect_data_spec,
    1,
    max_length=1000000)

 # create batch dataset
  dataset = replay_buffer.as_dataset( 
      sample_batch_size=32,
      num_steps = 2,
      single_deterministic_pass=False).prefetch(4)

  # create batched nested array input for rb_observer
  rb_observer = lambda x: replay_buffer.add_batch(batch_nested_array(x))

  # create batched readout of dataset
  experience_dataset_fn = lambda: dataset
票数 0
EN

Stack Overflow用户

发布于 2022-11-22 12:17:58

我修复了it...partly,但是下一个错误(在我看来)是一个架构问题。

问题是Actor/Learner设置是在PyEnvironment上构建的,而TFUniformReplayBuffer使用的是最终导致上述故障的TFPyEnvironment。

使用带有转换的py规范的PyUniformReplayBuffer解决了这个问题。

代码语言:javascript
复制
    from tf_agents.specs import tensor_spec
    
    # convert agent spec to py-data-spec 
    py_collect_data_spec = tensor_spec.to_array_spec(agent.collect_data_spec)
    
    # create replay buffer based on the py-data-spec
    replay_buffer = py_uniform_replay_buffer.PyUniformReplayBuffer(
        data_spec= py_collect_data_spec,
        capacity=replay_capacity*batch_size
        )

这个片段解决了后台有一个不兼容的缓冲区的问题,但最终导致了另一个问题-> add_batch函数无法工作。

我发现了这种方法,它建议使用批处理环境或为重放观察者(add_batch方法)进行以下调整。

代码语言:javascript
复制
  from tf_agents.utils.nest_utils import batch_nested_array
  
  #********* Adpations add_batch method - START  *********#
  rb_observer = lambda x: replay_buffer.add_batch(batch_nested_array(x))
  #********* Adpations add_batch method - END    *********#

  # create batch dataset
  dataset = replay_buffer.as_dataset( 
      sample_batch_size=32,
      single_deterministic_pass=False)
  
  experience_dataset_fn = lambda: dataset

这帮助我解决了关于这篇文章的问题,但现在我遇到了另一个问题,我需要问tf-特工团队的人……

对于任何有同样问题的人:我创建这份吉顿号的报告只是为了获得更多的答案和/或解决我缺乏知识的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74503788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档