PG-REINFORCE tensorflow 2.0

2023-05-16

REINFORCE 算法实现

REINFORCE算法是策略梯度算法最原始的实现算法,这里采用tensorflow2.0进行实现

import tensorflow as tf
import gym
from matplotlib import pyplot as plt
import numpy as np


def PGReinforce_run(PGReinforce_agent=None, episode=1000):
    PGReinforce_agent = PGReinforce_agent.PGReinforce(n_actions=2, n_features=4)
    PGReinforce_agent.net_init()
    score = []
    env = gym.make('CartPole-v1')
    bias = 5
    for i_episode in range(episode):
        # 初始化,
        observation = env.reset()
        done = False
        t = 0
        while not done:
            env.render()
            action = PGReinforce_agent.choose_action(observation)
            PGReinforce_agent.traj_store(observation, action)
            observation_, reward, done, info = env.step(action)
            x, x_dot, theta, theta_dot = observation
            r2 = - abs(theta)*5
            # r1 = - abs(x)
            PGReinforce_agent.r_calculate(reward + r2)
            observation = observation_
            t += 1
        # PGReinforce_agent.loss_calculate()
        print("Episode finished after {} time steps".format(t + 1))
        score.append(t + 1)
        PGReinforce_agent.learn(5)
        if (i_episode + 1) % 100 == 0:
            plt.plot(score)  # 绘制波形
            # plt.draw()
            plt.savefig(f"RL_algorithm_package/img/pic_{0}_bias-{i_episode + 1}.png")


class PGReinforce:
    def __init__(self, n_actions, n_features, gamma=0.9, learning_rate=0.01):
        self.gamma = gamma
        self.n_actions = n_actions
        self.n_features = n_features
        # 轨迹
        self.traj = []
        # 网络
        self.pg_model = None
        self.net_init()
        # 一个轨迹序列的总回报
        self.r = []
        # 优化器
        self.opt = tf.keras.optimizers.Adam(learning_rate=learning_rate)

    def choose_action(self, s):
        """
        注意,这里动作的选择与之前DQN不同,DQN是选择最大的可能性的动作,而这里要对输出进行采样,来选择动作
        :param s:
        :return:
        """
        s = s.reshape(1, 4)
        action_value = self.pg_model.predict(np.array(s))
        action = np.random.choice(np.arange(action_value.shape[1]), p=action_value[0])
        return action

    def r_calculate(self, r):
        """
        每次输入r,累加算计每一个回合的总回报值r
        :param r: 回报值
        :return:
        """
        self.r.append(r)

    def loss_calculate(self, bias):
        a_list = []
        s_list = []
        G_list = []
        for index in range(len(self.r)):
            G_list.append([self.gamma ** index * sum(self.r[index:])])
        for index, item in enumerate(self.traj):
            a_list.append(self.traj[index][1])
            s_list.append(self.traj[index][0])
        a_one_hot = tf.one_hot(a_list, self.n_actions)
        s = np.array(s_list)
        G = np.matmul(np.array(G_list), np.ones([1, 2]))
        out_put_a = self.pg_model(s)
        # 注意loss函数的计算。
        log_pro = tf.reduce_sum(a_one_hot * tf.math.log(out_put_a), axis=1)
        # 因为是计算真实的动作和网络输出动作的相似程度,需要采用reduce_mean函数来进行计算loss
        # 这里loss就一个值,因为是一个回合进行更新一次。意思是这个回合的相似程度,这里相当于是一个分类问题
        loss = - tf.reduce_mean((G - bias)*log_pro)
        self.r.clear()
        self.traj.clear()
        return loss

    def traj_store(self, s, a):
        """
        轨迹存储函数,将s,a存储到列表中,done以及r不必存储
        :param s: 状态
        :param a: 动作
        :return:
        """
        s_list = []
        for index in range(self.n_features):
            s_list.append(s[index])
        self.traj.append([s_list, a])

    def net_init(self):
        inputs = tf.keras.Input(shape=(self.n_features,))
        d1 = tf.keras.layers.Dense(32, activation='relu')(inputs)
        output = tf.keras.layers.Dense(self.n_actions, activation='softmax')(d1)
        self.pg_model = tf.keras.Model(inputs=inputs, outputs=output)

    def learn(self, bias):
        # 更新梯度
        with tf.GradientTape() as Tape:
            loss = self.loss_calculate(bias)
            grads = Tape.gradient(loss, self.pg_model.trainable_variables)
            w = self.pg_model.get_weights()
            # print(f"w_before = {w}")
            self.opt.apply_gradients(zip(grads, self.pg_model.trainable_variables))
            w = self.pg_model.get_weights()
            # print(f"w_after = {w}")


①这里需要注意的点是REINFORCE程序的动作选择是通过对输出采样得到的,而不是采用最大化的算法。

    def choose_action(self, s):
        """
        注意,这里动作的选择与之前DQN不同,DQN是选择最大的可能性的动作,而这里要对输出进行采样,来选择动作
        :param s:
        :return:
        """
        s = s.reshape(1, 4)
        action_value = self.pg_model.predict(np.array(s))
        action = np.random.choice(np.arange(action_value.shape[1]), p=action_value[0])
        return action

②这里是蒙特卡洛方法,在一轮游戏结束后,才会对神经网络进行更新。所以这里的回报值也是这一轮游戏的回报值。

    def r_calculate(self, r):
        """
        每次输入r,累加算计每一个回合的总回报值r
        :param r: 回报值
        :return:
        """
        self.r.append(r)

③loss计算

def loss_calculate(self, bias):
        a_list = []
        s_list = []
        G_list = []
        for index in range(len(self.r)):
            G_list.append([self.gamma ** index * sum(self.r[index:])])
        for index, item in enumerate(self.traj):
            a_list.append(self.traj[index][1])
            s_list.append(self.traj[index][0])
        a_one_hot = tf.one_hot(a_list, self.n_actions)
        s = np.array(s_list)
        G = np.matmul(np.array(G_list), np.ones([1, 2]))
        out_put_a = self.pg_model(s)
        # 注意loss函数的计算。
        log_pro = tf.reduce_sum(a_one_hot * tf.math.log(out_put_a), axis=1)
        # 因为是计算真实的动作和网络输出动作的相似程度,需要采用reduce_mean函数来进行计算loss
        # 这里loss就一个值,因为是一个回合进行更新一次。意思是这个回合的相似程度,这里相当于是一个分类问题
        loss = - tf.reduce_mean((G - bias)*log_pro)
        self.r.clear()
        self.traj.clear()
        return loss

④在训练过程中,感觉会出现过拟合的现象。网络到达一个比较好的参数之后,如果继续进行训练,系统的性能反而会下降。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PG-REINFORCE tensorflow 2.0 的相关文章

随机推荐

  • 在eclipse上配置使用tomcat

    在eclipse上配置使用tomcat 1 确认自己已经下载好tomcat后 xff0c 打开eclipse后选择菜单栏中的windows列表中的首选项配置 2 找到Server选项中的Runtime Envirnm选项 xff0c 如图所
  • 本科学完C语言、C++、python(学透点),还有必要学别的语言吗?

    原作者是一名高校的信息技术类的教师 xff0c 主教程序设计类课程 这样的问题 xff0c 作者的学生也会经常问他 本篇文章意于为各位大学生提供一些在编程上的疑惑 xff0c 希望能够对大家有帮助 作者 xff1a 悟空问答丨EXCEL进阶
  • C/C++编程笔记:C/C++中的strrchr()函数,到底该怎么用?

    在C 43 43 中 xff0c strrchr xff08 xff09 是用于字符串处理的预定义函数 cstring是字符串函数所需的头文件 此函数返回一个指针 xff0c 该指针指向字符串中最后一次出现的字符 我们想要找到的最后一个出现
  • C++编程书籍推荐:零基础入门书籍,学C++看它们就够了!

    如果你是一个没有编程经验的C 43 43 零基础小白 xff0c 或者有其它语言经验的C 43 43 初学者 xff0c 那么强烈推荐下面的十本零基础小白入门C 43 43 书籍 1 C 43 43 Primer 作者 xff1a Stan
  • 【ROS2 入门】虚拟机环境 ubuntu 18.04 ROS2 安装

    大家好 xff0c 我是虎哥 xff0c 从今天开始 xff0c 我将花一段时间 xff0c 开始将自己从ROS1切换到ROS2 xff0c 做为有别于ROS1的版本 xff0c 做了很多更新和改变 xff0c 我还是很期待自己逐步去探索R
  • 如何解压.gz的压缩文件

    如何解压 gz的压缩文件 gzip d xxx gz tar命令 root 64 linux tar cxtzjvfpPN 文件与目录 参数 xff1a c xff1a 建立一个压缩文件的参数指令 create 的意思 xff1b x xf
  • GPS经纬度坐标与XY坐标相互转换的python程序

    文章目录 前言一 说明二 函数1 import 和 常数2 GPS经纬度转XY坐标3 XY坐标转GPS经纬度 总结 前言 室外定位常用的是GPS xff0c 故编队队形 设定轨迹都是基于GPS经纬度坐标 而在仿真中我们通常会在XY坐标系下进
  • AD20 原理图设计流程

    Altium Designer 20 的原理图设计大致可以分为 9 个步骤 xff1a xff08 1 xff09 新建原理图 这是原理图设计的第一步 xff08 2 xff09 图纸设置 图纸设置就是要设置图纸的大小 xff0c 方向等信
  • JavaScript基础——DOM节点操作学习笔记

    目录 笔记 方法的使用 案例一 动态生成表格 案例二 下拉菜单 xff0c 鼠标经过和离开实现 案例全部代码 笔记 节点概述 1 网页中的任何内容都是节点 文字 标签 元素 文档等 节点至少有nodeType 节点类型 nodeName 节
  • MAVLINK包的校验方法

    这段时间做一个项目要进行MAVLINK的解包校验 xff0c 但有一个叫做 CRC EXTRA的位导致这个校验码怎么算结果都不对 xff0c 后来找了好久还是在github的论坛上看见别人讨论才找到方法的 1 先上从官网上拿的mavlink
  • 机器人工程专业课程

    1 机器人工程专业的课程主要有 xff1a 高级语言程序设计 电路分析 机械设计基础 模拟电路技术 数字电子技术 自动控制原理 微机原理及接口技术 电机与电气控制技术 单片机原理及其应用 机械制造基础 工业机器人控制系统 运动控制系统 工业
  • python获取当前执行py文件的绝对路径

    python获取当前执行py文件的绝对路径 python3 home appuser test py span class token comment 获取当前执行py文件的绝对路径 span py file path span class
  • 相机内参的标定方法

    简介 摄像机标定 Camera calibration 简单来说是从世界坐标系换到图像坐标系的过程 xff0c 也就是求最终的投影矩阵 PP 的过程 xff0c 下面相关的部分主要参考UIUC的计算机视觉的课件 xff08 网址Spring
  • python中的函数、类和对象、模块和包都是啥意思?

    python中的函数 类 对象 包都是啥意思 xff1f 1 函数 重复的事情不做两次 函数还是比较好理解的吧 xff0c 数学中就学到过函数 xff0c 就是用来解决某一些问题的过程 为啥要写函数 xff1f 首先是方便代码重用 xff0
  • E3ZG_D62传感器 STM32C8T6

    E3ZG D62传感器 在STM32C8T6的简单应用 该图便是E3ZG D62传感器的样子 第一个旋钮是灵敏度调节旋钮的 xff0c 第二个旋钮是改变模式 xff0c 在L时 xff0c 长灭 xff0c 检测到 xff0c 为亮 xff
  • Learning High-Speed Flight in the Wild 环境安装

    有许多问题可以去github项目内的issues查找一下 xff0c 里面有相当一部分问题的解决方案 也可参考论文学习 Learning High Speed Flight in the Wild 一 环境安装 论文程序github地址 x
  • AES加密算法

    密钥类型 AES 128 xff1a 128位比特 xff08 16字节 xff09 AES 192 xff1a 192位比特 xff08 24字节 xff09 AES 256 xff1a 256位比特 xff08 32字节 xff09 一
  • Ros noetic : XTDrone安装

    一 安装参考 安装过程绝大部分参考如下的文件语雀 xff1a 仿真平台基础配置 进行配置 二 出现的错误以及需要注意的问题 这里的配置如下 xff1a ROS noetic Ubuntu20 04 python3 8 2 1 依赖安装 在
  • DQN、DDQN、Dueling DQN tensorflow2.0

    一 tensorflow2 0 实现DQN算法 算法代码如下 span class token keyword import span numpy span class token keyword import span tensorflo
  • PG-REINFORCE tensorflow 2.0

    REINFORCE 算法实现 REINFORCE算法是策略梯度算法最原始的实现算法 xff0c 这里采用tensorflow2 0进行实现 span class token keyword import span tensorflow sp