ValueError: Error when checking input: expected dense_input to have 2 dimensions, but got array with shape (1, 1, 15)
ValueError: Error when checking input: expected dense_input to have 2 dimensions, but got array with shape (1, 1, 15)
我正在尝试创建一个自定义 Gym 环境,以便我可以在 Keras 网络中使用它。但是当我尝试拟合去神经网络时,我遇到了一个问题。
ValueError: Error when checking input: expected dense_6_input to have 2 dimensions, but got array with shape (1, 1, 15)
我对这个问题的理解是状态(网络接收的输入)被构造为一个 3 维数组,但我不知道为什么。
这是我在 class 中定义环境的初始化方法:
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 (密集) (None, 24) 384
dense_7 (密集) (None, 24) 600
dense_8 (密集) (None, 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) 但似乎不起作用。也许问题与环境的定义(观察 space)或环境如何向网络提供信息有关。我不知道...
希望你能帮助我。如果您需要更多信息来处理错误,请告诉我。
非常感谢!
在您的情况下,输入形状应为 (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 所期望的。
我正在尝试创建一个自定义 Gym 环境,以便我可以在 Keras 网络中使用它。但是当我尝试拟合去神经网络时,我遇到了一个问题。
ValueError: Error when checking input: expected dense_6_input to have 2 dimensions, but got array with shape (1, 1, 15)
我对这个问题的理解是状态(网络接收的输入)被构造为一个 3 维数组,但我不知道为什么。
这是我在 class 中定义环境的初始化方法:
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 (密集) (None, 24) 384
dense_7 (密集) (None, 24) 600
dense_8 (密集) (None, 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) 但似乎不起作用。也许问题与环境的定义(观察 space)或环境如何向网络提供信息有关。我不知道...
希望你能帮助我。如果您需要更多信息来处理错误,请告诉我。
非常感谢!
在您的情况下,输入形状应为 (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 所期望的。