神经网络智能体

CartPole 游戏也可以被转换为一个分类问题:环境状态由 4 个特征值组成,对应每组给 定特征值的正确操作是需要预测的标签。通过与环境交互,神经网络智能体可以收集由 特征值和标签组合组成的数据集。给定这个不断增长的数据集,可以训练神经网络来学 习给定环境状态的正确动作。在这种情况下,神经网络代表策略,智能体会根据新体验 更新策略。 首先是一些库的引用。 In [34]: import tensorflow as tf from keras.layers import Dense, Dropout from keras.models import Sequential from keras.optimizers import Adam, RMSprop from sklearn.metrics import accuracy_score Using TensorFlow backend. In [35]: def set_seeds(seed=100): random.seed(seed) np.random.seed(seed) tf.random.set_seed(seed) env.seed(seed) env.action_space.seed(100) 然后是一个 NNAgent 类,它结合了智能体的主要元素:策略的神经网络模型、根据策略选 择动作、更新策略(训练神经网络),以及多个回合的学习过程本身。智能体同时使用探 索和利用来选择一个动作。探索是指随机动作,独立于当前策略。利用是指从当前策略派 生的动作。这么做是因为某种程度的探索可以确保获得更丰富的经验,从而使智能体的学 习得到改善。 In [36]: class NNAgent: def __init__(self): self.max = 0 ➊ self.scores = list() self.memory = list() self.model = self._build_model() def _build_model(self): ➋ model = Sequential() model.add(Dense(24, input_dim=4, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy',强化学习 | 211 optimizer=RMSprop(lr=0.001)) return model def act(self, state): ➌ if random.random() 0.5, 1, 0) return action def train_model(self, state, action): ➍ self.model.fit(state, np.array([action,]), epochs=1, verbose=False) def learn(self, episodes): ➎ for e in range(1, episodes + 1): state = env.reset() for _ in range(201): state = np.reshape(state, [1, 4]) action = self.act(state) next_state, reward, done, info = env.step(action) if done: score = _ + 1 self.scores.append(score) self.max = max(score, self.max) ➊ print('episode: {:4d}/{} | score: {:3d} | max: {:3d}' .format(e, episodes, score, self.max), end='\r') break self.memory.append((state, action)) self.train_model(state, action) ➍ state = next_state ➊ 最高总奖励。 ➋ 策略的 DNN 分类模型。 ➌ 选择动作的方法(探索和利用)。 ➍ 更新策略的方法(训练神经网络)。 ➎ 从与环境的交互中学习的方法。 神经网络智能体没有解决上述配置下的问题,最大总奖励甚至一次也没有达到 200。 In [37]: set_seeds(100) agent = NNAgent() In [38]: episodes = 500 In [39]: agent.learn(episodes) episode: 500/500 | score: 11 | max: 44 In [40]: sum(agent.scores) / len(agent.scores) ➊ Out[40]: 13.682212 | 第 9 章 ➊ 所有回合的平均总奖励。 这种方法似乎缺少一些东西,而其中一个主要的缺失元素是超越当前状态和要选择的动作 的想法。目前为止所实现的方法无论如何都没有考虑到只有当智能体连续存活 200 步时才 能取得成功。简单地说,智能体会避免采取错误的动作,但没有学会赢得比赛。 分析收集到的状态(特征)和动作(标签)的历史数据表明,神经网络的准确率达到了 75% 左右。 然而,这并没有转化为之前看到的获胜策略。 In [41]: f = np.array([m[0][0] for m in agent.memory]) ➊ f ➊ Out[41]: array([[-0.0163, 0.0238, -0.0392, -0.0148], [-0.0158, 0.2195, -0.0395, -0.3196], [-0.0114, 0.0249, -0.0459, -0.0396], ..., [ 0.0603, 0.9682, -0.0852, -1.4595], [ 0.0797, 1.1642, -0.1144, -1.7776], [ 0.103 , 1.3604, -0.15 , -2.1035]]) In [42]: l = np.array([m[1] for m in agent.memory]) ➋ l ➋ Out[42]: array([1, 0, 1, ..., 1, 1, 1]) In [43]: accuracy_score(np.where(agent.model.predict(f) > 0.5, 1, 0), l) Out[43]: 0.7525626872733008 ➊ 所有回合的特征(状态)。 ➋ 所有回合的标签(动作)。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值