强化学习 - Proximal Policy Optimization (PPO)

什么是机器学习

Proximal Policy Optimization(PPO)是一种用于解决强化学习问题的策略梯度方法。PPO的目标是通过优化代理的策略函数来最大化期望累积奖励。它通过引入一个剪切项(clipping term)来限制新策略相对于旧策略的更新幅度,从而提高训练的稳定性。

以下是一个使用 Python 和 TensorFlow/Keras 实现简单的 Proximal Policy Optimization(PPO)的示例。在这个例子中,我们将使用 OpenAI Gym 的 CartPole 环境。

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.optimizers import Adam
import gym# 定义Proximal Policy Optimization Agent
class PPOAgent:def __init__(self, state_size, action_size):self.state_size = state_sizeself.action_size = action_sizeself.gamma = 0.99  # 折扣因子self.learning_rate = 0.001self.clip_ratio = 0.2self.epochs = 10# 构建演员(Actor)网络self.actor = self.build_actor()# 构建评论家(Critic)网络self.critic = self.build_critic()def build_actor(self):state_input = Input(shape=(self.state_size,))dense1 = Dense(64, activation='relu')(state_input)dense2 = Dense(64, activation='relu')(dense1)output = Dense(self.action_size, activation='softmax')(dense2)model = Model(inputs=state_input, outputs=output)model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=self.learning_rate))return modeldef build_critic(self):state_input = Input(shape=(self.state_size,))dense1 = Dense(64, activation='relu')(state_input)dense2 = Dense(64, activation='relu')(dense1)output = Dense(1, activation='linear')(dense2)model = Model(inputs=state_input, outputs=output)model.compile(loss='mean_squared_error', optimizer=Adam(lr=self.learning_rate))return modeldef get_action(self, state):state = np.reshape(state, [1, self.state_size])action_prob = self.actor.predict(state)[0]action = np.random.choice(self.action_size, p=action_prob)return action, action_probdef get_value(self, state):state = np.reshape(state, [1, self.state_size])value = self.critic.predict(state)[0][0]return valuedef train(self, states, actions, rewards, values, dones):advantages, target_values = self.compute_advantages_and_targets(rewards, values, dones)# 训练演员网络old_action_probs = self.actor.predict(np.vstack(states))old_action_probs = np.array([probs[action] for probs, action in zip(old_action_probs, actions)])action_one_hot = tf.keras.utils.to_categorical(actions, self.action_size)action_probs = self.actor.predict(np.vstack(states))action_probs = np.array([probs[action] for probs, action in zip(action_probs, actions)])ratio = np.exp(np.log(action_probs) - np.log(old_action_probs))clipped_ratio = np.clip(ratio, 1 - self.clip_ratio, 1 + self.clip_ratio)actor_loss = -np.mean(np.minimum(ratio * advantages, clipped_ratio * advantages))self.actor.train_on_batch(np.vstack(states), action_one_hot, sample_weight=ratio / clipped_ratio)# 训练评论家网络self.critic.train_on_batch(np.vstack(states), target_values)def compute_advantages_and_targets(self, rewards, values, dones):advantages = np.zeros_like(rewards, dtype=np.float32)target_values = np.zeros_like(rewards, dtype=np.float32)running_add = 0for t in reversed(range(len(rewards))):running_add = running_add * self.gamma * (1 - dones[t]) + rewards[t]advantages[t] = running_add - values[t]target_values[t] = running_addreturn advantages, target_values# 初始化环境和Agent
env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
agent = PPOAgent(state_size, action_size)# 训练PPO Agent
num_episodes = 1000
for episode in range(num_episodes):state = env.reset()total_reward = 0states, actions, rewards, values, dones = [], [], [], [], []for time in range(500):  # 限制每个episode的步数,防止无限循环# env.render()  # 如果想可视化训练过程,可以取消注释此行action, action_prob = agent.get_action(state)next_state, reward, done, _ = env.step(action)total_reward += rewardvalue = agent.get_value(state)states.append(state)actions.append(action)rewards.append(reward)values.append(value)dones.append(done)state = next_stateif done:print("Episode: {}, Total Reward: {}".format(episode + 1, total_reward))agent.train(states, actions, rewards, values, dones)break# 关闭环境
env.close()

在这个例子中,我们定义了一个简单的Proximal Policy Optimization(PPO)Agent,包括演员(Actor)和评论家(Critic)两个神经网络。在训练过程中,我们通过PPO算法来更新演员网络和评论家网络的参数。

请注意,PPO算法的实现可能因问题的复杂性而有所不同,可能需要更多的技术和调整,如归一化奖励、使用更复杂的神经网络结构等。

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

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

相关文章

20240125-边界外路径

题目要求 有一个m*n的网格,网格中有一个小球。小球初始位置位[startRow,startColumn]。您可以将小球移动到网格中相邻的四个单元格之一(可能会越过网格边界移出网格)。最多可以对小球进行maxMove移动。 给定 m、n、maxMove、sta…

uniapp导入uView组件库

目录 准备工作 1. 新建一个项目 2. 导入uview组件库 3. 关于SCSS 配置步骤 1. 引入uView主JS库 2. 在引入uView的全局SCSS 3. 引入uView基础样式 4. 配置easycom组件模式 添加效果实验运行即可成功 准备工作 1. 新建一个项目 2. 导入uview组件库 在进行配置之前&#x…

TensorFlow2实战-系列教程2:神经网络分类任务

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、Mnist数据集 下载mnist数据集: %matplotlib inline from pathlib imp…

练习12.5_按键_Python编程:从入门到实践(第3版)

编写一个创建空屏幕的Pygame文件。在事件循环中,每当检测到pygame.KEYDOWN事件时 都打印属性event.key。运行这个程序并按下不同的键,看看控制台窗口的输出,以便了解 Pygame会如何响应。 Rocket_Game.py import pygame import sys from s…

使用代码取大量2*2像素图片各通道均值,存于Excel文件中。

任务是取下图RGB各个通道的均值及标签(R, G,B,Label),其中标签由图片存放的文件夹标识。由于2*2像素图片较多,所以将结果放置于Excel表格中,之后使用SVM对他们进行分类。 from PIL import Image import os …

【Linux】查看硬件信息和操作系统信息、安装的应用信息

【Linux】查看硬件信息和操作系统信息、安装的应用信息 一、硬件信息 1.1 CPU信息 cat /proc/cpuinfo #查看 processor : 0 // 逻辑处理器的唯一标识符 physical id : 0 // 硬件上真实存在的CPU siblings : 1 // 一个物理CPU有几个逻辑CPU cpu…

定向减免!函数计算让轻量 ETL 数据加工更简单,更省钱

作者:澈尔、墨飏 业内较为常见的高频短时 ETL 数据加工场景,即频率高时延短,一般均可归类为调用密集型场景。此场景有着高并发、海量调用的特性,往往会产生高额的计算费用,而业内推荐方案一般为攒批处理,业…

鸿蒙:@State装饰器

State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。 在状态变量相关装饰器中,State是最基础的,使变量拥有状态属性的装饰器&am…

ChatGPT+Midjourney+闲鱼赚钱方法实战探索

最近天天在朋友群内看到朋友接单(出售提示词,图片),轻轻松松半小时就赚200-300,特意探索了一下相关玩法,总结出一套ChatGPTMidjourney闲鱼赚钱方法,主打的是易上手,有可操作性! 具体…

项目性能优化之用compression-webpack-plugin插件开启gzip压缩

背景:vue项目打包发布后,部分js、css文件体积较大导致页面卡顿,于是使用webpack插件compression-webpack-plugin开启gzip压缩 前端配置vue.config.js 先通过npm下载compression-webpack-plugin包,npm i compression-webpack-plug…

C#使用RabbitMQ-2_详解工作队列模式

简介 🍀RabbitMQ中的工作队列模式是指将任务分配给多个消费者并行处理。在工作队列模式中,生产者将任务发送到RabbitMQ交换器,然后交换器将任务路由到一个或多个队列。消费者从队列中获取任务并进行处理。处理完成后,消费者可以向…

【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解

【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解 提示:最近开始在【医学图像分割】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解前言UNet模型运行环境搭…

SQL语句创建一个简单的银行数据库

目录 一、银行业务E-R图 二、数据库模型图 转换关系模型后: 三、创建数据库 3.1 创建银行业务数据库 四、创建表 4.1 创建客户信息表 4.2 创建银行卡信息表 4.3 创建交易信息表 4.4 创建存款类型表 结果如下: ​编辑 五、插入适量数据 5.1…

java servlet果蔬产业监管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web果蔬产业监管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 ,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

Ps:将文件载入堆栈

Ps菜单:文件/脚本/将文件载入堆栈 Scripts/Load Files into Stack 将文件载入堆栈 Load Files into Stack脚本命令可用于将两个及以上的文件载入到同一个 Photoshop 新文档中。 载入的每个文件都将成为独立的图层,并使用其原始文件名作为图层名。 Photos…

254.【2023华为OD机试真题】-任务处理(贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-任务处理二.解题思路三.题解代码Python题解代码…

AI编译器的后端优化策略

背景 工作领域是AI芯片工具链相关,很多相关知识的概念都是跟着项目成长建立起来,但是比较整个技术体系在脑海中都不太系统,比如项目参与中涉及到了很多AI编译器开发相关内容,东西比较零碎,工作中也没有太多时间去做复盘…

InforSuiteAS中创中间件windows环境部署

版本:InforSuiteAS_StE_V10.0.5.2.1 环境要求:Java环境 DK1.8版本, 内存2GB或以上 , 硬盘空间 10GB或以上, 监视器 图形界面安装需要256色以上,字符界面安装没有色彩要求 ,浏览器 Microsoft …

【华为 ICT HCIA eNSP 习题汇总】——题目集9

1、缺省情况下,广播网络上 OSPF 协议 Hello 报文发送的周期和无效周期分别为()。 A、10s,40s B、40s,10s C、30s,20s D、20s,30s 考点:①路由技术原理 ②OSPF 解析:&…

多进程并发服务器与多线程并发服务器

文章目录 一、多进程并发服务器使用原理难点特点代码 二、多线程并发服务器使用原理难点特点 总结 一、多进程并发服务器 多进程并发服务器是一种经典的服务器架构,它通过创建多个子进程来处理客户端连接,从而实现并发处理多个客户端请求的能力。 使用…