0

我在自动驾驶领域有一个基于代理的模型,我有 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-rlgithub 上的源代码时有这样的印象。是的,我不使用fit方法,因为我不使用健身房环境,但我认为它实际上不是 100% 必需的。但是看着我的 DQN 测试的糟糕结果,我决定问一个问题:我的尝试是否失败,即没有gym.Envandfit方法根本不可能?或者也许有更聪明的方法来调整它?

4

0 回答 0