【问题标题】:Tensorflow 2.0 DQN Agent Issue with Custom Environment带有自定义环境的 TensorFlow 2.0 DQN 代理问题
【发布时间】:2020-03-27 05:09:07
【问题描述】:

所以我一直在关注 DQN 代理示例/教程,并按照示例中的方式进行设置,唯一的区别是我构建了自己的自定义 python 环境,然后将其封装在 TensorFlow 中。然而,无论我如何塑造我的观察和行动规范,每当我对其进行观察并要求采取行动时,我似乎都无法让它发挥作用。这是我得到的错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: In[0] 是 不是矩阵。相反,它的形状为 [10] [Op:MatMul]

这是我设置代理的方式:

layer_parameters = (10,) #10 layers deep, shape is unspecified

#placeholders 
learning_rate = 1e-3  # @param {type:"number"}
train_step_counter = tf.Variable(0)

#instantiate agent

optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate)

env = SumoEnvironment(self._num_actions,self._num_states)
env2 = tf_py_environment.TFPyEnvironment(env)
q_net= q_network.QNetwork(env2.observation_spec(),env2.action_spec(),fc_layer_params = layer_parameters)

print("Time step spec")
print(env2.time_step_spec())

agent = dqn_agent.DqnAgent(env2.time_step_spec(),
env2.action_spec(),
q_network=q_net,
optimizer = optimizer,
td_errors_loss_fn=common.element_wise_squared_loss,
train_step_counter=train_step_counter)

以下是我设置环境的方式:

class SumoEnvironment(py_environment.PyEnvironment):

def __init__(self, no_of_Actions, no_of_Observations):

    #this means that the observation consists of a number of arrays equal to self._num_states, with datatype float32
    self._observation_spec = specs.TensorSpec(shape=(16,),dtype=np.float32,name='observation')
    #action spec, shape unknown, min is 0, max is the number of actions
    self._action_spec = specs.BoundedArraySpec(shape=(1,),dtype=np.int32,minimum=0,maximum=no_of_Actions-1,name='action')


    self._state = 0
    self._episode_ended = False

这是我的输入/观察的样子:

tf.Tensor([0.0.0.0.0.0.0.0.-1.-1.-1.-1.0.0.0.-1.], shape=(16,), dtype=float32)

我尝试过尝试我的 Q_Net 的形状和深度,在我看来,错误中的 [10] 与我的 q 网络的形状有关。将其层参数设置为 (4,) 会产生以下错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: In[0] 是 不是矩阵。相反,它具有形状 [4] [Op:MatMul]

【问题讨论】:

标签: python tensorflow tensorflow2.0 agent dqn


【解决方案1】:

在您的python环境中,您应该将self._observation_spec定义为BoundedArraySpec类型而不是TensorSpec,然后tf_py_environment.TFPyEnvironment(env)将python环境转换为tensorflow环境。

不确定是否会导致该错误,但至少是代码的问题。

【讨论】:

    【解决方案2】:

    您可以尝试如下设置图层参数,

    layer_parameters = (16,)

    q 网络会尝试通过当前状态来预测下一个动作。状态的形状应该与 q 网络的底层 fc 网络的输入相匹配。

    【讨论】:

      【解决方案3】:

      从错误消息中的关键字 ma​​trix 来看,我认为 TF 需要一个二维张量而不是一维张量。

      我建议将图层参数设置为(4, 1)(或(1, 4))。

      我会尝试使用它来验证我的答案。

      【讨论】:

      • 这是我尝试的第一件事。但无论我如何塑造我的 q_net 层,我似乎都无法让它发挥作用。尝试了 (4,4) 和 (10,10),但问题仍然存在