具有定制健身房环境的TensorFlow:层“dense_6”需要1个输入,但收到2个输入Tensor

nvbavucw  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(188)

我正在尝试使用TF来解决一个自定义的健身房环境,都在谷歌Colab内。

  • 主脚本是TF“DQN教程”,可在此处获得。
  • 我使用env_name = "gym_examples/GridWorld-v0"代替env_name = "CartPole-v0",其中gym_examples/GridWorld-v0是gym文档中描述的示例自定义环境。(该示例使用gym v0.25.0,但TF要求gym〈= v0.23.0,因此我还必须对渲染代码进行一些调整,使其在v0.23.0中工作。)

环境通过env = suite_gym.load(env_name)加载正常,后续代码单元也运行正常,直到出现以下两个单元:
第一个
在该单元格之后,我得到一个错误:

ValueError: Exception encountered when calling layer "sequential_2" (type Sequential).

Layer "dense_6" expects 1 input(s), but it received 2 input tensors. Inputs received: [<tf.Tensor: shape=(1, 2), dtype=int64, numpy=array([[2, 2]])>, <tf.Tensor: shape=(1, 2), dtype=int64, numpy=array([[3, 2]])>]

Call arguments received by layer "sequential_2" (type Sequential):
  • inputs={'agent': 'tf.Tensor(shape=(1, 2), dtype=int64)', 'target': 'tf.Tensor(shape=(1, 2), dtype=int64)'}
  • network_state=()
  • kwargs={'step_type': 'tf.Tensor(shape=(1,), dtype=int32)', 'training': 'None'}
  In call to configurable 'DqnAgent' (<class 'tf_agents.agents.dqn.dqn_agent.DqnAgent'>)

我是一个太多的TF新手,不明白这里发生了什么。我怀疑这是因为动作状态从2个状态(在CartPole中)变成了4个状态(在自定义GridWorld环境中)。但除此之外,我无法理解。

3okqufwl

3okqufwl1#

这可以通过使用Embedding layer作为第一层来解决。在本例(Embedding(16, 4))中,16是网格大小(4x4),4是输出尺寸。

dense_layers = [dense_layer(num_units) for num_units in fc_layer_params]

例如,用下面的代码替换上面的行将消 debugging 误。

dense_layers = [
        # First layer
        tf.keras.layers.Embedding(16, 4),

        # Other layers
        tf.keras.layers.Dense(100, activation=tf.keras.activations.relu)
    ]

来源及进一步解释:https://martin-ueding.de/posts/reinforcement-learning-with-frozen-lake/

相关问题