我在自动驾驶领域有一个基于代理的模型,我有 50 多个不同的代理。其中一个是“聪明人”,他使用 DQN 来选择动作,该 DQN 是通过包中定义DQNAgent
的。keras-rl
由于我有多个由模型运行的代理,因此我不能使用gym.Env
,因为实际上模型执行代理的 step 方法,但没有代理执行环境的 step 方法,因为它通常在 RL 中。
所以。DQNAgent
我在 keras类上做了一个小包装:
class AutoDQN():
def __init__(self, actions_number=25, state_shape=(7,)):
model = self.create_default_model(actions_number, state_shape)
memory = SequentialMemory(limit=10000, window_length=1)
policy = LinearAnnealedPolicy(EpsGreedyQPolicy(), attr='eps', value_max=1., value_min=.1, value_test=.05, nb_steps=1000)
gamma = 0.99
nb_actions = actions_number
batch_size = 32
nb_steps_warmup = 50
target_model_update = 0.01
lr = 0.001
metrics = ['mse']
optimizer = Adam(lr=lr)
self.dqn = DQNAgent(model=model, policy=policy, memory=memory, nb_actions=nb_actions,batch_size=batch_size, nb_steps_warmup=nb_steps_warmup, target_model_update=target_model_update, gamma=gamma)
self.dqn.training = True
self.dqn.compile(optimizer=optimizer, metrics=metrics)
def create_default_model(self, actions_number, state_shape):
model = Sequential()
model.add(Flatten(input_shape=(1,) + state_shape))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(actions_number))
model.add(Activation('linear'))
return model
def act(self, current_state):
return self.dqn.forward(current_state)
def observe(self, reward, terminal):
return self.dqn.backward(reward, terminal)
由于我也了解 Q-learning 和 DQN 的理论,我认为调用forward
和类的backward
方法DQNAgent
足以完成这项工作。还有一些保存权重的方法,我在 1000 次迭代后保存它们,也target_update
完成了。有 25 个离散动作,状态有 7 个数值。在模型计算出代理的新位置后,从模型接收奖励,然后她返回奖励,该奖励返回到backward
方法中的 DQN。
从理论上讲,据我了解,这正是 DQN 的实际工作方式,因为下面有贝尔曼方程的所有组件,至少我在查看keras-rl
github 上的源代码时有这样的印象。是的,我不使用fit
方法,因为我不使用健身房环境,但我认为它实际上不是 100% 必需的。但是看着我的 DQN 测试的糟糕结果,我决定问一个问题:我的尝试是否失败,即没有gym.Env
andfit
方法根本不可能?或者也许有更聪明的方法来调整它?