我尝试将这个tf-agents actor<->learner dimensional示例修改到我的windows机器上,使用的是TFUniformReplayBuffer,而不是仅在linux机器上工作的ReverbReplayBuffer,但我面临一个维度问题。
[...]
---> 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)。
我的代码如下:
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方法的知识缺陷。
先前的(成功)尝试:
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()如果有人能解释我在这里监督什么,我会非常感激的。
发布于 2022-11-24 13:40:50
完整的修复如下所示..。
-->维度问题有效,应表明(上传的)批处理样本的形状不正确
->发生此问题的原因是"add_batch“方法加载形状错误的值
rb_observer = replay_buffer.add_batch长话短说,这句话应该用
rb_observer = lambda x: replay_buffer.add_batch(batch_nested_array(x))完整的重放缓冲区如下所示:
# 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发布于 2022-11-22 12:17:58
我修复了it...partly,但是下一个错误(在我看来)是一个架构问题。
问题是Actor/Learner设置是在PyEnvironment上构建的,而TFUniformReplayBuffer使用的是最终导致上述故障的TFPyEnvironment。
使用带有转换的py规范的PyUniformReplayBuffer解决了这个问题。
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方法)进行以下调整。
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-特工团队的人……
对于任何有同样问题的人:我创建这份吉顿号的报告只是为了获得更多的答案和/或解决我缺乏知识的问题。
https://stackoverflow.com/questions/74503788
复制相似问题