TF 代理:如何将伪造的观察结果输入经过训练的深度 Q 网络模型以检查它选择了哪些动作?
TF Agents: How to feed faked observations in to a trained deep Q network model to examine which actions it chooses?
以下问题中引用的所有链接描述均来自 2021/05/31。
我已经按照 TF Agents tutorial 版本的自定义问题训练了深度 Q 网络。现在我想给它一些手工观察,看看它推荐什么动作。我有一些实用函数来创建我在 PyEnvironment 中使用的这些特征向量。但是,我不确定如何将这些位转换为馈入网络。
我想要的是如下内容:
- 初始状态喂食,看网络推荐动作
- 手动修改状态,看网络推荐,下一步。
- 等等...
我的环境有一个随机组件,所以我想手动修改环境状态,而不是让代理显式地选择一条路径穿过环境。
为了在这个问题上取得进展,我一直在研究这个tutorial on policies。看起来,我的用例可能类似于“随机 TF 策略”部分或下面的“参与者策略”部分。但是,在我的用例中,我有一个加载的代理并且有 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)。所以也许可以尝试 运行ning 代码
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
或者任何您想对环境和观察进行的手动操作。
以下问题中引用的所有链接描述均来自 2021/05/31。
我已经按照 TF Agents tutorial 版本的自定义问题训练了深度 Q 网络。现在我想给它一些手工观察,看看它推荐什么动作。我有一些实用函数来创建我在 PyEnvironment 中使用的这些特征向量。但是,我不确定如何将这些位转换为馈入网络。
我想要的是如下内容:
- 初始状态喂食,看网络推荐动作
- 手动修改状态,看网络推荐,下一步。
- 等等...
我的环境有一个随机组件,所以我想手动修改环境状态,而不是让代理显式地选择一条路径穿过环境。
为了在这个问题上取得进展,我一直在研究这个tutorial on policies。看起来,我的用例可能类似于“随机 TF 策略”部分或下面的“参与者策略”部分。但是,在我的用例中,我有一个加载的代理并且有 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)。所以也许可以尝试 运行ning 代码
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
或者任何您想对环境和观察进行的手动操作。