人工智能学习:倒立摆强化学习控制-DQN(10)

DQN(Deep Q-Network)可以用来实现对倒立摆(CartPole)对象的控制。

DQN的原理就是建立一个神经网络来替代Q-Learning算法中Q-Table,根据对象的状态和采用的动作输出对应的Q值,Q值越高表示动作能得到的奖励越高。在DQN用于强化学习时,采取历史回放和Fixed Target策略,即系统状态和动作被记录的历史数据中,并被在学习过程中被回放进行学习,以模拟人的学习原理。另外,采用两个网络,一个网络(Target Net)相对稳定,用来评估目标的Q值,另一个网络不断学习迭代,经过一定次数迭代后再替换原来的Target Net。关于Q-Learning和DQN等详细介绍,可以参考文末参考链接。

实现示例如下

1 载入模块
载入需要的模块

# import required modules
import gym
import random
import numpy as np
import math

import torch
import torch.nn as nn

2 定义网络

class Net(nn.Module):
    def __init__(self, n_states, n_actions):
        super().__init__()
        
        self.fc1 = nn.Linear(n_states, 10)
        self.fc2 = nn.Linear(10, n_actions)
        
        self.fc1.weight.data.normal_(0,0.1)
        self.fc2.weight.data.normal_(0,0.1)
        
    def forward(self, inputs):
        x = self.fc1(inputs)
        x = nn.functional.relu(x)
        outputs = self.fc2(x)
        
        return outputs

网络由一个前向的全连接层,一个relu层,和一个全连接输出层组成。输入为倒立摆对象的状态(位置、速度、角度、角速度),输出为对应两个动作(0和1)的Q值,Q值高的动作被选择作为采取的动作。

3 定义DQN学习策略

# define DQN
class DQN:
    def __init__(self, n_states, n_actions):
        # two nets
        self.eval_net = Net(n_states, n_actions)
        self.target_net = Net(n_states, n_actions)
        
        self.loss 
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
强化学习是一种通过与环境交互来学习最优行为的机器学习方法,而DQN算法(Deep Q-Network)是一种基于深度学习强化学习算法,常用于解决连续状态和动作空间问题。在这里,我们将介绍如何使用DQN算法来控制倒立的离散动作空间。 首先,我们需要安装一些必要的库,包括gym、numpy、tensorflow和keras。可以通过以下命令来安装: ``` pip install gym numpy tensorflow keras ``` 接下来,我们将使用gym库中的CartPole-v0环境来模拟倒立。该环境需要在每个时间步中采取一个离散的动作,使得倒立不倒,直到达到最大时间步数或倒立超出允许的角度限制。 我们将使用DQN算法来训练一个神经网络来预测在每个状态下采取每个动作的Q值。在每个时间步,我们将根据epsilon-greedy策略选择一个动作,并将其应用于环境中,然后更新我们的神经网络。 以下是完整的代码: ```python import gym import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam class DQNAgent: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = [] self.gamma = 0.95 # discount rate self.epsilon = 1.0 # exploration rate self.epsilon_min = 0.01 self.epsilon_decay = 0.995 self.learning_rate = 0.001 self.model = self._build_model() def _build_model(self): # Neural Net for Deep-Q learning Model model = Sequential() model.add(Dense(24, input_dim=self.state_size, activation='relu')) model.add(Dense(24, activation='relu')) model.add(Dense(self.action_size, activation='linear')) model.compile(loss='mse', optimizer=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 np.random.choice(self.action_size) else: return np.argmax(self.model.predict(state)[0]) def replay(self, batch_size): minibatch = np.random.choice(len(self.memory), batch_size, replace=False) 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 if __name__ == "__main__": env = gym.make('CartPole-v0') state_size = env.observation_space.shape[0] action_size = env.action_space.n agent = DQNAgent(state_size, action_size) batch_size = 32 episodes = 1000 for e in range(episodes): state = env.reset() state = np.reshape(state, [1, state_size]) for time in range(500): env.render() action = agent.act(state) next_state, reward, done, _ = env.step(action) reward = reward if not done else -10 next_state = np.reshape(next_state, [1, state_size]) agent.remember(state, action, reward, next_state, done) state = next_state if done: print("episode: {}/{}, score: {}, e: {:.2}" .format(e, episodes, time, agent.epsilon)) break if len(agent.memory) > batch_size: agent.replay(batch_size) ``` 在训练过程中,我们可以看到模型的epsilon值在不断衰减,探索变得越来越少,最终达到一个稳定的水平。在每个episode结束时,我们将打印出得分和epsilon值。 在训练1000个episode后,我们可以看到模型的得分在不断提高。可以尝试调整参数和网络结构来进一步提高性能。 注意:在运行代码时,需要关闭jupyter notebook自带的自动保存,否则可能会导致程序卡住。可以使用以下命令关闭自动保存: ``` jupyter notebook --NotebookApp.autosave_interval=0 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值