【问题标题】:ValueError: Error when checking input: expected dense_input to have 2 dimensions, but got array with shape (1, 1, 15)ValueError:检查输入时出错:预期的dense_input有2维,但得到了形状为(1、1、15)的数组
【发布时间】:2021-07-04 02:53:02
【问题描述】:

我正在尝试制作一个自定义的健身房环境,以便我可以在 Keras 网络中使用它。但是当我尝试拟合神经网络时,我遇到了一个问题。

ValueError: Error when checking input: expected dense_6_input to have 2 dimensions, but got array with shape (1, 1, 15)

我对这个问题的理解是状态(网络接收的输入)被构造为一个 3 维数组,但我不知道为什么。

这是我在定义环境的类中的 init 方法:

def __init__ (self):
    self.action_space = Discrete (4)
    self.observation_space = Box(low=0, high=100, shape=(15,))
    self.state = np.array([1,2,0,3,2,0,4,0,0,1,3,0,0,0,0], dtype=float)
    #self.state = state
    self.length = 15
    self.index = 0

之后,我初始化了两个变量来保存状态和动作的形状,这样我们就可以定义模型了。

states = env.observation_space.shape
actions = env.action_space.n

def build_model(states, actions):
model = Sequential()    
model.add(Dense(24, activation='relu', input_shape=states))
model.add(Dense(24, activation='relu'))
model.add(Dense(actions, activation='linear'))
return model

模型总结:

图层(类型)输出形状参数#
dense_6(密集)(无,24)384
dense_7(密集)(无,24)600
dense_8(密集)(无,4)100

错误前的最后一步是我构建代理时。之后我们调用fit方法就出现了问题。

def build_agent(model, actions):
   policy = BoltzmannQPolicy()
   memory = SequentialMemory(limit=50000, window_length=1)
   dqn = DQNAgent(model=model, memory=memory, policy=policy, 
              nb_actions=actions, nb_steps_warmup=10, target_model_update=1e-2)
   return dqn

dqn = build_agent(model, actions)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])
dqn.fit(env, nb_steps=50000, visualize=False, verbose=1)

我尝试将第一层的 input_shape 更改为 (1, 1, 15) 但似乎不起作用。也许问题与环境(观察空间)的定义或环境如何向网络提供信息有关。我不知道...

我希望你能帮助我。如果您需要更多信息来处理错误,请告诉我。

非常感谢!

【问题讨论】:

  • 您是否尝试将输入形状更改为 (1,15)?
  • 成功了!!首先,它返回了另一个错误,但它很快解决了在模型末尾添加一个 Flatten 层。非常感谢!!
  • 很高兴听到这个消息 :) 我已经写下了我的答案,如果能得到“接受”,将不胜感激
  • @ManuJiménez:你到底在哪里添加了 Flatten 层?在model.add(Dense(actions, activation='linear')) 之后或之前?

标签: python tensorflow keras neural-network openai-gym


【解决方案1】:

在您的情况下,输入形状应为 (1,15)。这是因为当 keras 批量处理输入时,实际输入形状比您在 shape 中指定的维度增加了一个额外的维度,批量大小是第一个参数。

错误消息告诉您形状 (1,1,15) 的输入正在传递给模型(即批量 1,输入形状 (1,15),因此 ndims=3),但您只有ndims = 2。尽管只传递了 (15,) 作为输入形状,但请注意 ndims = 2。这是因为 Keras 正在为批处理添加一个额外的维度。

所以要修复,设置shape=(1,15),然后将其处理为(1,1,15),这是 Keras 所期望的。

【讨论】:

  • 我得到了与线程海报完全相同的错误,我通过在模型中插入`input_shape=(1,11)` 尝试了您建议的方法。不幸的是,我收到错误“ValueError:模型输出”Tensor(“dense_37/BiasAdd:0”,shape=(None, 1, 3), dtype=float32)" has invalid shape。DQN 需要一个模型,每个模型都有一个维度行动,在这种情况下 3."。有什么想法可以解决这个问题吗?
  • 您写道“所以要修复,设置 shape=(1,15),然后将其处理为 Keras 所期望的 (1,1,15)。” --> 为什么这会被处理为 (1,1,15) 而不是 (None, 1, 15)?我以为 Keras 总是在输入向量中添加“None”,因为批量大小未知?
  • 你是对的,但这里有两种不同的情况。第一个是 keras 为模型创建的“蓝图”,它发生在任何数据通过模型之前,并允许 Keras 检查一切是否正确。此时,形状为 (None, 1, 15)。但是在训练期间,批量大小为 1,这将等于 (1,1,15)。
  • 感谢 ML_Engine 的回答。为什么批量大小应该为 1?这是否意味着我们只使用 1 个数据点进行训练(这对我来说没有任何意义)?此外,您是否知道如何摆脱使用您建议的方法时出现的错误“ValueError:模型输出”Tensor(“dense_37/BiasAdd:0”, shape=(None, 1, 3), dtype= float32)" 的形状无效。DQN 需要一个模型,每个动作都有一个维度,在本例中为 3."。"
  • 我的最后一条评论有任何 cmet 吗?
猜你喜欢
  • 1970-01-01
  • 2020-05-17
  • 2019-02-12
  • 2022-10-16
  • 1970-01-01
  • 2019-05-04
  • 2021-01-24
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多