Dueling DQN代码实现

Dueling DQN代码实现

  • Dueling DQN与DQN之间只有网络结构不同,训练方式是完全相同的,因此只要在DQN代码的基础上修改其网络结构就得到了Dueling DQN的实现代码。

代码分析

  • 跑Dueling DQN时,将回报折扣率设置得大点。
parser.add_argument('--gamma', type=float, default=0.995)
  • 以下是创建网络结构的代码:
def create_model(input_state_shape):
    input_layer = tl.layers.Input(input_state_shape)
    layer_1 = tl.layers.Dense(n_units=256, act=tf.nn.relu)(input_layer)
    layer_2 = tl.layers.Dense(n_units=128, act=tf.nn.relu)(layer_1)

    state_hidden = tl.layers.Dense(n_units=64)(layer_2)
    adv_hidden = tl.layers.Dense(n_units=64)(layer_2)

    # state value
    state_value = tl.layers.Dense(n_units=1)(state_hidden)
    # advantage value
    adv_value = tl.layers.Dense(n_units=self.action_dim)(adv_hidden)

    mean = tl.layers.Lambda(lambda x: tf.reduce_mean(x, axis=1, keepdims=True))(adv_value)
    advantage = tl.layers.ElementwiseLambda(lambda x, y: x-y)([adv_value, mean])
    # output
    output_layer = tl.layers.ElementwiseLambda(lambda x, y: x+y)([state_value, advantage])
    return tl.models.Model(inputs=input_layer, outputs=output_layer)
  • tl.layers.Lambda与tl.layers.ElementwiseLambda的作用一样,都是让用户在构建Squential时使用自定义的函数或者tensorflow 函数,区别是Lambda方法接收的函数只能接受一个输入,而ElementwiseLambda能接收多个输入。
    • 如在语句tl.layers.ElementwiseLambda(lambda x, y: x-y)([a_value, mean])中,就是使用lambda函数:lambda x, y: x-y函数构建了一层神经网络,其中[a_value, mean]就是lambda函数的两个输入,因为输入有两个,因此要用ElementwiseLambda而不是Lambda。

训练结果

1500次

Dueling DQN代码实现_第1张图片
Dueling DQN代码实现_第2张图片

DQN with Target代码实现

你可能感兴趣的:(强化学习,tensorflow,强化学习,深度学习)