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

【FreeRL】我的深度学习库构建思想

文章目录

  • 前言
    • 参考
    • python环境
    • 效果
    • 已复现结果
  • 综述
    • DQN.py(主要)
      • 算法实现
      • 参数修改
      • 细节实现
      • 显示训练,保存训练
    • Buffer.py
    • evaluate.py
    • learning_curves


前言

代码实现在:https://github.com/wild-firefox/FreeRL
欢迎star

参考

  • 动手学强化学习
  • elegentRL
  • DRL-code-pytorch
  • easy-rl
  • maddpg-pettingzoo-pytorch
  • 深度强化学习
  • reinforcement-learning-algorithm
  • DRL-Pytorch
  • cleanRL

目的是写出像TD3作者那样简单易懂的DRL代码,
由于参考了ElegentRL和Easy的库,from easy to elegent 故起名为freeRL,
free也是希望写出的代码可以随意的,自由的从此代码移植到自己的代码上。

python环境

python 3.11.9
torch 2.3.1+cu121
gymnasium[all] 0.29.1
pygame 0.25.2 # 这个版本和gymnasium[all]0.29.1兼容

效果

在参数没有精细调整的情况下,在大多数的环境已能适用。
用DQN算法在LunarLander-v2环境下训练500个轮次的3个seed的效果:线为均值,阴影为方差
在这里插入图片描述
用 seed = 0 训练的模型评估,评估100个不同的seed的结果。
在这里插入图片描述
随机选择其中一个seed的结果,渲染环境。
在这里插入图片描述

已复现结果

1.DQN
2.DQN_Double
3.DQN_Dueling
4.DQN_PER
5.DQN_Noisy
6.DQN_N_Step
7.DQN_Categorical
8.DQN_Rainbow

其中:
1 实现在DQN_file/DQN.py
2-8 实现在DQN_file/DQN_with_tricks.py

在这里插入图片描述

综述

为了便于对算法的理解和改动,我将一个整体的算法训练和评估分离开来。

DQN_file
├── learning_curves
│   ├── env_name_1
│	│   ├── DQN_3_seed.npy
│   │   └── DQN.png
│   └── env_name_2
├── results
│   ├── env_name_1
│	│	├── DQN_1
│	│	│	├── DQN_seed_0.npy
│	│	│	├── DQN.pt
│	│	│	├── evaluate.gif
│	│	│	├── evaluate.png
│	│	│	└── events.out.tfevents.
│	│	├── DQN_2
│	│	└── DQN_3
│   └── env_name_2
├── plot_learning_curves.py
├── evaluate.py
├── Buffer.py
└── DQN.py

首先看最下面几个具体的py文件
1.evaluate.py 实现评估。
2.plot_learning_curves.py实现多个seed的学习曲线的绘制和算法比较。
3.DQN.py 实现算法。
4.Buffer.py 实现经验池,经验池基本通用。

以DQN.py为算法.py举例

DQN.py(主要)

建议边打开github上DQN.py的代码边看。

算法实现

一个深度强化学习算法分三个部分实现:
1.Agent类:包括actor、critic、target_actor、target_critic、actor_optimizer、critic_optimizer、
2.DQN算法类:包括select_action,learn、save、load等方法,为具体的算法细节实现
3.main函数:实例化DQN类,主要参数的设置,训练、测试、保存模型等

这三个部分均在DQN.py里实现。

参数修改

参数修改 改三处:
1.MLP的hidden (此参数往往在第一部分开头实现)
2.main中args
3.dis_to_con中的离散转连续空间维度(针对无法转成连续域的算法,例:DQN)

对于1.需要单独修改的理由
hidden的层数和个数容易变化,且RL的许多的算法创新实现在MLP(Qnet,Actor,Critic处)会有新增参数。
对于2.
args 为主要的参数,算法独有或共有或保存位置的修改。
对于3.
主要针对DQN只能对离散环境适用,不能对连续环境适用,进行的转换。
将动作分配成多维的离散动作,使得算法可以适用,相对的,在采样环境时,需要将离散的动作转换成连续的动作。

基本的参数没有精细调整,这里DQN使用离散环境MountainCar-v0为基准来调整参数,以此能收敛为目标了,后发现此参数可以适用大多数其他环境,但不是全部。
使用MountainCar-v0的理由:环境的目标是到达最高的山峰,但环境中还有个次高的山峰,个人认为可以很好拟合出梯度中的次优解。

细节实现

1.对于不同的算法的实现,在代码中给出论文链接和不同实现。
2.在RL中使用常用的,通用的pytorch代码,易懂。见:【深度强化学习】常常使用的pytorch代码
3.区分env的terminated,truncated
4.区分训练时用的action(例:(-1,1))和env能接受的action_(例:(-3,3))
(区分3,4两点对于收敛有很大帮助。)
5.区分环境采样过程和训练过程,以提高算法的拓展性。
6.以max_episodes为终止条件,但是训练以step为最小单位。

显示训练,保存训练

1.训练时,使用tensorboard来显示实时的学习曲率。

在DQN_file(算法)文件夹下,D:FreeRL/DQN_file 终端里输入:
tensorboard --logdir=results/env_name
在跳出的http://localhost:6008/ 按住ctrl点击进入就行。

tensorboard保存的文件events.out.tfevents.和模型的位置一致。

保存模型的频率设置为总回合的1/4。

2.在results文件夹下,不同环境为文件夹名下,在算法(或算法+trick)为文件夹名里,(results/env_name/DQN_1)保存模型文件(DQN.pt)及其训练时每个episode的return值,以不同seed为区分(DQN_seed_0.npy)(此npy用于后续画学习曲率)

每进行一次训练文件夹后面的数DQN_n,n+1。

Buffer.py

在创建buffer时直接使用zeros来创建,比使用deque来创建在最后使用python基本数据再转成numpy再转成tensor速度要快。
这里使用numpy实现来使它更快一点。(参考elegentrl)
在这里插入图片描述

其他一些buffer的实现,都实现在此。

evaluate.py

实现对模型的评估,可设定评估的轮次数,设定是否保存渲染环境gif。

这里seed的设定值须与训练的seed值不同。
由于gymnasium可以设定env的seed。这里将环境的seed值设定为当前遍历的轮次,以实现seed的改变。
在gymnasium中,如果有实现任务所达到的return值,在画评估图时,以此为基线。

环境gif的保存,则是随机挑选其中一个回合进行保存。

此代码所得到的evaluate.png,evaluate.gif均保存在模型所在位置。(results/env/DQN_1/下)

(上述效果的最后两个图)

learning_curves

1.将不同的results/env/algorithm_trick_n下的DQN_seed_n.npy绘制成一个学习曲线
以均值为线,阴影为方差。
2.将比较的多个seed的episode_return 另保存为DQN_3_seed.npy方便后续比较。
3.可以选择是否比较此算法的其他trick算法。

可以设置seed_num大小,取决于你在环境的测试中,实验了几次不同的seed大小,这里仅使用seed =
0,10,100来进行绘制,当然也可以只进行一个seed的绘制。(这里有进行平滑处理,可以设置)

生成的学习曲线图为DQN.py 和保存的DQN_3_seed.npy保存在learning_curves/env/下

(上述效果的第一张图为学习曲线图,已复现的结果为比较图)

相关文章:

【FreeRL】我的深度学习库构建思想

文章目录 前言参考python环境效果已复现结果 综述DQN.py(主要)算法实现参数修改细节实现显示训练,保存训练 Buffer.pyevaluate.pylearning_curves 前言 代码实现在:https://github.com/wild-firefox/FreeRL 欢迎star 参考 动手学强化学习e…...

Docker部署nginx容器无法访问80端口

问题说明 在阿里云ECS服务器上部署一台CentOS服务器,然后在里面安装了docker服务。用docker部署了nginx,开启docker中的nginx服务,映射宿主机端口80 把阿里云服务器上面的安全组放开了80端口 但是还是无法访问nginx的80web界面 问题分析 查…...

Python语言开发学习之使用Python预测天气

什么是wttr? 使用Python预测天气的第一步,我们要了解wttr是什么。wttr.in是一个面向控制台的天气预报服务,它支持各种信息表示方法,如面向终端的ANSI序列(用于控制台HTTP客户端(curl、httpie或wget))、HTML(用于web浏览器)或PNG(…...

minio实现大文件断点续传

最近工作中遇到一个需求,用户需要上传大文件几百M,为了更好的用户体验,需要支持断点续传,秒传,上传进度条等功能。需求如下: 方案有两种: 第一种:前端直接将整个大文件丢到后端&…...

Qt绘制动态仪表(模仿汽车仪表指针、故障灯)

背景: 项目需要,可能需要做一些仪表显示。此篇除了介绍实现方法,还要说明心路历程。对我而言,重要的是心理,而不是技术。写下来也是自勉。 本人起初心里是比较抵触的,从业20多年了,深知所谓界…...

【视频教程】GEE遥感云大数据在林业中的应用与典型案例实践

近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…...

【时时三省】c语言例题----华为机试题<字符串排序>

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,题目 HJ14 字符串排序 描述 给定 n 个字符串,请对 n 个字符串按照字典序排列。 数据范围: 1≤n≤1000 1≤n≤1000 ,字符串长度满足 1≤l…...

基于vue框架的城市体育运动交流平台15s43(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,赛事类型,近期赛事,比赛报名,器材类型,器材信息,自由约战,运动队伍 开题报告内容 基于Vue框架的城市体育运动交流平台开题报告 一、项目背景与意义 随着城市化进程的加速和居民健康意识的提升,城市体育运动已成为现代…...

2024年软件测试经典大厂面试题(全3套)【包含答案】

前言 金三银四即将过去,后面迎来的便是金九银十,一直想着说分享一些软件测试的面试题,这段时间做了一些收集和整理,下面共有三篇经典面试题,大家可以试着做一下,答案附在后面,希望能帮助到大家。…...

What is Node.JS and its Pros and Cons

What is Node.JS and its Pros and Cons JavaScript is a client-side development tool. Node.js is a server-side development tool. And it’s only a runtime environment based on Chrome V8 so we don’t write some code in Node.js. Pros: JavaScript on a server …...

TestCraft - GPT支持的测试想法生成器和自动化测试生成器

在当今快速变化的软件开发世界中,自动化测试已成为确保软件质量的关键环节。而随着AI技术的进步,越来越多的工具开始引入人工智能,来辅助生成测试用例和自动化测试脚本。其中,TestCraft,作为一款GPT支持的测试想法生成…...

FreeRTOS内部机制学习04(任务通知和软件定时器)

文章目录 何为任务通知?任务通知使用例子任务通知的优势以及劣势优势劣势 深入源码看看API函数内部干了什么函数的种类函数都做了啥? 软件定时器软件定时器的作用软件定时器内部到底做了什么实现了“闹钟”功能引入守护任务,守护任务做了啥&a…...

华为eNSP :WLAN的配置

一、WLAN的知识点: VLAN配置: VLAN:可以想象成一个大房子(网络)里划分的不同房间(VLAN)。每个房间可以有自己的功能,比如一个用于睡觉(管理),另一…...

中国大数据产业的融资热潮来袭,哪些领域最受资本青睐?

大数据产业是以数据及数据所蕴含的信息价值为核心生产要素,通过数据技术、数据产品、数据服务等形式,使数据与信息价值在各行业经济活动中得到充分释放的赋能型产业。 基于启信产业大脑的海量数据与专业研判模型,本文将从产业图谱、区域分析…...

Unity数据持久化 之 使用Excel.DLL读写Excel表格

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ 终于找到一个比较方便容易读表的方式了,以前用json读写excel转的cvs格式文件我怎么使用怎么别扭&#xf…...

Linux系统:chown命令

1、命令详解: chown命令用于设置文件所有者和文件关联组的命令,全称为change directory。在Linux当中默认文件均有拥有者,可以利用 chown 将指定文件的拥有者改为指定的用户或组,输入参数时用户可以是用户名或者用户 ID&#xff0…...

Unity3D ARPG(动作角色扮演游戏)设计与实现详解

动作角色扮演游戏(Action Role-Playing Game, ARPG)结合了传统角色扮演游戏(RPG)的深度与动作游戏(Action Game)的即时反应和流畅战斗体验。Unity3D 作为一款强大的跨平台游戏开发引擎,为开发者…...

Qt实现登录界面

本文基于Qt实现一个简单的登录界面,主要使用到Widget、button、edit等控件,基于自定义的信号槽实现界面的跳转,使用绘图设备添加背景图等。 1. 创建主界面 设计主界面的样式,并添加相关的控件。如下显示: 代码如下&…...

big.LITTLE

big.LITTLE 1 多核异构调度算法 http://www.linaro.org/?sbig.LITTLE http://git.linaro.org https://wiki.linaro.org/Archived%20LSK%20Versions big.LITTLE CPUs can be configured in 2 modes of operation: IKS – In Kernel Switcher (also known as CPU Migration…...

汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推

汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推 ①得物 【八大职类】技术、供应链、产品、运营、设计、职能、商品研究、风控等大类…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

SpringTask-03.入门案例

一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...