import gym  #
import tensorflow as tf
import numpy as np# Hyper Parameters
GAMMA = 0.95  # discount factor    折扣因子
LEARNING_RATE = 0.01  # 学习率class Policy_Gradient():# 咱们来搞一下大头!def __init__(self, env):  # 初始化# 先初始化一些参量self.time_step = 0  # 某个地方需要用的步数self.state_dim = env.observation_space.shape[0]  # 状态维度self.action_dim = env.action_space.n  # 动作维度 TODO 这个.n是什么意思self.ep_obs, self.ep_as, self.ep_rs = [], [], []  # 初始化了一个三状态,为了后面用store_transition存到智能体中self.create_softmax_network()# Init session      初始化tensorflow参数self.session = tf.InteractiveSession()self.session.run(tf.global_variables_initializer())  # 初始化 tensorflow 参数。def create_softmax_network(self):# network weights"""当在time-step-i时刻,策略网络输出概率向量若与采样到的time-step-i时刻的动作越相似,那么交叉熵会越小。最小化这个交叉熵误差也就能够使策略网络的决策越接近我们采样的动作。最后用交叉熵乘上对应time-step的reward,就将reward的大小引入损失函数,entropy*reward越大,神经网络调整参数时计算得到的梯度就会越偏向该方向。:return:"""W1 = self.weight_variable([self.state_dim, 20])  # w1 权重,4*20的网络b1 = self.bias_variable([20])  # b1权重,y = w1*x + b1W2 = self.weight_variable([20, self.action_dim])b2 = self.bias_variable([self.action_dim])# input layerself.state_input = tf.placeholder("float", [None, self.state_dim])  # 状态输入层占位,多少组不知道,每组有4个状态self.tf_acts = tf.placeholder(tf.int32, [None, ],name="actions_num")  # 动作数  TODO 这里我其实没太看出来是干啥的,很想输出一下这些参量长什么样,晚上学一下self.tf_vt = tf.placeholder(tf.float32, [None, ], name="actions_value")  # 这是我们的状态价值函数# hidden layersh_layer = tf.nn.relu(tf.matmul(self.state_input, W1) + b1)  # 进行 y = w1*x + b1 的运算 ,并激活成可输出的状态# softmax layer# matmul返回两个数组的矩阵乘积,结果还是一个矩阵self.softmax_input = tf.matmul(h_layer, W2) + b2  # 进行 y = w2*x + b2 的运算,输出是两个是数(不确定)TODO# softmax outputself.all_act_prob = tf.nn.softmax(self.softmax_input, name='act_prob')  # softmax输出层,输出每个动作的概率# 计算logits 和 labels 之间的稀疏softmax 交叉熵# 函数先对 logits 进行 softmax 处理得到归一化的概率,将lables向量进行one-hot处理,然后求logits和labels的交叉熵:# TODO https://blog.csdn.net/qq_22194315/article/details/77991283   一会儿研究一下这个链接self.neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.softmax_input,labels=self.tf_acts)# tf.reduce_mean  :计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值# 损失函数计算,定义为softmax交叉熵损失函数和状态价值函数的乘积self.loss = tf.reduce_mean(self.neg_log_prob * self.tf_vt)  # reward guided loss# 我的理解是,利用tensorflow中的Adam优化算法最小化loss函数# Adam优化算法:是一个寻找全局最优点的优化算法,引入了二次方梯度校正。self.train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(self.loss)def weight_variable(self, shape):  # 权重变量initial = tf.truncated_normal(shape)return tf.Variable(initial)def bias_variable(self, shape):  # 偏执变量,生成常量矩阵,是tensorflow中固定的机制initial = tf.constant(0.01, shape=shape)return tf.Variable(initial)def choose_action(self, observation):"""选择动作 :这里的observation其实就是状态,当前的状态先传入state_input(也就相当于softmax网络的入口),softmax网络的输出是针对当前状态每个动作的概率,第一句就是运行了一个会话进行这个过程。#TODO prob_weights 应该是一个动作对应概率的矩阵,怎么查看数据类型来着忘了下一句就是依据概率选择动作了,选择概率最大的动作"""prob_weights = self.session.run(self.all_act_prob, feed_dict={self.state_input: observation[np.newaxis, :]})action = np.random.choice(range(prob_weights.shape[1]),p=prob_weights.ravel())  # select action w.r.t the actions probreturn actiondef store_transition(self, s, a, r):  # 序列采样,差不多是将三状态整合在一起self.ep_obs.append(s)self.ep_as.append(a)self.ep_rs.append(r)def learn(self):  #"""模型学习:通过蒙特卡洛完整序列采样,对神经网络进行调整。:return:"""discounted_ep_rs = np.zeros_like(self.ep_rs)  # 下面所有的这些过程就是在一步步实现那个复杂的计算状态价值函数的公式running_add = 0for t in reversed(range(0, len(self.ep_rs))):running_add = running_add * GAMMA + self.ep_rs[t]  #discounted_ep_rs[t] = running_adddiscounted_ep_rs -= np.mean(discounted_ep_rs)discounted_ep_rs /= np.std(discounted_ep_rs)  # 到这一步就实现了# train on episodeself.session.run(self.train_op, feed_dict={self.state_input: np.vstack(self.ep_obs),self.tf_acts: np.array(self.ep_as),self.tf_vt: discounted_ep_rs,})  # 到这一步就计算完成了,给她传进会话让他进行下面的计算吧self.ep_obs, self.ep_as, self.ep_rs = [], [], []  # 每步结束之后清空这三个值# main函数里面会用到的一些超级参量
ENV_NAME = 'CartPole-v0'  # 定义一个超级参量,小车杆子的游戏环境名称
EPISODE = 3000  # 3000个回合
STEP = 3000  # 每个回合里面最多执行3000步
TEST = 20  # 每一百个回合做一次测试,每次10次测试取一次平均def main():env = gym.make(ENV_NAME)agent = Policy_Gradient(env)  # 定义了一个智能体for episode in range(EPISODE):  # 开始回合更新state = env.reset()  # 初始化状态for step in range(STEP):  # 开始单步更新action = agent.choose_action(state)  # 根据当前的状态随机选择动作next_state, reward, done, _ = env.step(action)  # 得到执行动作后的回报,以及下一个状态agent.store_transition(state, action, reward)  # 序列采样state = next_state  # 更新状态,准备下一步更新,下一个状态即为下一步中的当前状态if done:# 蒙特卡罗法里面价值函数的计算,一般是从后向前算,这样前面的价值的计算可以利用后面的价值作为中间结果,简化计算agent.learn()  # 完成一个回合之后计算价值函数break  # 达到终止条件的时候退出当前循环,开启下一回合# 完成100个回合下面开始测试if episode % 100 == 0:total_reward = 0  # 初始化回报for i in range(TEST):state = env.reset()  # 初始化状态for j in range(STEP):env.render()  # env.render()函数用于渲染出当前的智能体以及环境的状态action == agent.choose_action(state)  # 根据状态选择动作state, reward, done, _ = env.step(action)  # 根据action执行step,得到三状态total_reward += reward  # 为了十次取一次平均,先加后除if done:  # 如果达到了终止条件,则退出breakave_reward = total_reward / TEST  # 求平均print('episode:', episode, 'Evaluation Average Reward:', ave_reward)if __name__ == '__main__':main()

【强化学习】Policy Gradients代码注释版本相关推荐

  1. 【强化学习】A3C代码注释版本

    ########################################## # A3C做出的改进: # 解决AC难以收敛的问题 # 不一样的地方: #import threading # i ...

  2. 【强化学习】PPO代码注释版本

    # PPO主要通过限制新旧策略的比率,那些远离旧策略的改变不会发生# import tensorflow as tf import tensorflow.compat.v1 as tf tf.comp ...

  3. 强化学习--Policy Gradients

    系列文章目录 强化学习 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一.强化学习是什么? 二.核心算法(策略梯度法)Policy Gradients ...

  4. ROS开发笔记(10)——ROS 深度强化学习dqn应用之tensorflow版本(double dqn/dueling dqn/prioritized replay dqn)

    ROS开发笔记(10)--ROS 深度强化学习dqn应用之tensorflow版本(double dqn/dueling dqn/prioritized replay dqn) 在ROS开发笔记(9) ...

  5. 【深度强化学习】MAPPO 代码学习

    [深度强化学习]MAPPO 代码学习 MAPPO 的开源代码库:https://github.com/marlbenchmark/on-policy MAPPO 的主要实现在 onpolicy 中实现 ...

  6. openCV4.0 C++ 快速入门30讲学习笔记(自用 代码+注释)详细版

    课程来源:哔哩哔哩 环境:OpenCV4.5.1 + VS2019 目录 002.图像色彩空间转换 003.图像对象的创建与赋值 004.图像像素的读写操作 005.图像像素的算术操作(加减乘除4种不 ...

  7. 深度强化学习-Policy Gradient基本实现

    全文共2543个字,2张图,预计阅读时间15分钟. 基于值的强化学习算法的基本思想是根据当前的状态,计算采取每个动作的价值,然后根据价值贪心的选择动作.如果我们省略中间的步骤,即直接根据当前的状态来选 ...

  8. 强化学习及Python代码示例

    1 概述 强化学习是机器学习里面的一个分支.它强调如何基于环境而行动,以取得最大化的预期收益.其灵感来源于心理学中的行为主义理论,既有机体如何在环境给予的奖励或者惩罚的刺激下,逐步形成对刺激的预期,产 ...

  9. 白话强化学习(理论+代码)

    文章目录 前言 强化学习概述 案例 alphaGo 无人驾驶 why 强化学习特点 基本理论部分 基本概念 马尔可夫模型 马尔可夫链 案例 马尔科夫决策过程 累计回报 概念及其求取流程 案例 算法目的 ...

最新文章

  1. [转]关于MyEclipse下的项目无法使用BASE64Encoder问题的解决办法
  2. MaxCompute(原ODPS) Studio 2.7.0 版本发布,让代码效率更高
  3. Properties文件读取学习笔记
  4. KindEditor 4 输入框限定字数
  5. Vue的内容分发slot的使用
  6. python有几种容器_Python中几种内置的容器(Containers)类型:列表、字典、集合和元组的比较和该注意的点...
  7. 记录一次归档日志爆满事件
  8. 大数据爬虫的一些小目标
  9. 非战之罪,从永中Office谈起
  10. 实现添加数据、地图放大、缩小、漫游、全景视图、鹰眼图的操作(ICommand、ITool)...
  11. itextpdf对PDF文件进行签名
  12. 西安交大软件学院推免远程面试夏令营分享
  13. 落克王国经验计算机,洛克王国宠物经验计算器
  14. [论文笔记]Integrated Networking, Caching, and Computing for Connected Vehicles: A DRL Approach
  15. PHP面试基础题之一
  16. 工具化、产品化、运营化—「美团点评」运维的故事
  17. WINPE-U盘安装Linux
  18. python爬虫知乎代码_python爬虫知乎的简单代码实现
  19. NRF24L01多通道无线病房呼叫系统
  20. amd一键超频怎么用_有问有答:AMD处理器怎么超频?

热门文章

  1. 带有Java和Axis2的JSON Web服务
  2. Java EE过去,现在和云7
  3. java 聚合_Java聚合
  4. cookies丢失 同域名_后端设置Cookie前端跨域获取丢失问题(基于springboot实现)
  5. python初学者代码示例_Selenium 快速入门笔记和代码示例(Python版)
  6. 名词解释多媒体计算机,多媒体-名词解释及填空
  7. linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软
  8. 计算机系统计算机,计算机系统与计算机化系统的区别
  9. golang web php,GitHub - kai-xx/goWeb: golang web 接口实现 -- 类似PHP的laravel
  10. 函数传参字典_Python 函数中的 4 种参数类型