1. 程式人生 > >(Tensorflow1.0)強化學習實現遊戲AI(Demo_1)

(Tensorflow1.0)強化學習實現遊戲AI(Demo_1)

http://blog.topspeedsnail.com/archives/10459
在學習完這篇文章好,打算循序漸進的實現俄羅斯方塊AI和鬥地主AI,並且突破DQN,使用對抗神經網路來實現更強大的AI下面程式碼實現的是上面部落格的程式,發現了tensorflow1.0後的一個坑,tf.mul函式改名了,tf,multiply....改成全拼了


# -*- coding: utf-8 -*-

import pygame
from pygame.locals import *
import sys
import tensorflow as tf
import cv2
import random
import numpy as np
from collections import deque
print (tf.__version__)
BLACK     = (0  ,0  ,0  )
WHITE     = (255,255,255)

SCREEN_SIZE = [320,400]
BAR_SIZE = [20, 5]
BALL_SIZE = [15, 15]
MOVE_STAY=[1,0,0]
MOVE_LEFT=[0,1,0]
MOVE_RIGHT=[0,0,1]
LEARN_RATE=0.99
INIT_ESPTION=1.0
FINAL_ESPTION=0.05
EXPLORE=50000
OBSERVE=5000
REPLAY_MEMORY=500000
BATCH=100
class Game(object):
    def __init__(self):
        pygame.init()
        self.clock = pygame.time.Clock()
        self.screen = pygame.display.set_mode(SCREEN_SIZE)
        pygame.display.set_caption('Simple Game')

        self.ball_pos_x = SCREEN_SIZE[0]//2 - BALL_SIZE[0]/2
        self.ball_pos_y = SCREEN_SIZE[1]//2 - BALL_SIZE[1]/2
        # ball移動方向
        self.ball_dir_x = -1 # -1 = left 1 = right  
        self.ball_dir_y = -1 # -1 = up   1 = down
        self.ball_pos = pygame.Rect(self.ball_pos_x, self.ball_pos_y, BALL_SIZE[0], BALL_SIZE[1])

        self.score = 0
        self.bar_pos_x = SCREEN_SIZE[0]//2-BAR_SIZE[0]//2
        self.bar_pos = pygame.Rect(self.bar_pos_x, SCREEN_SIZE[1]-BAR_SIZE[1], BAR_SIZE[0], BAR_SIZE[1])

    def bar_move_left(self):
        self.bar_pos_x = self.bar_pos_x - 2
    def bar_move_right(self):
        self.bar_pos_x = self.bar_pos_x + 2

    def run(self,action):
       # pygame.mouse.set_visible(0) # make cursor invisible

       # bar_move_left = False
        #bar_move_right = False
        while True:
            ''' for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:  # 滑鼠左鍵按下(左移)
                    bar_move_left = True
                elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: # 滑鼠左鍵釋放
                    bar_move_left = False
                elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 3: #右鍵
                    bar_move_right = True
                elif event.type == pygame.MOUSEBUTTONUP and event.button == 3:
                    bar_move_right = False
'''
            if action == MOVE_LEFT:
                self.bar_move_left()
            if action==MOVE_RIGHT:
                self.bar_move_right()
            else :
                pass
            if self.bar_pos_x<0:
                self.bar_pos_x=0
            
            if self.bar_pos_x>SCREEN_SIZE[0]-BAR_SIZE[0]:
                self.bar_pos_x=SCREEN_SIZE[0]-BAR_SIZE[0]
            
            self.screen.fill(BLACK)
            
            self.bar_pos.left = self.bar_pos_x
            pygame.draw.rect(self.screen, WHITE, self.bar_pos)

            self.ball_pos.left += self.ball_dir_x * 2
            self.ball_pos.bottom += self.ball_dir_y * 3
            pygame.draw.rect(self.screen, WHITE, self.ball_pos)

            if self.ball_pos.top <= 0 or self.ball_pos.bottom >= (SCREEN_SIZE[1] - BAR_SIZE[1]+1):
                self.ball_dir_y = self.ball_dir_y * -1
            if self.ball_pos.left <= 0 or self.ball_pos.right >= (SCREEN_SIZE[0]):
                self.ball_dir_x = self.ball_dir_x * -1

            reward=0
            if self.bar_pos.top <= self.ball_pos.bottom and (self.bar_pos.left < self.ball_pos.right and self.bar_pos.right > self.ball_pos.left):
                self.score += 1
                reward=1
                print("Score: ", self.score, end='\r')
            elif self.bar_pos.top <= self.ball_pos.bottom and (self.bar_pos.left > self.ball_pos.right or self.bar_pos.right < self.ball_pos.left):
                self.score=0                
                print("Game Over: ", self.score)
                
                reward=-1

            pygame.display.update()
            
            self.clock.tick(60)
            
            MyGame_image=pygame.surfarray.array3d(pygame.display.get_surface())
            return reward ,MyGame_image
        
output=3
input_image=tf.placeholder("float", [None,80,100,4])

action=tf.placeholder("float",[None,3])


def convolutional_neural_network(input_image):
    weights = {'w_conv1':tf.Variable(tf.zeros([8, 8, 4, 32])),
               'w_conv2':tf.Variable(tf.zeros([4, 4, 32, 64])),
               'w_conv3':tf.Variable(tf.zeros([3, 3, 64, 64])),
               'w_fc4':tf.Variable(tf.zeros([3456, 784])),
               'w_out':tf.Variable(tf.zeros([784, output]))}

    biases = {'b_conv1':tf.Variable(tf.zeros([32])),
              'b_conv2':tf.Variable(tf.zeros([64])),
              'b_conv3':tf.Variable(tf.zeros([64])),
              'b_fc4':tf.Variable(tf.zeros([784])),
              'b_out':tf.Variable(tf.zeros([output]))}

    conv1 = tf.nn.relu(tf.nn.conv2d(input_image, weights['w_conv1'], strides = [1, 4, 4, 1], padding = "VALID") + biases['b_conv1'])
    conv2 = tf.nn.relu(tf.nn.conv2d(conv1, weights['w_conv2'], strides = [1, 2, 2, 1], padding = "VALID") + biases['b_conv2'])
    conv3 = tf.nn.relu(tf.nn.conv2d(conv2, weights['w_conv3'], strides = [1, 1, 1, 1], padding = "VALID") + biases['b_conv3'])
    conv3_flat = tf.reshape(conv3, [-1, 3456])
    fc4 = tf.nn.relu(tf.matmul(conv3_flat, weights['w_fc4']) + biases['b_fc4'])

    output_layer = tf.matmul(fc4, weights['w_out']) + biases['b_out']
    return output_layer


def train_neural_network(imput_image):
    predict_action=convolutional_neural_network(input_image)
    
    argmax=tf.placeholder("float",[None,output])
    
    gt=tf.placeholder("float",[None])
    
    action = tf.reduce_sum(tf.multiply(predict_action, argmax), reduction_indices = 1)   
    
    cost=tf.reduce_mean(tf.square(action-gt))
    optimizer=tf.train.AdadeltaOptimizer(1e-6).minimize(cost)
    
    game=Game()
    D=deque()
    
    _,image=game.run(MOVE_STAY)
    
    image=cv2.cvtColor(cv2.resize(image,(100,80)),cv2.COLOR_BGR2GRAY)
    
    ret,image=cv2.threshold(image,1,255,cv2.THRESH_BINARY)
    
    input_image_data=np.stack((image,image,image,image),axis=2)
    
    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())
        
        saver=tf.train.Saver()
        n=0
        
        epsilon=INIT_ESPTION
        while True:
            action_t=predict_action.eval(feed_dict = {input_image : [input_image_data]})[0]
            
            argmax_t=np.zeros([output],dtype=np.int)
            
            if(random.random()<=INIT_ESPTION):
                maxIndex=random.randrange(output)
            
            else:
                maxIndex=np.armax(action_t)

            argmax_t[maxIndex]=1
            
            if epsilon>FINAL_ESPTION:
                epsilon-=(INIT_ESPTION-FINAL_ESPTION)/EXPLORE
            
            reward,image=game.run(list(argmax_t))
            image = cv2.cvtColor(cv2.resize(image, (100, 80)), cv2.COLOR_BGR2GRAY)
            
            ret,image=cv2.threshold(image,1,255,cv2.THRESH_BINARY)
            image=np.reshape(image,(80,100,1))
            
            input_image_datal=np.append(image,input_image_data[:,:,0:3],axis=2)
            
            D.append((input_image_data,argmax_t,reward,input_image_datal))
            
            
            if len(D) >REPLAY_MEMORY:
                D.popleft()
            
            if n >OBSERVE:
                minibatch=random.sample(D,BATCH)
                input_image_data_batch=[d[0] for d in minibatch]
                argmax_batch=[d[1] for d in minibatch]
                reward_batch=[d[2] for d in minibatch]
                input_image_data1_batch=[d[3] for d in minibatch]
                gt_batch=[]
                
                out_batch=predict_action.eval(feed_dict={input_image:input_image_data1_batch})
                
                for i in range(0,len(minibatch)):
                    gt_batch.append(reward_batch[i]+LEARN_RATE*np.max(out_batch[i]))
                
                optimizer.run(feed_dict={gt:gt_batch,argmax:argmax_batch,input_image:input_image_data_batch})
            
            input_image_data=input_image_datal
            n=n+1
            
            if n% 10000 ==0:
                saver.save(sess,'C:\\Users\\hasee\\game.cpk',global_step=n)
                
                print(n,"epsilon:",epsilon," ","action:",maxIndex," ","reward: ",reward)
                
train_neural_network(input_image)
            


相關推薦

(Tensorflow1.0)強化學習實現遊戲AI(Demo_1)

http://blog.topspeedsnail.com/archives/10459在學習完這篇文章好,打算循序漸進的實現俄羅斯方塊AI和鬥地主AI,並且突破DQN,使用對抗神經網路來實現更強大的AI下面程式碼實現的是上面部落格的程式,發現了tensorflow1.0後

AI+遊戲:高效利用樣本的強化學習 | 騰訊AI Lab學術論壇演講

騰訊 AI 人工智能 3月15日,騰訊AI Lab第二屆學術論壇在深圳舉行,聚焦人工智能在醫療、遊戲、多媒體內容、人機交互等四大領域的跨界研究與應用。全球30位頂級AI專家出席,對多項前沿研究成果進行了深入探討與交流。騰訊AI Lab還宣布了2018三大核心戰略,以及同頂級研究與出版機構自然科研的

使用行為樹(Behavior Tree)實現遊戲AI

方便 不同 sequence 理解 and while 記錄 策略 積累 談到遊戲AI,很明顯智能體擁有的知識條目越多,便顯得更智能,但維護龐大數量的知識條目是個噩夢:使用有限狀態機(FSM),分層有限狀態機(HFSM),決策樹(Decision Tree)來實現遊戲AI總

人工智慧-強化學習02|HCNA-AI不得不瞭解的知識

強化學習(RL)的歷史 強化學習的早期歷史有兩條主線,這兩條主線冗長而又豐富,在歷史長廊中獨立成長,直至現代強化學習技術的興起,它們才開始交織在一起。其中一條主線源於學習理論的心理學部分,即試錯學習,這條主線貫穿了人工智慧一些早期的成果,並導致了20世紀80年代初強化學習的復興。 另一條主線則涉

強化學習鍊金術】李飛飛高徒範麟熙解析強化學習遊戲和現實中的應用

《強化學習鍊金術》Introduction第三講。 在這一課裡,Jim Fan會跟各位鍊金術師們聊一聊遊戲中的強化學習以及強化學習在現實生活中的應用。 一、遊戲與強化學習的淵源 遊戲是大家都喜歡的東西,而有一個群體尤甚:他們叫【程式設計師】。所以在人工智慧的發展歷

從零使用強化學習訓練AI玩兒遊戲(9)——使用DQN(Keras+CNN)

做了這麼。。。。。終於到達這一步了。 上一篇我們用簡單的全連線神經網路實現了DQN玩兒了一個簡單的遊戲,今天我們要用一個複雜的神經網路來玩兒一個複雜的遊戲,SpaceInvaders-v0,就玩這個遊戲吧,看起來很棒的樣子,隨便選的。 在這個遊戲中observacti

從零使用強化學習訓練AI玩兒遊戲(7)——使用DQN(TensorFlow)

      上一篇我們使用了DQN來玩簡單的走迷宮遊戲,但是DQN能勝任比走迷宮遊戲更復雜的遊戲。這一篇我們就從GYM中選一款遊戲來通過訓練神經網路,讓他自己玩。        我們選擇CartPole這款遊戲,在之前的Q-learning中我們有用過這款遊戲,在Q-lea

深度強化學習入門:用TensorFlow構建你的第一個遊戲AI

本文通過一種簡單的 Catch 遊戲介紹了深度強化學習的基本原理,並給出了完整的以 Keras 為前端的 TensorFlow 程式碼實現,是入門深度強化學習的不錯選擇。 去年,DeepMind 的 AlphaGo 以 4-1 的比分打敗了世界圍棋冠軍李世乭。超過 2 億的觀眾就這樣看著強化學習(r

從零使用強化學習訓練AI玩兒遊戲(2)——學習Gym

        本文目前主要是寫給自己的一個筆記,接下來這段時間會逐步記錄我是怎麼通過學習使用TensorFlow+Keras訓練神經網路自己玩兒遊戲,如果能間接幫助到他人就最好不過了,不喜勿噴。上一篇

學習筆記TF037:實現強化學習策略網絡

屬於 控制 返回 獎勵 渲染 動作 ren 虛擬 初始 強化學習(Reinforcement Learing),機器學習重要分支,解決連續決策問題。強化學習問題三概念,環境狀態(Environment State)、行動(Action)、獎勵(Reward),目標獲得最多累

[深度學習]實現一個博弈型的AI,從五子棋開始(1)

com class svm 顏色 display 深度 images += have 好久沒有寫過博客了,多久,大概8年???最近重新把寫作這事兒撿起來……最近在折騰AI,寫個AI相關的給團隊的小夥伴們看吧。 搞了這麽多年的機器學習,從分

強化學習 車杆遊戲

網上搜尋到的程式碼,親測比較好用,分享如下。 import gym import time env = gym.make('CartPole-v0') # 獲得遊戲環境 observation = env.reset() # 復位遊戲環境,新一局遊戲開始 print ('新一局遊戲 初始觀測 = {

用50行Python程式碼從零開始實現一個AI平衡小遊戲

集智導讀: 本文會為大家展示機器學習專家 Mike Shi 如何用 50 行 Python 程式碼建立一個 AI,使用增強學習技術,玩耍一個保持杆子平衡的小遊戲。所用環境為標準的 OpenAI Gym,只使用 Numpy 來建立 agent。 學習Python中有不明白推薦加入交流群號

centos7搭建Cuda9.0 & Cudnn7.0.5 &Tensorflow1.6深度學習環境

一、安裝centso7 將游標移動到Install Centos7後,按e編輯,出現啟動命令引數,修改第二行 vmlinuz linux dd quiet ctrl + x 儲存執行,檢視包含centos7的u盤碟符 成功後重啟電腦,

探祕多智慧體強化學習-MADDPG演算法原理及簡單實現

之前接觸的強化學習演算法都是單個智慧體的強化學習演算法,但是也有很多重要的應用場景牽涉到多個智慧體之間的互動,比如說,多個機器人的控制,語言的交流,多玩家的遊戲等等。本文,就帶你簡單瞭解一下Open-AI的MADDPG(Multi-Agent Deep Determinist

強化學習】python 實現 q-learning 例二

問題情境 一個2*2的迷宮,一個入口,一個出口,還有一個陷阱。如圖  這是一個二維的問題,不過我們可以把這個降維,變為一維的問題。 0.相關引數 epsilon = 0.9 # 貪婪度 greedy alpha = 0.1 # 學習率 gamma = 0.8 #

強化學習】python 實現 q-learning 例三

本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10139738.html 例一的程式碼是函式式編寫的,這裡用面向物件的方式重新擼了一遍。好處是,更便於理解環境(Env)、個體(Agent)之間的關係。 有緣看到的朋友,自己慢慢體會吧。 0.效果

強化學習】python 實現 q-learning 例四(例二改寫)

陷阱 data img 入口 turn pda state save isod 將例二改寫成面向對象模式,並加了環境! 不過更新環境的過程中,用到了清屏命令,play()的時候,會有點問題。learn()的時候可以勉強看到:P 0.效果圖 1.完整代碼 相對於例一,

強化學習】python 實現 q-learning 迷宮通用模板

本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10145797.html  0.說明 這裡提供了二維迷宮問題的一個比較通用的模板,拿到後需要修改的地方非常少。 對於任意的二維迷宮的 class Agent,只需修改三個地方:MAZE_

強化學習】python 實現 saras lambda 例一

本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10147265.html 將例一用saras lambda演算法重新擼了一遍,沒有參照任何其他人的程式碼。僅僅根據虛擬碼,就擼出來了。感覺已真正理解了saras lambda演算法。記錄如下 0.