TF Agents:如何将伪造的观察结果输入经过训练的深度 Q 网络模型以检查它选择哪些操作?

2023-12-21

以下问题中引用的所有链接描述均来自 2021 年 5 月 31 日。

我按照以下版本训练了一个深度 Q 网络TF 特工教程 https://www.tensorflow.org/agents/tutorials/1_dqn_tutorial关于自定义问题。现在我想向它提供一些手工观察结果,看看它建议采取什么行动。我有一些实用函数来创建我在 PyEnvironment 中使用的这些特征向量。但是,我不确定如何转换这些位以输入网络。

我想要的是类似以下内容:

  1. 在初始状态下馈送,并查看来自网络的推荐操作。
  2. 接下来手动改变口味,看看网络推荐什么。
  3. 等等...

我的环境有一个随机组件,因此我想手动修改环境状态,而不是让代理显式地采用环境中的路径。

为了在这个问题上取得进展,我一直在研究这个政策辅导 https://www.tensorflow.org/agents/tutorials/3_policies_tutorial。看起来,我的用例可能类似于“随机 TF 策略”部分或下面的“Actor 策略”部分。然而,在我的用例中,我有一个已加载的代理,并且有 Python(非 TF)观察、时间规范和操作规范。驱动我的网络从这些组件中产生操作的理想方法是什么?

这是我尝试过的:

saved_policy = tf.compat.v2.saved_model.load(policy_dir)
# get_feat_vector returns an numpy.ndarray
observation = tf.convert_to_tensor(state.get_feat_vector(), dtype=tf.float32)
time_step = ts.restart(observation)
action_step = saved_policy.action(time_step)

以及相关的错误消息:

File "/home/---/.local/lib/python3.8/site-packages/tensorflow/python/saved_model/function_deserialization.py", line 267, in restored_function_body
    raise ValueError(
ValueError: Could not find matching function to call loaded from the SavedModel. Got:
  Positional arguments (2 total):
    * TimeStep(step_type=<tf.Tensor 'time_step:0' shape=() dtype=int32>, reward=<tf.Tensor 'time_step_1:0' shape=() dtype=float32>, discount=<tf.Tensor 'time_step_2:0' shape=() dtype=float32>, observation=<tf.Tensor 'time_step_3:0' shape=(170,) dtype=float32>)
    * ()
  Keyword arguments: {}

Expected these arguments to match one of the following 2 option(s):

Option 1:
  Positional arguments (2 total):
    * TimeStep(step_type=TensorSpec(shape=(None,), dtype=tf.int32, name='step_type'), reward=TensorSpec(shape=(None,), dtype=tf.float32, name='reward'), discount=TensorSpec(shape=(None,), dtype=tf.float32, name='discount'), observation=TensorSpec(shape=(None, 170), dtype=tf.float32, name='observation'))
    * ()
  Keyword arguments: {}

Option 2:
  Positional arguments (2 total):
    * TimeStep(step_type=TensorSpec(shape=(None,), dtype=tf.int32, name='time_step/step_type'), reward=TensorSpec(shape=(None,), dtype=tf.float32, name='time_step/reward'), discount=TensorSpec(shape=(None,), dtype=tf.float32, name='time_step/discount'), observation=TensorSpec(shape=(None, 170), dtype=tf.float32, name='time_step/observation'))
    * ()
  Keyword arguments: {}

我相信您的问题可能与加载和保存模型的方式有关。 TF-Agents 建议使用 PolicySaver(请参阅here https://www.tensorflow.org/agents/tutorials/10_checkpointer_policysaver_tutorial#policy_saver)。所以也许尝试运行类似的代码

tf_agent = ...
tf_policy_saver = policy_saver.PolicySaver(policy=tf_agent.policy)

... # train agent

tf_policy_saver.save(export_dir=policy_dir_path)

然后加载并运行模型:

eager_py_policy = py_tf_eager_policy.SavedModelPyTFEagerPolicy(
    policy_dir, env.time_step_spec(), env.action_spec())

policy_state = eager_py_policy.get_initial_state(1)
time_step = env.reset()
action_step = eager_py_policy.action(time_step, policy_state)
time_step = env.step(action_step.action)
policy_state = action_step.state

或者您想对环境和观察进行任何手动操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TF Agents:如何将伪造的观察结果输入经过训练的深度 Q 网络模型以检查它选择哪些操作? 的相关文章

随机推荐