DQN(Deep Q-Network)算法实例

DQN(Deep Q-Network)算法是一种将深度学习与Q学习相结合的算法,它使用神经网络来近似Q函数。DQN的核心贡献之一是经验回放(experience replay),它可以帮助算法避免过拟合,并且更加稳定地学习。
以下是一个简化的DQN算法的Python代码示例。这个例子中,我们将使用一个简单的环境,其中智能体可以在一个维度上移动,并且有两个动作:向左或向右。我们将使用一个简单的神经网络来近似Q函数,并使用经验回放和固定Q目标(fixed Q-targets)来提高学习的稳定性和效率。

import numpy as np
import tensorflow as tf
from collections import deque
# 设置参数
EPISODES = 1000
LEARNING_RATE = 0.001
REPLAY_MEMORY_SIZE = 1000
BATCH_SIZE = 32
STATE_SIZE = 1
ACTION_SIZE = 2
# 创建经验回放记忆体
memory = deque(maxlen=REPLAY_MEMORY_SIZE)
# 创建神经网络模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(24, activation='relu', input_shape=(STATE_SIZE,)),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(ACTION_SIZE, activation='linear')
])
# 编译模型
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE), loss='mse')
# 创建目标模型
target_model = tf.keras.Sequential([
    tf.keras.layers.Dense(24, activation='relu', input_shape=(STATE_SIZE,)),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(ACTION_SIZE, activation='linear')
])
# 复制模型参数到目标模型
target_model.set_weights(model.get_weights())
# 定义贪婪策略
def get_action(state, epsilon):
    if random.random() < epsilon:
        return random.randrange(ACTION_SIZE)
    else:
        q_values = model.predict(state)
        return np.argmax(q_values[0])
# 经验回放存储函数
def remember(state, action, reward, next_state, done):
    memory.append((state, action, reward, next_state, done))
# 经验回放训练函数
def train_model():
    if len(memory) < BATCH_SIZE:
        return
    # 从记忆体中随机抽取一批经验
    minibatch = random.sample(memory, BATCH_SIZE)
    states, actions, rewards, next_states, dones = zip(*minibatch)
    # 使用当前模型预测状态的Q值
    current_q_values = model.predict(states)
    # 使用目标模型预测下一个状态的Q值
    next_q_values = target_model.predict(next_states)
    # 更新Q值
    for i in range(len(minibatch)):
        state = states[i]
        action = actions[i]
        if dones[i]:
            reward = rewards[i]
        else:
            reward = rewards[i] + GAMMA * np.max(next_q_values[i])
        current_q_values[i][action] = reward + GAMMA * np.max(next_q_values[i])
    # 更新模型参数
    model.fit(states, current_q_values, epochs=1, verbose=0)
    # 定期更新目标模型
    if episode % TARGET_UPDATE_EVERY == 0:
        target_model.set_weights(model.get_weights())
# 主循环
for episode in range(EPISODES):
    state = np.reshape(state, (1, STATE_SIZE))
    done = False
    total_reward = 0
    while not done:
        # 获取动作
        action = get_action(state, epsilon)
        # 执行动作并获取新状态和奖励
        next_state, reward, done, _ = env.step(action)
        next_state = np.reshape(next_state, (1, STATE_SIZE))
        # 记忆存储
        remember(state, action, reward, next_state, done)
        # 训练模型
        train_model()
        # 更新状态
        state = next_state
        total_reward += reward
    # 减少epsilon
    epsilon *= EPSILON_DECAY
    # 打印episode和total_reward
    print(f"Episode: {episode}, Total Reward: {total_reward}")
# 游戏结束
print("Finished all episodes.")

在这个代码中,我们需要定义环境env,它应该提供step方法来执行动作并返回新的状态、奖励和是否结束游戏的信息。此外,我们还需要定义epsilonGAMMA参数,以及TARGET_UPDATE_EVERY常数,以便定期更新目标模型。
请注意,这个代码示例是一个简化的版本,仅用于演示DQN算法的基本概念。在实际应用中,环境会更复杂,可能需要更多的预处理和后处理步骤,而且模型的结构和工作流程也可能更加复杂。此外,为了运行这个示例,你还需要安装tensorflow库。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是DQN算法的Python代码示例: ```python import numpy as np import random import tensorflow as tf from collections import deque class DQN: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = deque(maxlen=2000) self.gamma = 0.95 self.epsilon = 1.0 self.epsilon_decay = 0.995 self.epsilon_min = 0.01 self.learning_rate = 0.001 self.model = self._build_model() def _build_model(self): model = tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(24, input_dim=self.state_size, activation='relu')) model.add(tf.keras.layers.Dense(24, activation='relu')) model.add(tf.keras.layers.Dense(self.action_size, activation='linear')) model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(lr=self.learning_rate)) return model def remember(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done)) def act(self, state): if np.random.rand() <= self.epsilon: return random.randrange(self.action_size) act_values = self.model.predict(state) return np.argmax(act_values[0]) def replay(self, batch_size): minibatch = random.sample(self.memory, batch_size) for state, action, reward, next_state, done in minibatch: target = reward if not done: target = (reward + self.gamma * np.amax(self.model.predict(next_state)[0])) target_f = self.model.predict(state) target_f[0][action] = target self.model.fit(state, target_f, epochs=1, verbose=0) if self.epsilon > self.epsilon_min: self.epsilon *= self.epsilon_decay def load(self, name): self.model.load_weights(name) def save(self, name): self.model.save_weights(name) ``` 这个例子展示了如何实现DQN算法,在神经网络中使用Keras库。它包括记忆回放、动作选择和经验重放等常用的组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值