【发布时间】:2021-02-19 09:54:51
【问题描述】:
我正在尝试构建一个强化学习代理来学习自定义环境,该环境是根据 openai 的健身房规范构建的。
我有 np 个大小为 (20, 7) 的数组,我想将其传递给网络,并输出 7 个动作之一。
我在构建实际网络时遇到了麻烦,因为我想包含 LSTM 层。我的代码如下:
def build_model():
model = Sequential()
model.add(LSTM(60, return_sequences = True, input_shape=(20, 7), activation = 'relu'))
model.add(Dense(21, activation = "relu"))
model.add(Flatten())
model.add(Dense(7, activation="linear"))
model.compile(loss="mse", optimizer=Adam(lr=0.0002), metrics=['accuracy'])
return model
但是,当我构建代理时,突然添加了一个网络未预料到的额外维度:
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)
ValueError: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (1, 1, 20, 7)
我不完全确定代理为什么要重塑数据以添加一个额外的维度,(或两个?)但如果有人知道如何阻止这种情况发生以便我可以训练我的网络,我将非常感激。我的解决方案在我自己编写代码时运行,但我想使用 keras rl-2 库。
提前致谢!
【问题讨论】:
标签: python tensorflow keras reinforcement-learning