Keras-rl ValueRror“模型具有多个输出。 DQN期望具有单个输出的模型。

发布于 2025-02-06 01:49:44 字数 2774 浏览 5 评论 0原文

有什么方法可以解决此错误?我有一个具有15x15输入网格的模型,可导致两个输出。每个输出具有15个可能的值,即X或Y坐标。我之所以这样做,是因为它比对于网格上的每个位置具有225个单独的输出要简单得多。 问题在于,当我尝试使用此代码训练模型时:

def build_agent(model,actions)
  policy = BoltzmannQPolicy()
  memory = SequentialMemory(limit=100000, window_length=1)
  dqn = DQNAgent(model=model, memory=memory,policy=policy,nb_actions=actions,nb_steps_warmup=100, target_model_update=1e-2)
  return(dqn)
dqn = build_agent(model, np.array([15,15]))
dqn.compile(Adam(learning_rate = 0.01), metrics=['mae'])
dqn.fit(env, nb_steps=10000, action_repetition=1, visualize=False, verbose=1,nb_max_episode_steps=10000)
plt.show()

我会发现错误:“模型有一个以上的输出。DQN期望具有单个输出的模型”。 模型摘要在下面,因此您可以看到有2个输出层。

Model: "model_1"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_2 (InputLayer)           [(None, 1, 15, 15)]  0           []                               
                                                                                                  
 conv2d_2 (Conv2D)              (None, 12, 13, 13)   120         ['input_2[0][0]']                
                                                                                                  
 conv2d_3 (Conv2D)              (None, 10, 11, 3)    354         ['conv2d_2[0][0]']               
                                                                                                  
 flatten_1 (Flatten)            (None, 330)          0           ['conv2d_3[0][0]']               
                                                                                                  
 dropout_1 (Dropout)            (None, 330)          0           ['flatten_1[0][0]']              
                                                                                                  
 dense_2 (Dense)                (None, 15)           4965        ['dropout_1[0][0]']              
                                                                                                  
 dense_3 (Dense)                (None, 15)           4965        ['dropout_1[0][0]']              
                                                                                                  
==================================================================================================
Total params: 10,404
Trainable params: 10,404
Non-trainable params: 0
__________________________________________________________________________________________________

标准KERAS允许使用功能API具有多个输出的模型,但是从ERRPR消息中,我认为该功能不支持KERAS-RL?如果那是真的,有什么办法可以解决这个问题吗?

Is there any way to get around this error? I have a model with a 15x15 input grid, which leads to two outputs. Each output has 15 possible values, which are x or y coordinates. I did this because it is significantly simpler than having 225 separate outputs for every location on the grid.
The problem is that when i try to train the model using this code:

def build_agent(model,actions)
  policy = BoltzmannQPolicy()
  memory = SequentialMemory(limit=100000, window_length=1)
  dqn = DQNAgent(model=model, memory=memory,policy=policy,nb_actions=actions,nb_steps_warmup=100, target_model_update=1e-2)
  return(dqn)
dqn = build_agent(model, np.array([15,15]))
dqn.compile(Adam(learning_rate = 0.01), metrics=['mae'])
dqn.fit(env, nb_steps=10000, action_repetition=1, visualize=False, verbose=1,nb_max_episode_steps=10000)
plt.show()

I get the error: "Model has more than one output. DQN expects a model that has a single output".
The model summary is below so you can see there are 2 output layers.

Model: "model_1"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_2 (InputLayer)           [(None, 1, 15, 15)]  0           []                               
                                                                                                  
 conv2d_2 (Conv2D)              (None, 12, 13, 13)   120         ['input_2[0][0]']                
                                                                                                  
 conv2d_3 (Conv2D)              (None, 10, 11, 3)    354         ['conv2d_2[0][0]']               
                                                                                                  
 flatten_1 (Flatten)            (None, 330)          0           ['conv2d_3[0][0]']               
                                                                                                  
 dropout_1 (Dropout)            (None, 330)          0           ['flatten_1[0][0]']              
                                                                                                  
 dense_2 (Dense)                (None, 15)           4965        ['dropout_1[0][0]']              
                                                                                                  
 dense_3 (Dense)                (None, 15)           4965        ['dropout_1[0][0]']              
                                                                                                  
==================================================================================================
Total params: 10,404
Trainable params: 10,404
Non-trainable params: 0
__________________________________________________________________________________________________

Standard Keras allows a model with multiple outputs using the functional api but from the errpr message i assume that feature is just not supported for Keras-rl? If thats true, is there any way to get around this issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缘字诀 2025-02-13 01:49:44

解决方案是我只需要使用一个225的输出。这不太好,但这是我能找到的最好的。使用keras-rl两个不同的输出将无法使用,因此这就是我能想到的。另一种可能性是使用不同的库,例如稳定的基线2,但这与已经构建的代码完全不同。

The solution was that i had to just use one output of 225. This didn't work great, but it was the best i could find. Two different outputs will not work using keras-rl, so this was all i could think of. Another possibility would be using a different library such as stable baselines2, but that would be completely different to the already built code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文