当前位置: 首页 > article >正文

PPO训练小车

PPO 训练小车以经典 CartPole 为例核心是Actor-Critic 架构 裁剪目标 GAE 优势估计通过多轮数据复用稳定更新策略让小车学会平衡杆或完成导航。下面从原理、环境、代码、训练到调优给出完整可运行方案。一、PPO 训练小车核心原理PPOProximal Policy Optimization是Actor-Critic架构的策略梯度算法核心是限制策略更新幅度避免训练震荡。Actor策略网络输入状态输出动作概率分布离散 / 连续指导小车动作。Critic价值网络输入状态输出状态价值 V (s)评估当前状态好坏。裁剪目标PPO-Clip重要性采样比rt​(θ)πθold​​(at​∣st​)πθ​(at​∣st​)​裁剪损失LCLIP(θ)E[min(rt​At​,clip(rt​,1−ϵ,1ϵ)At​)]ϵ通常取 0.2防止策略更新过大。优势函数GAEAt​∑k0∞​(γλ)kδtk​δt​rt​γV(st1​)−V(st​)平衡偏差与方差。二、环境选择与搭建1. 经典小车环境CartPole-v1状态空间4 维小车位置、速度、杆角度、杆角速度。动作空间离散 2 维左移、右移。奖励每步 1杆倒 / 车出界则回合结束目标累计奖励≥475。安装依赖bash运行pip install gymnasium torch numpy matplotlib2. 自定义 / ROS 小车环境可选用 GazeboROS 搭建 TurtleBot3定义观测激光 / 图像、动作线速度 / 角速度、奖励函数避障 进度。或用 MetaDrive 做自动驾驶仿真动作空间为连续转向 油门。三、完整 PPO 训练小车代码PyTorch1. 网络定义ActorCriticpython运行import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import gymnasium as gym import numpy as np from collections import deque import matplotlib.pyplot as plt # 设备配置 device torch.device(cuda if torch.cuda.is_available() else cpu) # Actor网络输出动作概率 class Actor(nn.Module): def __init__(self, state_dim, action_dim, hidden_dim64): super(Actor, self).__init__() self.fc1 nn.Linear(state_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, hidden_dim) self.fc3 nn.Linear(hidden_dim, action_dim) def forward(self, x): x F.relu(self.fc1(x)) x F.relu(self.fc2(x)) return F.softmax(self.fc3(x), dim-1) # Critic网络输出状态价值 class Critic(nn.Module): def __init__(self, state_dim, hidden_dim64): super(Critic, self).__init__() self.fc1 nn.Linear(state_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, hidden_dim) self.fc3 nn.Linear(hidden_dim, 1) def forward(self, x): x F.relu(self.fc1(x)) x F.relu(self.fc2(x)) return self.fc3(x)2. PPO Agent 实现python运行class PPO: def __init__(self, state_dim, action_dim, lr_actor3e-4, lr_critic1e-3, gamma0.99, lmbda0.95, eps_clip0.2, epochs10): # 网络初始化 self.actor Actor(state_dim, action_dim).to(device) self.critic Critic(state_dim).to(device) self.optimizer_actor optim.Adam(self.actor.parameters(), lrlr_actor) self.optimizer_critic optim.Adam(self.critic.parameters(), lrlr_critic) # PPO超参数 self.gamma gamma # 折扣因子 self.lmbda lmbda # GAE参数 self.eps_clip eps_clip # 裁剪系数 self.epochs epochs # 每批数据训练轮数 # 经验池 self.memory [] # 存储经验 def store(self, state, action, reward, log_prob, done): self.memory.append((state, action, reward, log_prob, done)) # 选择动作训练/测试 def select_action(self, state, trainingTrue): state torch.FloatTensor(state).unsqueeze(0).to(device) probs self.actor(state) dist torch.distributions.Categorical(probs) action dist.sample() log_prob dist.log_prob(action) if training: return action.item(), log_prob.item() else: return torch.argmax(probs).item() # 测试取最优动作 # 计算GAE优势 def compute_gae(self, rewards, dones, values): advantages [] advantage 0 next_value 0 for t in reversed(range(len(rewards))): delta rewards[t] self.gamma * next_value * (1 - dones[t]) - values[t] advantage delta self.gamma * self.lmbda * (1 - dones[t]) * advantage advantages.insert(0, advantage) next_value values[t] # 优势归一化 advantages torch.FloatTensor(advantages).to(device) advantages (advantages - advantages.mean()) / (advantages.std() 1e-8) return advantages # PPO更新核心 def update(self): # 提取经验 states torch.FloatTensor([s for s, a, r, lp, d in self.memory]).to(device) actions torch.LongTensor([a for s, a, r, lp, d in self.memory]).to(device) rewards torch.FloatTensor([r for s, a, r, lp, d in self.memory]).to(device) old_log_probs torch.FloatTensor([lp for s, a, r, lp, d in self.memory]).to(device) dones torch.FloatTensor([d for s, a, r, lp, d in self.memory]).to(device) # 计算价值与优势 values self.critic(states).squeeze() advantages self.compute_gae(rewards, dones, values.detach().cpu().numpy()) returns advantages values.detach() # TD目标 # 多轮更新 for _ in range(self.epochs): # 新策略概率 new_probs self.actor(states) new_dist torch.distributions.Categorical(new_probs) new_log_probs new_dist.log_prob(actions) # 重要性采样比 ratio torch.exp(new_log_probs - old_log_probs) # 裁剪损失 surr1 ratio * advantages surr2 torch.clamp(ratio, 1-self.eps_clip, 1self.eps_clip) * advantages loss_actor -torch.min(surr1, surr2).mean() # Critic损失 loss_critic F.mse_loss(self.critic(states).squeeze(), returns) # 反向传播 self.optimizer_actor.zero_grad() self.optimizer_critic.zero_grad() loss_actor.backward() loss_critic.backward() self.optimizer_actor.step() self.optimizer_critic.step() # 清空经验池 self.memory []3. 训练主循环python运行def train_ppo(): # 环境初始化 env gym.make(CartPole-v1) state_dim env.observation_space.shape[0] action_dim env.action_space.n ppo PPO(state_dim, action_dim) max_episodes 1000 max_steps 500 reward_history [] avg_reward deque(maxlen100) for episode in range(max_episodes): state, _ env.reset() total_reward 0 done False for step in range(max_steps): # 选择动作 action, log_prob ppo.select_action(state) next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated # 存储经验 ppo.store(state, action, reward, log_prob, done) total_reward reward state next_state if done: break # 更新策略 ppo.update() # 记录奖励 avg_reward.append(total_reward) reward_history.append(total_reward) print(fEpisode {episode1}, Total Reward: {total_reward}, Avg Reward: {np.mean(avg_reward):.2f}) # 收敛条件平均奖励≥475 if np.mean(avg_reward) 475: print(f训练完成Episode {episode1} 达到收敛条件) torch.save(ppo.actor.state_dict(), cartpole_ppo_actor.pth) torch.save(ppo.critic.state_dict(), cartpole_ppo_critic.pth) break # 绘制奖励曲线 plt.plot(reward_history) plt.xlabel(Episode) plt.ylabel(Total Reward) plt.title(PPO Training on CartPole-v1) plt.show() if __name__ __main__: train_ppo()四、训练流程与关键步骤环境交互每回合用旧策略采样轨迹存储(s,a,r,log_prob,done)。GAE 计算基于 Critic 价值计算每步优势At​并归一化。多轮更新同一批数据训练epochs次用裁剪损失限制策略更新。收敛判断连续 100 回合平均奖励≥475CartPole 满分 500。五、超参数调优关键表格参数含义推荐值调优方向lr_actorActor 学习率3e-4收敛慢调大震荡调小lr_criticCritic 学习率1e-3通常比 Actor 大gamma折扣因子0.99长期依赖调大lmbdaGAE 参数0.95平衡偏差 / 方差eps_clip裁剪系数0.2震荡调小收敛慢调大epochs每批训练轮数10数据复用次数六、测试与部署python运行def test_ppo(): env gym.make(CartPole-v1, render_modehuman) state_dim env.observation_space.shape[0] action_dim env.action_space.n ppo PPO(state_dim, action_dim) # 加载模型 ppo.actor.load_state_dict(torch.load(cartpole_ppo_actor.pth)) ppo.critic.load_state_dict(torch.load(cartpole_ppo_critic.pth)) for episode in range(10): state, _ env.reset() total_reward 0 done False while not done: action ppo.select_action(state, trainingFalse) next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated total_reward reward state next_state print(fTest Episode {episode1}, Reward: {total_reward}) env.close() if __name__ __main__: test_ppo()七、扩展到真实小车 / ROS状态空间替换为激光雷达、相机图像、里程计如 2D/3D 坐标、速度。动作空间连续动作线速度v、角速度wActor 输出高斯分布均值 / 方差。奖励函数正向到达目标点 100、每步前进 1、避障 5负向碰撞 - 200、超时 - 50、偏离路径 - 10环境对接用openai_ros或自定义 Gym 环境实现 ROS 与 PPO Agent 通信。八、常见问题与解决训练震荡减小lr_actor、增大eps_clip、增加epochs。收敛慢增大学习率、调整gamma/lmbda、增加经验池大小。策略退化确保优势归一化、裁剪损失正确、Critic 价值估计准确。

相关文章:

PPO训练小车

PPO 训练小车(以经典 CartPole 为例),核心是Actor-Critic 架构 裁剪目标 GAE 优势估计,通过多轮数据复用稳定更新策略,让小车学会平衡杆或完成导航。下面从原理、环境、代码、训练到调优,给出完整可运行方…...

告别环境配置烦恼!PyTorch 2.9 + CUDA 12.x 开箱即用镜像实战

告别环境配置烦恼!PyTorch 2.9 CUDA 12.x 开箱即用镜像实战 1. 为什么需要预构建的PyTorch镜像 深度学习开发者最常遇到的噩梦之一就是环境配置问题。当你兴冲冲地准备开始一个新项目时,可能会遇到以下典型场景: 系统提示"CUDA driv…...

Vivado IP核封装避坑指南:解决ILA集成时的神秘问号错误(附-force命令详解)

Vivado IP核封装避坑指南:解决ILA集成时的神秘问号错误(附-force命令详解) 在FPGA开发中,Vivado的IP核封装功能为设计复用提供了极大便利,但其中隐藏的"陷阱"也常常让开发者措手不及。特别是当我们在自定义I…...

Netflow实战:5分钟搞定Cisco路由器流量监控配置(附nfdump使用技巧)

Netflow实战:5分钟搞定Cisco路由器流量监控配置(附nfdump使用技巧) 网络流量监控是每个运维工程师的必修课。想象一下,当你发现公司内网突然变慢,却不知道是哪个部门的视频会议占用了带宽,或是哪个员工的P2…...

2FAuth开发者手册:Laravel+Vue技术架构深度剖析

2FAuth开发者手册:LaravelVue技术架构深度剖析 【免费下载链接】2FAuth A Web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes 项目地址: https://gitcode.com/gh_mirrors/2f/2FAuth 2FAuth是一款基于Lara…...

SCLAlertView核心组件深度剖析:SCLButton、SCLSwitchView等自定义控件详解

SCLAlertView核心组件深度剖析:SCLButton、SCLSwitchView等自定义控件详解 【免费下载链接】SCLAlertView Beautiful animated Alert View. Written in Objective-C 项目地址: https://gitcode.com/gh_mirrors/sc/SCLAlertView SCLAlertView是一个用Objectiv…...

simpleaichat与GPT-4集成:利用最新AI技术提升应用能力

simpleaichat与GPT-4集成:利用最新AI技术提升应用能力 【免费下载链接】simpleaichat Python package for easily interfacing with chat apps, with robust features and minimal code complexity. 项目地址: https://gitcode.com/gh_mirrors/si/simpleaichat …...

Claude HUD终极指南:打造你的AI开发效率监控中心

Claude HUD终极指南:打造你的AI开发效率监控中心 【免费下载链接】claude-hud A Claude Code plugin that shows whats happening - context usage, active tools, running agents, and todo progress 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-h…...

如何4步从零打造你的开源智能交互机器人?

如何4步从零打造你的开源智能交互机器人? 【免费下载链接】stack-chan A JavaScript-driven M5Stack-embedded super-kawaii robot. 项目地址: https://gitcode.com/gh_mirrors/sta/stack-chan 在数字化时代,开源机器人开发正成为科技爱好者和教育…...

高效获取国家中小学智慧教育平台电子课本:tchMaterial-parser工具全攻略

高效获取国家中小学智慧教育平台电子课本:tchMaterial-parser工具全攻略 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 在数字化教学日益普及的今天&…...

深入Linux V4L2主从设备通信机制:从Camera Host控制器到Sensor的完整数据流分析

深入Linux V4L2主从设备通信机制:从Camera Host控制器到Sensor的完整数据流分析 1. V4L2子系统架构与核心设计理念 在嵌入式视觉系统中,Camera Host控制器与图像传感器(Sensor)的协同工作构成了视频采集的基础链路。Linux V4L2(Video for Linux 2)子系统…...

啃了3个月Profinet硬骨头:我用C#实现了以太网帧抓包+GSD解析(附踩坑实录)

“威哥,别试了,那台德国老设备的Profinet通信,第三方库要价20万,还不支持定制。” “20万?项目预算才多少!我就不信了,抓包分析GSD解析,我用C#自己撸一套对接方案。” 这段对话发生在…...

ocrad.js未来展望:人工智能与OCR技术的融合趋势

ocrad.js未来展望:人工智能与OCR技术的融合趋势 【免费下载链接】ocrad.js OCR in Javascript via Emscripten 项目地址: https://gitcode.com/gh_mirrors/oc/ocrad.js 在当今数字化时代,光学字符识别(OCR)技术正经历着前所…...

深度解析:如何使用d2s-editor解锁暗黑破坏神2存档编辑的无限可能

深度解析:如何使用d2s-editor解锁暗黑破坏神2存档编辑的无限可能 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 暗黑破坏神2(Diablo 2)作为经典ARPG游戏的代表作,至今仍拥有庞大的…...

WordPress主题制作必备:10个常用函数详解与实战应用

WordPress主题开发核心函数解析:从基础到高阶应用 引言:为什么需要掌握这些核心函数? 在WordPress生态中,主题开发一直是开发者最关注的领域之一。不同于插件开发需要处理各种功能扩展,主题开发更注重界面呈现与用户…...

LeetCode:121. 买卖股票的最佳时机

简介 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 解决方式:数组 贪心算法 这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法! 推荐看…...

实战复盘:我是如何用一张‘图片’拿下upload-labs Pass-13/14的(附完整命令与避坑点)

从图片马到实战突破:Upload-Labs Pass-13/14的深度攻防手记 那天深夜的咖啡杯旁,我盯着upload-labs靶场第13关的界面出神——这已经是本周第三次尝试突破"内容检测白名单"的双重防御了。作为一名刚入行半年的安全研究员,我深知文件…...

3个简单步骤:用网易云音乐批量下载器快速建立个人离线音乐库

3个简单步骤:用网易云音乐批量下载器快速建立个人离线音乐库 【免费下载链接】netease-cloud-music-dl Netease cloud music song downloader, with full ID3 metadata, eg: front cover image, artist name, album name, song title and so on. 项目地址: https:…...

深度卷积生成对抗网络DCGAN:革命性AI图像生成完全指南

深度卷积生成对抗网络DCGAN:革命性AI图像生成完全指南 【免费下载链接】dcgan_code Deep Convolutional Generative Adversarial Networks 项目地址: https://gitcode.com/gh_mirrors/dc/dcgan_code 深度卷积生成对抗网络(DCGAN)是AI图…...

Wan2.1-umt5在软件测试中的应用:自动生成测试用例与缺陷报告

Wan2.1-umt5在软件测试中的应用:自动生成测试用例与缺陷报告 1. 引言 你有没有过这样的经历?产品经理刚把一份几十页的需求文档发过来,测试团队的小伙伴们就开始头大了。这意味着接下来几天,大家得埋头苦干,从密密麻…...

P3618 误会

题目大意&#xff1a;给你两个字符串a和b&#xff0c;你可以将a中的与b相同子串替换为*&#xff0c;不限制替换次数(可以为0)&#xff0c;问你最多可以替换出多少个不同的字符串。解法&#xff1a;KMP套dp QWQ。先做一遍KMP&#xff0c;再做一次简单dpfor(int i1;i<n;i){//v…...

SQLx深度解析:解决Go数据库操作复杂性的高性能扩展方案

SQLx深度解析&#xff1a;解决Go数据库操作复杂性的高性能扩展方案 【免费下载链接】sqlx general purpose extensions to golangs database/sql 项目地址: https://gitcode.com/gh_mirrors/sq/sqlx 在Go语言生态中&#xff0c;数据库操作是每个后端开发者必须面对的核心…...

5分钟搞定Petalinux环境配置:从虚拟机共享文件夹到bash切换详解

5分钟高效配置Petalinux开发环境&#xff1a;从虚拟机共享到Shell优化全指南 在嵌入式Linux开发领域&#xff0c;Xilinx的Petalinux工具链一直是Zynq和MicroBlaze平台开发的黄金标准。但许多工程师在初次搭建环境时&#xff0c;往往会在虚拟机共享、权限管理和Shell配置这些&qu…...

如何快速设计艺术二维码:QRBTF的完整使用指南

如何快速设计艺术二维码&#xff1a;QRBTF的完整使用指南 【免费下载链接】qrbtf An art QR code (qrcode) beautifier. 艺术二维码生成器。https://qrbtf.com 项目地址: https://gitcode.com/gh_mirrors/qr/qrbtf 还在为单调的黑白二维码而烦恼吗&#xff1f;QRBTF艺术…...

机器学习100天中文版:10个核心算法原理与代码实践

机器学习100天中文版&#xff1a;10个核心算法原理与代码实践 【免费下载链接】100-Days-of-ML-Code-Chinese-Version Chinese Translation for Machine Learning Infographics 项目地址: https://gitcode.com/gh_mirrors/10/100-Days-of-ML-Code-Chinese-Version 想要快…...

Beyond Compare插件安装全攻略:解决.class文件对比中的反编译错误

Beyond Compare插件深度解析&#xff1a;高效解决.class文件反编译难题 在Java开发领域&#xff0c;代码版本管理是每个开发者必须面对的日常挑战。当线上环境出现难以解释的行为差异时&#xff0c;我们常常需要追溯到.class文件的层面进行比对分析。Beyond Compare作为一款强大…...

Open Interpreter终极指南:用自然语言操控本地代码执行的完整方案

Open Interpreter终极指南&#xff1a;用自然语言操控本地代码执行的完整方案 【免费下载链接】open-interpreter 项目地址: https://gitcode.com/GitHub_Trending/ope/open-interpreter 在当今AI技术快速发展的时代&#xff0c;开发者们面临着一个共同的挑战&#xff…...

【Matlab实战】光谱分析技术:从数据预处理到模型构建全流程解析

1. 光谱分析基础与Matlab优势 光谱分析就像给物质拍"指纹照片"——不同物质会吸收或发射特定波长的光&#xff0c;形成独一无二的光谱特征。我第一次接触近红外光谱数据时&#xff0c;发现它看起来就像心电图一样充满噪声和基线漂移&#xff0c;但经过Matlab处理后的…...

Spring_couplet_generation 社区贡献指南:如何参与开源项目改进

Spring_couplet_generation 社区贡献指南&#xff1a;如何参与开源项目改进 想为开源项目做点贡献&#xff0c;但又不知道从何下手&#xff1f;特别是看到像 Spring_couplet_generation 这样有趣的项目&#xff0c;想帮忙改进一下UI&#xff0c;或者加个新功能&#xff0c;却卡…...

ClawdBot智能助手应用:教育机构用其构建双语教学辅助与作业答疑系统

ClawdBot智能助手应用&#xff1a;教育机构用其构建双语教学辅助与作业答疑系统 1. 为什么教育机构需要一个“能听、能看、能答”的本地化AI助教&#xff1f; 你有没有遇到过这样的场景&#xff1a; 英语老师布置完阅读作业&#xff0c;学生发来一张手写笔记照片&#xff0c…...