深度学习实战 | 开发一个围棋智能体

图片

01、数据模型

神经网络的训练过程需要将HD5文件中的样本数据解析出来。数据集中的棋盘局面可以提取后直接输入卷积网络进行特征提取。从属性中取出样本标签用于神经网络的损失计算和反向传播。如图1所示,落子方信息从属性中提取后不用参与棋盘局面的特征提取,而是直接加入之后的逻辑判断中。

图片

■ 图1 基本的数据流结构框架

要用神经网络来学习围棋,首先要将围棋棋盘用数学符号表示。图2显示的是5×5围棋棋盘的数字记法,通常是把二维图形盘面转换成矩阵的形式,其中,数字1代表黑棋,-1代表白棋,棋盘上的空子位用0表示。

图片

■ 图2 围棋盘面的数字记法

除了有棋盘的局面,为了让神经网络能给出落子建议,还需要告诉神经网络当前是该轮到谁来落子了。如图3所示,针对同一局面,不同的落子方也会有不同的选择。

图片

■ 图3 同一盘面的不同选择

如图5-8所示,如果整个策略完全是由全连接网络组成的,除了要把二维的棋盘摊平成一维数据之外,从保持神经网络的结构尽量简洁这个角度出发,可以只为逻辑判断网络增加一个表示是哪方落子单一输入接口,用1和-1来分别表示当前应该是黑方还是白方落子。

图片

 

■ 图4 使用全连接神经网络时的数据预处理

图4演示了采用卷积网络对围棋盘面进行处理时可选用的两种方式。一种是和前面采用全连接网络对输入进行预处理的方式类似,把对棋盘的二维结构特征提取过程和当前的落子方信息分开,当前落子方仅作为逻辑判断网络的一个单独输入节点。或者考虑到棋盘局面是一个二维数据,采用卷积网络采集图形特征的信息时,可以为卷积网络的输入多增加一个通道,用这个通道来提供当前应当是黑方还是白方落子的信息。这种方法的好处是实现上要比上一种方法简单,缺点是必须要和卷积网络搭配使用,但是考虑到围棋棋盘采用卷积网络能获取到更好的图形特征,所以对于处理围棋游戏而言这并不算是一个缺点。

图片

■ 图4 卷积神经网络对围棋盘面的两种处理方式

本文采用先通过卷积网络提取棋盘局面的特征,而后将盘面特征结合当前的落子方一起输入逻辑判断网络进行最后的落子选择。

 

02、获取训练样本

u-go.net是一个围棋爱好者自建的网站,任何人都可以从上面免费下载KGoServer(KGS)网站上棋手的对战记录。这些对战记录都被保存为SGF格式文件。网站上提供了7段以上或4段以上棋手的对弈记录,并且提供“.zip”“.tar.gz”和“.tar.bz2”三种格式文件的下载。通常为了保证机器学习后的下棋棋力,可以采用7段以上的对弈棋谱,如果样本偏少,再考虑使用4段以上的对弈棋谱。

为了在Windows上处理这些数据方便,推荐下载“.zip”格式的文件。如果读者愿意,完全可以手工逐个单击下载,不过为了方便和快速,MyGo的SGF_Parser目录下提供了一个Python小程序,可以使用这个程序方便地获取所有的“.zip”格式链接。具体的操作方法为:右击浏览器,把网页文件保存在MyGo\SGF_Parser文件夹下,使用默认文件名“u-go.net.html”保存。再在cmd窗口里运行python fetchLinks.py>zip.link来执行如代码片段1所示的Python文件。打开新生成的“zip.link”文件,将全部内容复制后粘贴到迅雷中下载,文件请保存在“MyGo\SGF_Parser\sgf_data\”。全选所有下载的ZIP文件,右击选择7-zip进行解压,选择“提取到当前目录”,这样,在“MyGo\SGF_Parser\sgf_data\”目录下就会有全部待解析处理的SGF文件了。

 【代码片段1】爬取训练样本的网页链接。

MyGo\SGF Parser fetchLinks.py
from bs4 import BeautifulSoup
f = open('u-go.net.html','r')
html = f.read()
soup = BeautifulSoup(html,"html.parser")
for link in soup.find all('a'):
if'zip'in link.get('href'):
print(link.get('href'))

 围棋棋盘本身并没有方向性。例如,开局时己方第一个子落在哪个星位对对手而言并没有什么区别。但是对于计算机而言,程序没有人类那种自适应的能力,特别是通过卷积网络来提取特征值时,网络对物体特征的位置或者方向是很敏感的。图像识别的人工智能训练中有一种称为数据增强的技术,方式是通过旋转或者翻转原始样本来增加神经网络训练时的样本集,这便使得神经网络在训练后能够识别倒转的、对称的或者不同角度的目标物体。在训练围棋智能体的时候,为了提高训练的效率也采用类似的技术。由于围棋棋盘总是一个四方形,在获取一个训练样本后,可以对这个样本进行90°、180°、270°的旋转,同时还可以对样本进行水平镜像翻转,并再次进行之前的旋转操作。如图5所示,一盘盘面通过上述这种技术处理后就变成了8个样本。

图片

■ 图5 一盘盘面处理成8个样本

由于人工棋谱的数量相对于机器学习所需要的数量来说还是相对偏少的,通过上述技术可以缓解这个问题,但是要从根本上解决,必须要将样本生成的过程自动化。最方便的产生棋谱的方式是使用现有的围棋智能程序来相互对弈,通过这种方式可以产生源源不断的围棋棋谱。但是这种方式有一个致命的缺点,就是被训练的智能程序在棋力上很难突破原智能程序。这个致命缺点也是传统的以监督学习为核心算法的人工智能的一个通病。在后面的章节中将会看到其他更加有效的方法来增强围棋智能体的训练结果。不过目前而言,通过这种传统方法,围棋智能程序在棋力上已经能够胜过随机落子的系统了。

03、代码演示

传统的神经网络通过监督学习来更新其中的参数信息,本质上就是通过拟合训练集中的数据从而建立一个预测函数,并依靠这个函数对新的数据推测出新的结果。其中,训练资料是由输入样本和预期输出的标签所组成。而函数的输出可以是一个连续的数值或是预测一个分类。简单来看,围棋游戏可以抽象为人工智能研究领域的分类问题。19路棋盘的361个落子位就是361种分类。本节将会利用前面的知识并使用神经网络来具体实现一个智能程序,它可以根据棋面的不同局势判定当前棋局局面应该归类为361个分类中的哪一个,并给出落子建议。

结构上可以借鉴著名的Inception来构建围棋智能程序网络。在Inception出现之前,大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。

Inception结构的主要特点是采用了不同大小的卷积核对同一对象进行特征提取并在最后对不同尺度的特征进行拼接融合。初级阶段可以不必使用像Inception那么深的网络,图6是模仿并简化了Inception后的卷积网络结构,它只借鉴Inception的一组模块用于棋盘的棋形识别,然后再使用全连接层来做逻辑判断。为了能平滑地从卷积网络过渡到感知网络,可以故意让最后一层卷积的输出是一个1×1×c的形状,然后再使用flatten功能把这层展开为感知网络。

图片

■ 图6 模仿并简化Inception后的卷积网络架构

在机器学习中,样本常常不能一次性获取全部完整的样本,它总是一点一点积累的。在围棋训练样本这件事情上也是一样,得到一些棋谱就把它们拿来作为训练样本,等有新的赛事结束后再把新的棋谱拿来作新的样本。每次获取到新的样本集后都可以为其独立生成一个HDF5文件,而无须每次都全量重新生成一个单独的HDF5文件。在训练时,每次都从文件系统上随机抽取HDF5文件会增加磁盘I/O的开销。由于HDF5文件结构非常简单,从理论上看,只要保证group名不重复,把新增的HDF5文件合并到原来的HDF5文件上是完全可行的。技术上,HDF5官方套件提供了一个叫作h5copy的命令行工具可以用来做HDF5文件的合并,但在使用它之前,需要下载完整的HDF5应用程序,Windows用户可以在官网上直接下载。 

代码片段2定义了存放学习记录的位置、学习样本文件和网络模型。

【代码片段2】初始定义。

filePath = "./game_recorders/game_recorders.h5"   #1
games = HDF5(filePath,mode = 'r')                 #2
type = 'pd_dense'                                 #3
model = DenseModel( dataGenerator = games. yeilds_data, boardSize = 9, dataSize = 1024 * 100,model = type)                                 #4

 说明/

(1) 学习样本的数据存放在HDF5的格式文件中。训练样本可以从历史棋局中获取,也可以通过程序来自动生成,如何通过程序来自动生成棋谱将在通用化围棋智能体程序中进行介绍。

(2) 通过games来实现从存储样本的HDF5文件中获取训练样本和对应的标签。

(3) 在DenseModel()中预定义了网络模型,pd_dense类型包含一个可选的参数用来专门指定是使用全连接网络还是卷积网络,默认是卷积网络。type也可以直接设定为cnn,从而显式地指出使用卷积网络。

(4) 调用预定义的DenseModel()神经模型。使用games中的数据发生器来产生源源不断的训练数据。数据发生器是一项非常好用的技术,特别是对于样本数据量巨大的训练过程,系统由于内存限制,不可能一次性载入全部数据,通过这项继续,训练过程可以逐个按需获取训练样本。

代码片段3定义了模型的编译、学习及保存的方法。

【代码片段3】模型的编译、学习及保存。

MyGo sample loader.py
model.model compile()        #1
model.model fit(batch size = 16 * 2,epochs = 10000,earlystop = 10,checkpoint = True)  #2
model.model save(type + '.h5')  #3

说明/

(1) 使用DenseModel()方法预定义的梯度优化算法和误差函数。

(2) 开始训练,这里使用了早停和记录网络参数的功能。由于训练回合过多,对训练效果也不清楚,所以使用早停和参数记录可以避免由于网络设计不合理导致的训练时间浪费。

(3) 训练完成后保存模型。

使用Keras来做传统的神经网络训练十分方便,代码写作方式也基本固定,额外要做的仅是在参数选择上进行调整。大家可以使用MyGo\test_fast_play.py来看一下使用这种训练方法的棋力。

代码片段4演示了其中如何装载和使用学习后的智能体。

【代码片段4】装载智能体并开始下棋。

MyGo test fast play.py
from board fast import *   #1
board = Board(size = 9)
bot1= None #2
bot2 = Robot(ai='SD', boardSize = 9,model = pd dense')   #2
game = Game(board)
print(game.run(play b = bot1,play w = bot2,isprint = True)) #3

说明/

(1) 引入board_fast工具下的所有类方便后续调用。

(2) bot1设置手工输入,bot2采用刚刚训练好的模型。Robot类默认装载MyGo目录下的lj.h5神经网络权重文件,所以在使用训练结果时要记得手工调整一下训练结果文件的文件名。

(3) 运行棋局并打印出胜负结果。

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

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

相关文章

Spire.Office for.NET Crack

Spire.Office for.NET Crack Spire.Office for.NET是E-iceblue提供的企业级Office.NET API的组合。它包括Spire.Doc、Spire.XLS、Spire.Seadsheet、Spire.Presentation、Spire_PDF、Spire.DataExport、SpireOfficeViewer、Spire-PDFViewer、Spire.DocViewer、Spire.Barcode和Sp…

在linux中怎样同时运行三个微服务保证退出时不会终止

前言 1.maven中打jar包 使用插件打包,必须在pom.xml中添加插件,否则不能在linux中编译运行 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version&g…

AMEYA详解松下Panasonic HF SSOP 1 Form A AQY PhotoMOS继电器

Panasonic HF SSOP 1 Form A AQY PhotoMOS继电器采用微型SSOP封装&#xff0c;具有600V的负载电压和1500Vrms 的I/O隔离电压 这些继电器具有8Ω的低导通电阻和高速运行的特点&#xff0c;SSOP封装旨在实现高密度安装。Panasonic HF SSOP AQY PhotoMOS继电器适用于从测试和测量设…

postman和jmeter的区别何在?

小伙伴们大家好呀&#xff0c;前段时间笔者做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xf…

柴洪峰院士:大模型赋能金融科技思考与展望

本文整理自7月7日世界人工智能大会“AI生成与垂直大语言模型的无限魅力”论坛上中国工程院院士、复旦大学金融科技研究院院长柴洪峰《大模型赋能金融科技思考与展望》的主题分享&#xff0c;从金融垂直模型构建、金融知识图谱与大模型融合以及金融大模型的监管三个方面进行介绍…

Mycat-Balance使用指南

MyCAT Balance是一个Java NIO的高性能负载均衡器&#xff0c;可以替代普通的硬件的交换机或其LVS类似的复杂机制&#xff0c;实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下&#xff0c;frontend-conf.为前端配置&#xff0c;包括绑定的端口等&#xff0c;js…

uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)

本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 优点 只设置一次不采用定时器的方式无需多个页面调用单独页面若想获取当前位置是否变化 可单独设置监听,并调用不同逻辑事件 原理: 采用uniapp推出的: un…

数学建模学习(7):Matlab绘图

一、二维图像绘制 1.绘制曲线图 最基础的二维图形绘制方法&#xff1a;plot -plot命令自动打开一个图形窗口Figure&#xff1b; 用直线连接相邻两数据点来绘制图形 -根据图形坐标大小自动缩扩坐标轴&#xff0c;将数据标尺及单位标注自动加到两个坐标轴上&#xff0c;可自定…

亚马逊云科技HPC解决方案,帮助浙江大学实现成本和科研任务的双丰收

浙江大学土壤学科是朱祖祥院士等几代土壤科学家共同创建的A国家重点学科&#xff0c;整体实力雄厚&#xff0c;优势特色明显&#xff0c;总体水平居国内前列。在亚马逊云科技科研创新支持计划&#xff08;Amazon Web Services Cloud Credits for Research&#xff09;的多次支持…

yolov8系列[五]-项目实战-yolov8模型无人机检测

yolov8系列[五]-项目实战-yolov8模型无人机检测 项目介绍项目展示功能简介代码结构如何启动 开发者模式1. 安装依赖环境2. 启动程序 源代码下载其他 项目介绍 无人机识别项目,无人机搭载nvidia jetson边缘计算板子,进行实时识别。使用yolov8算法&#xff0c;训练了识别无人机的…

【计算机网络】网络层协议 -- IP协议

文章目录 1. 网络层做了什么事2. IP协议的简介3. IP协议格式4. 分片与组装5. 网段划分6. 特殊的IP地址7. IP地址的数量限制8. 私网IP地址和公网IP地址9. 路由 1. 网络层做了什么事 保证数据可靠地从一台主机到另一台主机 当双方在进行基于TCP的网络通信时&#xff0c;要保证将数…

HCIP OSPF链路状态类型总结

OSPF的LSA OSPF是典型的链路状态路由协议&#xff0c;使用LAS&#xff08;链路状态通告&#xff09;来承载链路状态信息。LSA是OSPF的一个核心内容&#xff0c;如果没有LSA&#xff0c;OSPF 是无法描述网络的拓扑结构及网段信息的&#xff0c;也无法传递路由信息&#xff0c;更…

hbuilderx主题色分享-github风格

效果 步骤 hbuilderx总共有三种主题&#xff0c;绿柔主题Default,酷黑主题Monokai,雅黑主题Atom One Dark,修改主题色是基于三种主题之一的&#xff0c;不能直接创建一个新主题&#xff0c;比如下方配置是基于Atom One Dark(对象名为[Atom One Dark])&#xff0c;则当前hbuild…

Profinet转EtherNet/IP网关连接AB PLC的应用案例

西门子S7-1500 PLC&#xff08;profinet&#xff09;与AB PLC以太网通讯&#xff08;EtherNet/IP&#xff09;。本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关&#xff0c;连接西门子S7-1500 PLC与AB PLC 通讯的配置过程&#xff0c;供大家参考。 1, 新建工程&…

06-MySQL-基础篇-SQL之DCL语句

SQL之DCL语句 前言DCL 管理用户查询用户创建用户修改用户密码删除用户说明 权限控制常见权限描述查询权限授予权限撤销权限说明 前言 本篇来学习下SQL中的DCL语句 DCL DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权…

有哪些类似bootstrap的纯css框架?

前言 下面是一些类似bootstrap的css框架&#xff0c;以及其开源的仓库和网址附上&#xff0c;整理不易&#xff0c;希望多多点一下赞同收藏喜欢哈~ 1、Tailwind Star&#xff1a;70.5k Tailwind CSS 是一个实用的工具集&#xff0c;用于快速构建现代化的自定义用户界面。它提…

7、单元测试--测试RestFul 接口

单元测试–测试RestFul 接口 – 测试用例类使用SpringBootTest(webEnvironment WebEnvironment.RANDOM_PORT)修饰。 – 测试用例类会接收容器依赖注入TestRestTemplate这个实例变量。 – 测试方法可通过TestRestTemplate来调用RESTful接口的方法。 测试用例应该定义在和被测…

vue2实现一个树型控件(支持展开树与checkbox勾选)

目录 vue2实现一个树型控件(支持展开树与checkbox勾选)TreeItem.vueTree.vue效果 vue2实现一个树型控件(支持展开树与checkbox勾选) TreeItem.vue <template><div class"tree-item"><span click"toggleExpanded" class"icon" v…

Sentinel Dashboard集成Nacos

1.前言 当项目上Sentinel Dashboard做流量监控的时候&#xff0c;我们可以通过Sentinel控制台修改限流配置&#xff0c;但当我们使用Nacos作为配置中心动态配置流控规则的时候&#xff0c;问题就来了。 首先我们要明白&#xff0c;Sentinel Dashboard的配置是从机器的内存中加…

TCP网络通信编程之网络上传文件

【图片】 【思路解析】 【客户端代码】 import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException;/*** ProjectName: Study* FileName: TCPFileUploadClient* author:HWJ* Data: 2023/7/29 18:44*/ public class TCPFil…