CarRacing DQN: 深度 Q 学习训练自驾车

news2024/12/30 3:31:12

OpenAI GYM CarRacing DQN: 深度 Q 学习训练自驾车

    • 引言
    • DQN 算法原理
      • Q 值和 Bellman 方程
      • DQN 结构
    • 训练过程设计
      • 经验回放(Experience Replay)
      • 目标网络(Target Network)
      • 训练循环
    • 训练结果和模型演变
      • 400 轮训练后
      • 500 轮训练后
      • 600 轮训练后
    • 总结

引言

在强化学习领域,训练一个能够自动驾驶的 CarRacing 2D 代理是一个引人入胜的挑战。在本博客中,我们将深入研究使用 TensorFlow 和 Keras 实现的深度 Q 学习(DQN)的代码,以训练一个能够在 CarRacing 的虚拟赛道上导航的模型。
在这里插入图片描述

DQN 算法原理

Q 值和 Bellman 方程

Q 值(状态-动作对的期望累积奖励)由 Bellman 方程定义:
[ Q(s,a) = r(s,a) + \gamma \max Q(s’, A) ]

  • (s) 是当前状态
  • (a) 是采取的动作
  • (r(s,a)) 是在状态 (s) 采取动作 (a) 后的奖励
  • (s’) 是下一个状态
  • (A) 是动作空间
  • (\gamma) 是折扣率,用于衡量未来奖励的重要性

DQN 结构

DQN 将 Q 学习与深度学习相结合,将 Q 表替换为神经网络。模型的结构如下:

model = Sequential()
model.add(Conv2D(filters=6, kernel_size=(7, 7), strides=3, activation='relu', input_shape=(96, 96, self.frame_stack_num)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=12, kernel_size=(4, 4), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(216, activation='relu'))
model.add(Dense(len(self.action_space), activation=None))
model.compile(loss='mean_squared_error', optimizer=Adam(lr=self.learning_rate, epsilon=1e-7))
  • 输入是三个连续的顶视图图像,每个为 96x96 像素
  • 卷积层和最大池化层用于捕捉图像特征
  • 全连接层输出每个动作的 Q 值

训练过程设计

经验回放(Experience Replay)

为了打破数据间的时序相关性,采用经验回放,将先前的经验存储在经验池中,并从中随机抽样用于训练。

def memorize(self, state, action, reward, next_state, done):
    self.memory.append((state, self.action_space.index(action), reward, next_state, done))

目标网络(Target Network)

引入目标网络,减缓目标的变化,提高训练的稳定性。

def update_target_model(self):
    self.target_model.set_weights(self.model.get_weights())

训练循环

def replay(self, batch_size):
    minibatch = random.sample(self.memory, batch_size)
    train_state = []
    train_target = []
    for state, action_index, reward, next_state, done in minibatch:
        target = self.model.predict(np.expand_dims(state, axis=0))[0]
        if done:
            target[action_index] = reward
        else:
            t = self.target_model.predict(np.expand_dims(next_state, axis=0))[0]
            target[action_index] = reward + self.gamma * np.amax(t)
        train_state.append(state)
        train_target.append(target)
    self.model.fit(np.array(train_state), np.array(train_target), epochs=1, verbose=0)

在每次训练循环中,从经验池中随机选择批量数据,计算目标 Q 值,并更新模型权重。

训练结果和模型演变

通过训练,我们观察到模型逐渐学会在赛道上导航:

400 轮训练后

模型在学习中遇到急转弯时的困难,偶尔偏离赛道。

500 轮训练后

模型变得更加熟练,减少了错误,驾驶更加平稳。

600 轮训练后

模型在贪婪获取奖励时变得鲁莽,导致在急转弯时离开赛道。

总结

本博客深入剖析了使用 DQN 算法训练自驾车代理的过程。通过经验回放和目标网络的应用,模型逐渐学会优化 Q 值以实现更好的导航策略。深度 Q 学习为解决复杂环境中的决策问题提供了一种强大而灵活的方法,为自动驾驶领域的研究和应用提供了新的思路。

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

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

相关文章

tomcat session cookie值设置逻辑

tomcat session cookie 值设置,tomcat jsessionid设置 ##调用request.getSession() Controller RequestMapping("/cookie") public class CookieController {RequestMapping("/tomcatRequest")ResponseBodypublic String tomcatRequest(HttpS…

buuctf-Misc 题目解答分解109-111

109.[CFI-CTF 2018]webLogon capture 流量包分析, wireshark 打开 就这几个数据包,追踪http 进行url 解码 URL网址解码器 - 在线网址解码 得到flag CFI{1ns3cur3_l0g0n} 110.[GKCTF 2021]excel 骚操作 下载 excel 文件 ,打开 发现点击其他地…

编程语言的发展趋势和未来方向

1、编程语言的未来? 随着科技的飞速发展,编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心,为程序员提供了与机器沟通的桥梁。那么,在技术不断进步的未来,编程语言的走向又将如何呢? 方…

通信原理期末复习——计算大题(一)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

金和OA C6 MailTemplates.aspx sql注入漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 MailTemplates.aspx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏…

计算机毕业设计选题分享-SSM律师事务所业务管理系统01664(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM律师事务所业务管理系统 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景…

牛客网BC12-字符圣诞树

字符圣诞树 解题思路: 确定行数,一共5行,循环5次确定每行答应的内容,分成两部分,空格和字符 打印空格的个数依次递减打印字符的个数依次递增 找出打印空格和字符的个数与行数之间的关系 int main() {char ch 0;scanf(…

【C++】内存对齐

本篇文章介绍C中的内存对齐,后续介绍C的union和C的variant的时候,需要用到这部分的知识。 占用内存 先回忆下C各个数据类型占用的内存大小: int:所占内存大小:4byte 32bit;char:所占内存大小…

单机部署Rancher

上次已经安装完毕了k8s了,但是想要界面化的管理,离不开界面工具,首推就是rancher,本文介绍安装rancher的安装,也可以将之前安装的k8s管理起来。 已经安装完毕docker和docker-ce的可以直接从第三部分开始。 一、基础准…

如何充值GPT会员账号?

详情点击链接:如何充值GPT会员账号? 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的…

五、HTML 标题

在 HTML 文档中&#xff0c;标题很重要。 一、HTML 标题 标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。 <h1>这是一个标题。</h1> <h2>这是一个标题。&l…

python 模块搜索路径

前言 当我们import os的时候&#xff0c;Python解释器去哪找os模块呢&#xff1f;如果多处都有os模块&#xff0c;选择哪个os模块呢&#xff1f; 去哪找os模块&#xff1f; Python解释器不是很神奇&#xff0c;它会从以下2个地方找os模块 1、内置模块 sys.builtin_module_nam…

软件测试|深入解析Docker Run命令:创建和启动容器的完全指南

简介 Docker是一种流行的容器化平台&#xff0c;用于构建、分发和运行应用程序。其中一个最基本且重要的Docker命令是docker run&#xff0c;用于创建和启动容器。本文将详细解析docker run命令的用途、参数和示例&#xff0c;帮助您全面掌握创建和启动容器的过程。 docker r…

竞赛保研 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…

面试官:说说HashMap和HashTable的区别

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

窗体控件(表格和控制器)

DataGridView 控件 DataGridView控件是C#中的一个Windows Forms控件&#xff0c;用于在应用程序中显示和编辑表格形式的数据。 先拖出四个label控件和四个TextBox控件和一个ComboBox和一个Button按钮&#xff0c;下面是一个DataGridView控件 准备一个Student类 namespace _窗…

html5中各标签的语法格式总结以及属性值说明

有关闭标签的元素 a元素 <a href"" target"" title""></a>表格相关元素 table元素&#xff1a;表格标签caption元素&#xff1a;表头thead元素tbody元素&#xff1a;表格主体元素tfoot元素th元素tr元素&#xff1a;行标签td元素&…

vue2 消息弹框

父页面 <template><div style"margin-top: 20px"><div class"nav-style msg-style"><el-badge :value"value" :max"99" class"num" v-if"value > 0"><i class"el-icon-bell&…

虾皮怎么选品:虾皮(Shopee)跨境电商业务成功的关键步骤

在虾皮&#xff08;Shopee&#xff09;平台上进行跨境电商业务&#xff0c;选品是至关重要的一环。有效的选品策略可以帮助卖家更好地了解市场需求&#xff0c;提高销售业绩和客户满意度。以下是一些成功的选品策略&#xff0c;可以帮助卖家在虾皮平台上取得更好的业务成绩。 先…

Unix操作系统的前世今生

Unix是一种多用户、多任务操作系统&#xff0c;最初由AT&T贝尔实验室的肯汤普逊&#xff08;Ken Thompson&#xff09;和丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;等人开发于上世纪70年代初。它被设计成一种通用的操作系统&#xff0c;支持跨多种硬件平台&#xf…