tensorflow增强学习应用于一个小游戏
首先需要安装gym模块,提供游戏的。
1,所需模块
import tensorflow as tf
import numpy as np
import gym
import random
from collections import deque
from keras.utils.np_utils import to_categorical
2,自定义一个简单的3层Dense Model
# 自定义Model
class QNetwork(tf.keras.Model):
def __init__(self):
super().__init__()
# 简单的3个Dense
self.dense1=tf.keras.layers.Dense(24,activation='relu')
self.dense2=tf.keras.layers.Dense(24,activation='relu')
self.dense3=tf.keras.layers.Dense(2)
def call(self,inputs):
x=self.dense1(inputs)
x=self.dense2(x)
x=self.dense3(x)
return x
def predict(self,inputs):
q_values=self(inputs)#调用call
return tf.argmax(q_values,axis=-1)
3,定义相关参数
# 游戏环境,实例化一个游戏
env=gym.make('CartPole-v1')
model=QNetwork() # 循环轮数设置小一点,50就可以了
num_episodes=500
num_exploration=100
max_len=1000
batch_size=32
lr=1e-3
gamma=1.
initial_epsilon=1.
final_epsilon=0.01
replay_buffer=deque(maxlen=10000) epsilon=initial_epsilon
# tensorflow2.0
optimizer=tf.compat.v1.train.AdamOptimizer(learning_rate=lr)
4,训练,测试
for i in range(num_episodes):
# 初始化环境
state=env.reset()
# 逐渐衰减,至final_epsilon
epsilon=max(initial_epsilon*(num_exploration-i)/num_exploration,final_epsilon)
for t in range(max_len):
# 当前帧绘制到屏幕
env.render()
# 以epsilon的概率随机行动,epsilon是衰减的,说明游戏动作会越来越稳定
if random.random()<epsilon:
action=env.action_space.sample()
else:
# 从当前状态预测一个动作
action=model.predict(tf.constant(np.expand_dims(state,axis=0),dtype=tf.float32)).numpy()
action=action[0]
# 执行一步动作
next_state,reward,done,info=env.step(action)
# 奖励
reward=-10.if done else reward
# 缓存
replay_buffer.append((state,action,reward,next_state,done))
state=next_state
if done:
print('episode %d,epsilon %f,score %d'%(i,epsilon,t))
break
# 预测batch_size步后执行
if len(replay_buffer)>=batch_size:
# 随机获取一个batch的数据
batch_state,batch_action,batch_reward,batch_next_state,batch_done=\
[np.array(a,dtype=np.float32) for a in zip(*random.sample(replay_buffer,batch_size))]
# 下一个状态,由此得到的y为真实值
# 预测值与真实值的计算看不太懂
q_value=model(tf.constant(batch_next_state,dtype=tf.float32))
y=batch_reward+(gamma*tf.reduce_max(q_value,axis=1))*(1-batch_done)
with tf.GradientTape() as tape:
# loss=tf.losses.mean_squared_error(labels=y,predictions=tf.reduce_sum(
# model(tf.constant(batch_state))*tf.one_hot(batch_action,depth=2),axis=1))
loss=tf.losses.mean_squared_error(y,tf.reduce_sum(
model(tf.constant(batch_state))*to_categorical(batch_action,num_classes=2),axis=1))
grads=tape.gradient(loss,model.variables)
optimizer.apply_gradients(grads_and_vars=zip(grads,model.variables))
最终会出现一个窗口,平衡游戏不断进行。。。
上面注释部分因为tf.one_hot方法会报错。
tensorflow增强学习应用于一个小游戏的更多相关文章
- Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)
大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...
- DirectX游戏开发——从一个小游戏開始
本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/26364129 写在前面:自 ...
- 使用PixiJS做一个小游戏
PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...
- js实现一个小游戏(飞翔的jj)
js实现一个小游戏(飞翔的jj) 源代码+素材图片在我的仓库 <!DOCTYPE html> <html lang="en"> <head> & ...
- 通过一个小游戏开始接触Python!
之前就一直嚷嚷着要找视频看学习Python,可是一直拖到今晚才开始....好好加油吧骚年,坚持不一定就能有好的结果,但是不坚持就一定是不好的!! 看着视频学习1: 首先,打开IDLE,在IDLE中新建 ...
- 【h5-egret】如何快速开发一个小游戏
1.环境搭建 安装教程传送门:http://edn.egret.com/cn/index.php?g=&m=article&a=index&id=207&terms1_ ...
- c++学习笔记---03---从一个小程序说起2
从一个小程序说起2 要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置.当用户按下键盘上的"Enter"键时,数据输入 ...
- Egret白鹭开发微信小游戏程序跳转功能(由一个小游戏跳转到另一个小游戏)
假设我们要实现的功能是从小游戏A跳转到小游戏B 对于小游戏A: (1)在platform.ts中添加代码如下: /** * 平台数据接口. * 由于每款游戏通常需要发布到多个平台上,所以提取出一个统一 ...
- c++学习笔记---02---从一个小程序说起
从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大 ...
随机推荐
- 有关 CMMI
CMMI的全称为Capability Maturity Model Integration,即能力成熟度模型集成.CMMI是CMM模型的最新版本.早期的CMMI(CMMI-SE/SW/IPPD),SE ...
- 用Python实现的二分查找算法(基于递归函数)
一.递归的定义 1.什么是递归:在一个函数里在调用这个函数本身 2.最大递归层数做了一个限制:997,但是也可以自己限制 1 def foo(): 2 print(n) 3 n+=1 4 foo(n) ...
- 开始PHP,常量/变量与内存间的关系--传值
一.常见的PHP代码嵌入式方式,与html结合 要注意:文件名后缀必须形如xxx.php否则html将无法解析 二.php脱离html代码独立工作,没有其他代码 不需要借助Apache工作,只需要ph ...
- js 选中文字
选中文字,文字背景是蓝色 当前点击的元素: var e = e || event; var tag = e.target || e.srcElement; 选中文字:window.getSelecti ...
- CSS3 选择器——笔记+实战案例(基本选择器、组合选择器、属性选择器、伪类选择器)
使用CSS3 选择器——笔记 CSS通过选择器控制HTML元素,CSS选择器对网页对象可以实现一对一.一对多或者多对一的匹配. 一.CSS3选择器分类 CSS选择器在CSS2.1选择器的基础上新增了属 ...
- NOIP2017提高A组模拟10.6】Biology
题目 trie 暴力就是对于每个询问的T个字符串 第i个和第i+1个直接个从后暴力枚举每位是否相同, 但这个方法TLE 我们考虑是否可以用更快的方法来求出两个字符串的最长公共后缀. 我们把所有的字符串 ...
- head first 设计模式笔记3-装饰者模式:星巴兹饮料
开放原则:类应该对扩展开放,对修改关闭. - 上篇博客中的观察者模式中,通过加入新的观察者,我们可以在任何时候扩展主题(Subject),而且不需向主题中添加代码. - 装饰者模式也完全遵循开放原则. ...
- 计算机网络(八),TCP的滑动窗口
目录 1.RTT和RTO 2.TCP使用滑动窗口做流量控制与乱序重排 3.滑动窗口的基本原理 八.TCP的滑动窗口 TCP头部中的窗口字段:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端 ...
- sh_03_列表的数据统计
sh_03_列表的数据统计 name_list = ["张三", "李四", "王五", "王小二", "张三 ...
- rm:删除文件或目录
在使用 rm 命令删除文件或目录时,系统不会产生任何提示信息.此命令的基本格式为:rm[选项] 文件或目录 选项: -f:强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直 ...