【发布时间】:2020-02-27 16:05:24
【问题描述】:
我正在尝试使用 tf_agents 库通过批量学习来训练 DDPG 代理。但是,我需要定义一个 observation_spec 和 action_spec 来说明代理将接收到的张量的形状。我已经设法创建了可以提供数据的轨迹,但是这些轨迹和代理本身的形状不匹配
我尝试使用代理定义更改观察和操作规范。这是我的代理定义:
observation_spec = TensorSpec(shape = (1,),dtype = tf.float32)
time_step_spec = time_step.time_step_spec(observation_spec)
action_spec = BoundedTensorSpec([1],tf.float32,minimum = -100, maximum = 100)
actor_network = ActorNetwork(
input_tensor_spec=observation_spec,
output_tensor_spec=action_spec,
fc_layer_params=(100,200,100),
name="ddpg_ActorNetwork"
)
critic_net_input_specs = (observation_spec, action_spec)
critic_network = CriticNetwork(
input_tensor_spec=critic_net_input_specs,
observation_fc_layer_params=(200,100),
joint_fc_layer_params=(100,200),
action_fc_layer_params=None,
name="ddpg_CriticNetwork"
)
agent = ddpg_agent.DdpgAgent(
time_step_spec=time_step_spec,
action_spec=action_spec,
actor_network=actor_network,
critic_network=critic_network,
actor_optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
critic_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
)
这就是轨迹的样子
Trajectory(step_type=<tf.Variable 'Variable:0' shape=(1, 2) dtype=int32, numpy=array([[0, 1]], dtype=int32)>, observation=<tf.Variable 'Variable:0' shape=(1, 2) dtype=int32, numpy=array([[280, 280]], dtype=int32)>, action=<tf.Variable 'Variable:0' shape=(1, 2) dtype=float64, numpy=array([[nan, 0.]])>, policy_info=(), next_step_type=<tf.Variable 'Variable:0' shape=(1, 2) dtype=int32, numpy=array([[1, 1]], dtype=int32)>, reward=<tf.Variable 'Variable:0' shape=(1, 2) dtype=float64, numpy=array([[ -6.93147181, -12.14113521]])>, discount=<tf.Variable 'Variable:0' shape=(1, 2) dtype=float32, numpy=array([[0.9, 0.9]], dtype=float32)>)
我应该能够调用 agent.train(trajectory) 并且它会工作但是我收到以下错误:
ValueError Traceback (most recent call last)
<ipython-input-325-bf162a5dc8d7> in <module>
----> 1 agent.train(trajs[0])
~/.local/lib/python3.7/site-packages/tf_agents/agents/tf_agent.py in train(self, experience, weights)
213 "experience must be type Trajectory, saw type: %s" % type(experience))
214
--> 215 self._check_trajectory_dimensions(experience)
216
217 if self._enable_functions:
~/.local/lib/python3.7/site-packages/tf_agents/agents/tf_agent.py in _check_trajectory_dimensions(self, experience)
137 if not nest_utils.is_batched_nested_tensors(
138 experience, self.collect_data_spec,
--> 139 num_outer_dims=self._num_outer_dims):
140 debug_str_1 = tf.nest.map_structure(lambda tp: tp.shape, experience)
141 debug_str_2 = tf.nest.map_structure(lambda spec: spec.shape,
~/.local/lib/python3.7/site-packages/tf_agents/utils/nest_utils.py in is_batched_nested_tensors(tensors, specs, num_outer_dims)
142 'And spec_shapes:\n %s' %
143 (num_outer_dims, tf.nest.pack_sequence_as(tensors, tensor_shapes),
--> 144 tf.nest.pack_sequence_as(specs, spec_shapes)))
145
146
ValueError: Received a mix of batched and unbatched Tensors, or Tensors are not compatible with Specs. num_outer_dims: 2.
Saw tensor_shapes:
Trajectory(step_type=TensorShape([1, 2]), observation=TensorShape([1, 2]), action=TensorShape([1, 2]), policy_info=(), next_step_type=TensorShape([1, 2]), reward=TensorShape([1, 2]), discount=TensorShape([1, 2]))
And spec_shapes:
Trajectory(step_type=TensorShape([]), observation=TensorShape([1]), action=TensorShape([1]), policy_info=(), next_step_type=TensorShape([]), reward=TensorShape([]), discount=TensorShape([]))
【问题讨论】:
-
我也有类似的问题。我正在尝试让 DQN 代理工作,但我遇到了同样的问题。您是否有机会设法找到解决方案?这是我得到的错误。 ValueError: 接收到混合的批处理和非批处理张量,或者张量与规格不兼容。 num_outer_dims: 0. Saw tensor_shapes: TimeStep(step_type=TensorShape([]), reward=TensorShape([]), discount=TensorShape([]),observation=TensorShape([4, 4])) 和spec_shapes: TimeStep(step_type =TensorShape([]),reward=TensorShape([]),discount=TensorShape([]),observation=TensorShape([4]))
-
@IbraheemNofal 这几乎是一回事。我不知道如何使用 DQN,但我为 DDPG 提出了一个 github 问题,一位贡献者告诉我 DDPG 接受什么形状。从这个开始,我能够为我的重播缓冲区更改数据规范的形状。这得到了 DDPG 培训,但没有收敛。如果您有兴趣:github.com/tensorflow/agents/issues/236
-
这个问题有解决办法吗?
标签: python tensorflow reinforcement-learning tensor