【强化学习】Policy Gradients代码注释版本

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言构建栈_选择技术栈构建通用平台

c语言构建栈Java社区中有许多关于Spring vs Java EE的话题。 一群人会争辩说您应该使用一个而不是其他。等等。当我看到这一点时,我不禁要想为什么我们不能同时使用它们呢? 实际上,我认为有效地使用它们将为建立基础架构创建一个伟大的技术堆…

【强化学习】Actor Critic原理

PG算法是一种只基于policy的一种方法,存在的问题就是该算法需要完整的状态序列,且单独对策略函数进行迭代更新,不太容易收敛。 Actor-critic方法呢是一种将 策略(Policy Based)和价值(Value Based)相结合的方法。下面继续来理一下AC方法的思路…

Java 9:对Process API的增强

Java 9对Process API进行了各种改进,用于控制和管理操作系统进程。 获取有关流程的信息 有一个新的ProcessHandle类,提供了进程的pid,父级和后代,以及有关开始时间和累积CPU时间的信息。 jshell> Process p new ProcessBui…

【强化学习】AC注释版本

## 强化学习 Actor-critic # 和PG比起来主要的变化: # 评估点由状态价值变成了TD_error,网络形式变了 # learn函数长得不一样 # action有一个优化函数,优化的是价值函数,希望最大化期望的reward,Critic网络也有一个reward&#xf…

python中sorted的用法append_Python中高阶函数sorted()用法

在Python中,有内置的排序方法:sorted(iterable, key, reverse)。Sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序。key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。print(s…

【强化学习】A3C原理

先解释一下什么叫异步、什么叫并发: **异步:**和同步相对,同步是顺序执行,而异步是彼此独立,在等待某个事件的过程中继续做自己的事,不要等待这一事件完成后再工作。线程是实现异步的一个方式,异…

天玑机器人颈椎_天玑骨科手术机器人亮相机器人大会 误差不到1毫米

千龙网北京8月22日讯(记者 詹婷婷)8月23日-27日,年度科技盛典--2017年世界机器人大会将登陆北京亦创国际会展中心。100多家国内外机器人顶尖企业将携手机器人亮相。大会期间将秀出人工智能系统、特种机器人、服务机器人、工业机器人以及智慧家居机器人等先进产品。参…

jboss eap 7.0_创建委托登录模块(用于JBoss EAP 6.1)

jboss eap 7.0[如果只想查看代码,请向下滚动] 动机 在RHQ中,我们需要一个安全域,该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去,我只是使用经典的DatabaseServerLoginModule对DatabaseServerLoginModule进…

cdn简单理解_简单地聊聊CDN原理作用及实现方法

释放双眼,带上耳机,听听看~!相信只要会网上冲浪的都会接触到CDN吧,今天我们来聊聊对CDN的理解,给大家作为参考,本文将会以简单的描述来解释相关原理,供大家理解,希望相关专业同学进行…

JDK 10:FutureTask获取一个toString()

我已经有很长时间了,对于大多数具有独特属性的Java类,开发人员应该花时间重写Object.toString() ,即使它只是通过IDE生成的实现或使用诸如Apache之类的库类来实现Commons Lang的ToStringBuilder 。 如果要手动实现toSt…

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

########################################## # A3C做出的改进: # 解决AC难以收敛的问题 # 不一样的地方: #import threading # import tensorflow as tf import tensorflow.compat.v1 as tftf.compat.v1.disable_eager_execution() import numpy as np …

用python做人脸识别的程序怎么做_手把手教你用Python实现人脸识别

作者:Kangvcar简书专栏:http://www.jianshu.com/u/d9c480744afd环境要求:Ubuntu17.10Python 2.7.14环境搭建:1. 安装 Ubuntu17.10 > 安装步骤在这里2. 安装 Python2.7.14 (Ubuntu17.10 默认Python版本为2.7.14)3. 安装 git 、c…

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

# PPO主要通过限制新旧策略的比率,那些远离旧策略的改变不会发生# import tensorflow as tf import tensorflow.compat.v1 as tf tf.compat.v1.disable_eager_execution() import numpy as np import matplotlib.pyplot as plt import gym# 定义一些超级参量 EP_MAX…

【强化学习】可视化学习tensorboard

tensorflow定义了一个图结构: 代码: a tf.constant(3.0, name"a")b tf.constant(4.0, name"b")c tf.add(a, b, name"add")var tf.Variable(tf.random_normal([2, 3], mean0.0, stddev1.0), name"variable"…

面向初学者的JSF 2.0教程

1.什么是JSF? JSF是Java Server Faces的首字母缩写。 它是一种服务器端处理技术,它允许将服务器端代码嵌入到网页中。 由于可以将服务器端处理和呈现代码嵌入网页本身,因此使项目的整体编码更加简单。 减少总体数量以及文件大小。 JSF包含2个…

篡改referer_HTTP_REFERER的用法及伪造

引言在php中,可以使用$_SERVER[‘HTTP_REFERER’]来获取HTTP_REFERER信息,关于HTTP_REFERER,php文档中的描述如下:“引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项&a…

华为nova7保密柜_华为发布nova8系列新品 轻松拍出Vlog黄金脸占比

2020年12月23日,华为nova8系列手机正式发布。作为深受年轻人喜爱的手机品牌之一,华为nova8系列此次延续其强大的前置视觉实力、强悍的设计性能以及独特的设计美学,带来业内首款专为Vlog拍摄设计的5G手机。随着短视频和Vlog的崛起,…

从拉格朗日乘数法到KKT条件

从拉格朗日乘数法到KKT条件 最近看论文遇到了Karush–Kuhn–Tucker (KKT)条件,想搞清楚这是个什么东东,因此就把这个东西认真学习一下并且分享出来,希望对大家有用。学习KKT就不得不先学习一下拉格朗日乘数法&#xf…

26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史

26.0.0-alpha1自从我们发布WildFly 8.0.0.Alpha1版本以来, 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定,你们中的许多人可能会想知道WildFly是什么,而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中的…

单机最大负载_分布式高可靠之负载均衡,今天看了你肯定会

到目前为止,我已经为你介绍了分布式起源、分布式协调与同步、分布式资源管理与负载调度、分布式计算技术、分布式通信技术和分布式数据存储。可以说,掌握了这些内容,基本上就掌握了分布式的关键技术。然而,只有可靠的分布式系统才…