Win10環境下使用WSL安裝OpenAI/gym +TensorFlow用強化學習DQN打磚塊(Breakout Game)
實現目標
我們的目標是在Windows 10系統上具體實現DeepMind論文中強化學習演算法Q-learning Network(DQN)的訓練過程。
隨著每次訓練,強化學習演算法將拿到越來越高的分,具體強化學習與DQN的前置知識可以參考這裡
注意:子系統無法安裝CUDA,所以只能使用CPU版的TensorFlow,具體可以參考下圖
執行環境
Win 10 + Ubuntu 16.04 + Python 3.5.2 + pip 9
具體流程
1 安裝WSL(Windows Subsystem for Linux)
適用於win10 build 16215以及之後的版本,之前的版本可參考
管理員許可權執行powershell並執行下面的命令(在搜尋欄搜尋powershell,右鍵管理員開啟):
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
或者:控制面板->程式和功能->啟用或關閉Windows功能->勾選 適用於Linux的Windows子系統
- 根據提示重啟電腦
- 開啟應用商城搜尋Ubuntu(或者其他Linux系統)
- 進入到Ubuntu命令列視窗,等待初始化之後新建使用者並設定密碼,完成之後:
需要修改字型及個性化設定可以參考資料1。
2 配置Ubuntu執行環境
Ubuntu子系統安裝好了之後,在命令列輸入以下命令,更新apt和安裝build-essential
sudo apt-get update
sudo apt-get install build-essential
以及安裝python3的pip3 (python3已經自帶了,不用安裝)
sudo apt-get install python3-pip
接下來安裝以下OpenAI/gym的依賴,如果安裝失敗可以試著一個一個安裝
sudo apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig
3 安裝Python Library
安裝好以上依賴之後,該使用pip3安裝TensorFlow(cpu)和gym了
安裝TensorFlow
sudo pip3 install tensorflow
若無法訪問或者安裝失敗可以手動把tensorflow的tensorflow-1.2.1-cp35-cp35m-linux_x86_64安裝包下載下來到自己的~目錄並安裝
sudo pip3 install –upgrade /home/wj/tensorflow-1.2.1-cp35-cp35m-linux_x86_64
安裝gym
sudo pip3 install gym
sudo pip3 install gym[atari]安裝openCV
sudo pip3 install opencv-python
4 安裝vcXsrv
下載地址
安裝之後重啟電腦並開啟vcXsrv
在ubuntu命令列中輸入export DISPLAY=:0
,將輸出匯出到vcXsrv
5 啟動專案
以上步驟都完成之後,將以下程式碼mian.py 儲存到專案資料夾中,在Ubuntu命令列中進入到專案資料夾。
注:cd /mnt/
mnt資料夾下就是Win下各個硬碟了
main.py
import sys
import cv2 # OPENCV2
import cv2 as cv
import gym
import tensorflow as tf
import numpy as np
import random
from collections import deque
CNN_INPUT_WIDTH = 80
CNN_INPUT_HEIGHT = 80
CNN_INPUT_DEPTH = 1
SERIES_LENGTH = 4
REWARD_COFF = 3.0
INITIAL_EPSILON = 1.0
FINAL_EPSILON = 0.0001
REPLAY_SIZE = 50000
BATCH_SIZE = 32
GAMMA = 0.99
OBSERVE_TIME = 500
ENV_NAME = 'Breakout-v4'
EPISODE = 100000
STEP = 1500
TEST = 10
class ImageProcess():
def ColorMat2B(self, state): # this is the function used for the game flappy bird
height = 80
width = 80
state_gray = cv2.cvtColor( cv2.resize( state, ( height, width ) ) , cv2.COLOR_BGR2GRAY )
_,state_binary = cv2.threshold( state_gray, 5, 255, cv2.THRESH_BINARY )
state_binarySmall = cv2.resize( state_binary, ( width, height ))
cnn_inputImage = state_binarySmall.reshape( ( height, width ) )
return cnn_inputImage
def ColorMat2Binary(self, state):
# state_output = tf.image.rgb_to_grayscale(state_input)
# state_output = tf.image.crop_to_bounding_box(state_output, 34, 0, 160, 160)
# state_output = tf.image.resize_images(state_output, 80, 80, method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
# state_output = tf.squeeze(state_output)
# return state_output
height = state.shape[0]
width = state.shape[1]
nchannel = state.shape[2]
sHeight = int(height * 0.5)
sWidth = CNN_INPUT_WIDTH
state_gray = cv2.cvtColor(state, cv2.COLOR_BGR2GRAY)
# print state_gray.shape
# cv2.imshow('test2', state_gray)
# cv2.waitKey(0)
_, state_binary = cv2.threshold(state_gray, 5, 255, cv2.THRESH_BINARY)
state_binarySmall = cv2.resize(state_binary, (sWidth, sHeight), interpolation=cv2.INTER_AREA)
cnn_inputImg = state_binarySmall[25:, :]
# rstArray = state_graySmall.reshape(sWidth * sHeight)
cnn_inputImg = cnn_inputImg.reshape((CNN_INPUT_WIDTH, CNN_INPUT_HEIGHT))
# print cnn_inputImg.shape
return cnn_inputImg
def ShowImageFromNdarray(self, state, p):
imgs = np.ndarray(shape=(4, 80, 80))
for i in range(0, 80):
for j in range(0, 80):
for k in range(0, 4):
imgs[k][i][j] = state[i][j][k]
cv2.imshow(str(p + 1), imgs[0])
cv2.imshow(str(p + 2), imgs[1])
cv2.imshow(str(p + 3), imgs[2])
cv2.imshow(str(p + 4), imgs[3])
class DQN():
def __init__(self, env):
self.imageProcess = ImageProcess()
self.epsilon = INITIAL_EPSILON
self.replay_buffer = deque()
self.recent_history_queue = deque()
self.action_dim = env.action_space.n
self.state_dim = CNN_INPUT_HEIGHT * CNN_INPUT_WIDTH
self.time_step = 0
self.session = tf.InteractiveSession()
self.create_network()
# self.create_training_method()
self.observe_time = 0
self.merged = tf.summary.merge_all()
self.summary_writer = tf.summary.FileWriter('/path/to/logs', self.session.graph)
self.session.run(tf.initialize_all_variables())
def create_network(self):
INPUT_DEPTH = SERIES_LENGTH
self.input_layer = tf.placeholder(tf.float32, [None, CNN_INPUT_WIDTH, CNN_INPUT_HEIGHT, INPUT_DEPTH],
name='status-input')
self.action_input = tf.placeholder(tf.float32, [None, self.action_dim])
self.y_input = tf.placeholder(tf.float32, [None])
W1 = self.get_weights([8, 8, 4, 32])
b1 = self.get_bias([32])
h_conv1 = tf.nn.relu(tf.nn.conv2d(self.input_layer, W1, strides=[1, 4, 4, 1], padding='SAME') + b1)
conv1 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
W2 = self.get_weights([4, 4, 32, 64])
b2 = self.get_bias([64])
h_conv2 = tf.nn.relu(tf.nn.conv2d(conv1, W2, strides=[1, 2, 2, 1], padding='SAME') + b2)
# conv2 = tf.nn.max_pool( h_conv2, ksize = [ 1, 2, 2, 1 ], strides= [ 1, 2, 2, 1 ], padding= 'SAME' )
W3 = self.get_weights([3, 3, 64, 64])
b3 = self.get_bias([64])
h_conv3 = tf.nn.relu(tf.nn.conv2d(h_conv2, W3, strides=[1, 1, 1, 1], padding='SAME') + b3)
# conv3 = tf.nn.max_pool( h_conv3, ksize= [ 1,2,2,1], strides=[ 1,2,2,1 ],padding= 'SAME' )
W_fc1 = self.get_weights([1600, 512])
b_fc1 = self.get_bias([512])
# h_conv2_flat = tf.reshape( h_conv2, [ -1, 11 * 11 * 32 ] )
conv3_flat = tf.reshape(h_conv3, [-1, 1600])
h_fc1 = tf.nn.relu(tf.matmul(conv3_flat, W_fc1) + b_fc1)
W_fc2 = self.get_weights([512, self.action_dim])
b_fc2 = self.get_bias([self.action_dim])
self.Q_value = tf.matmul(h_fc1, W_fc2) + b_fc2
Q_action = tf.reduce_sum(tf.multiply(self.Q_value, self.action_input), reduction_indices=1)
self.cost = tf.reduce_mean(tf.square(self.y_input - Q_action))
self.optimizer = tf.train.AdamOptimizer(1e-6).minimize(self.cost)
# def create_training_method(self):
#
# # if len(self.recent_history_queue) > 4:
# # sess = tf.Session()
# # print sess.run(self.Q_value)
# # global_step = tf.Variable(0, name='global_step', trainable=True)
# # self.optimizer = tf.train.AdamOptimizer( 0.001 ).minimize( self.cost )
def train_network(self):
self.time_step += 1
minibatch = random.sample(self.replay_buffer, BATCH_SIZE)
state_batch = [data[0] for data in minibatch]
action_batch = [data[1] for data in minibatch]
reward_batch = [data[2] for data in minibatch]
next_state_batch = [data[3] for data in minibatch]
done_batch = [data[4] for data in minibatch]
# self.imageProcess.ShowImageFromNdarray( state_batch[0], 1 )
y_batch = []
Q_value_batch = self.Q_value.eval(feed_dict={self.input_layer: next_state_batch})
# print Q_value_batch
# print self.time_step
# cv2.waitKey(0)
# print Q_value_batch.shape
for i in range(BATCH_SIZE):
if done_batch[i]:
y_batch.append(reward_batch[i])
else:
y_batch.append(reward_batch[i] + GAMMA * np.max(Q_value_batch[i]))
self.optimizer.run(feed_dict={
self.input_layer: state_batch,
self.action_input: action_batch,
self.y_input: y_batch
})
def percieve(self, state_shadow, action_index, reward, state_shadow_next, done, episode):
action = np.zeros( self.action_dim )
action[ action_index ] = 1
self.replay_buffer.append([state_shadow, action, reward, state_shadow_next, done])
self.observe_time += 1
if self.observe_time % 1000 and self.observe_time <= OBSERVE_TIME == 0:
print(self.observe_time)
if len(self.replay_buffer) > REPLAY_SIZE:
self.replay_buffer.popleft()
if len(self.replay_buffer) > BATCH_SIZE and self.observe_time > OBSERVE_TIME:
self.train_network()
def get_greedy_action(self, state_shadow):
rst = self.Q_value.eval(feed_dict={self.input_layer: [state_shadow]})[0]
# print rst
print(np.max( rst ))
return np.argmax(rst)
def get_action(self, state_shadow):
if self.epsilon >= FINAL_EPSILON and self.observe_time > OBSERVE_TIME:
self.epsilon -= (INITIAL_EPSILON - FINAL_EPSILON) / 10000
action = np.zeros(self.action_dim)
action_index = None
if random.random() < self.epsilon:
action_index = random.randint(0, self.action_dim - 1)
else:
action_index = self.get_greedy_action(state_shadow)
return action_index
def get_weights(self, shape):
weight = tf.truncated_normal(shape, stddev=0.01)
return tf.Variable(weight)
def get_bias(self, shape):
bias = tf.constant(0.01, shape=shape)
return tf.Variable(bias)
def main():
env = gym.make(ENV_NAME)
state_shadow = None
next_state_shadow = None
agent = DQN(env)
total_reward_decade = 0
# game_state = game.GameState()
for episode in range(EPISODE):
total_reward = 0
state = env.reset()
state = agent.imageProcess.ColorMat2Binary(state) # now state is a binary image of 80 * 80
state_shadow = np.stack((state, state, state, state), axis=2)
for step in range(STEP):
env.render()
action = agent.get_action(state_shadow)
next_state, reward, done, _ = env.step(action)
next_state = np.reshape( agent.imageProcess.ColorMat2Binary( next_state ), ( 80,80,1 ) )
# print next_state.shape
# print state_shadow.shape
next_state_shadow = np.append( next_state, state_shadow[ :,:,:3 ], axis= 2 )
total_reward += reward
agent.percieve(state_shadow, action, reward, next_state_shadow, done, episode)
state_shadow = next_state_shadow
if done:
break
print('Episode:', episode, 'Total Point this Episode is:', total_reward)
total_reward_decade += total_reward
if episode % 10 == 0:
print('-------------')
print('Decade:', episode / 10, 'Total Reward in this Decade is:', total_reward_decade)
print('-------------')
total_reward_decade = 0
if __name__ == '__main__':
main()
執行以上程式碼(sudo python3 main.py
)
參考資料
相關推薦
Win10環境下使用WSL安裝OpenAI/gym +TensorFlow用強化學習DQN打磚塊(Breakout Game)
實現目標 我們的目標是在Windows 10系統上具體實現DeepMind論文中強化學習演算法Q-learning Network(DQN)的訓練過程。 隨著每次訓練,強化學習演算法將拿到越來越高的分,具體強化學習與DQN的前置知識可以參考這裡 注意:
【初學必備】Win10環境下Anaconda安裝
create 虛擬環境 自定義 pts 本地 輸入a uninstall 導出 內容 Anaconda集合了python,Spyder,Jupyter notebook及conda-----包管理器與環境管理器(含常用的panda,numpy等),省去單獨下載的繁瑣步驟,方
win10環境下Python安裝skimage模組
個人Python環境為Anaconda自帶python3.6,使用Anaconda Prompt安裝時出錯,效果如下,不能安裝skimage庫: 因此,安裝skimage模組需要另一種方式。 1.下載安裝包 在https://www.lfd.uci.edu/~gohlke/pyth
Redis的初識以及win10環境下的安裝
目錄 Redis介紹 Redis的優點 Redis 與其它key-value儲存有什麼不同 Redis 的八大特性 Redis 在window下安裝 Redis 的配置 Redis 配置檔案引數說明 參考資料 Redis介紹 &
一路波折----記我的win10環境下scala安裝之路,解決命令視窗報錯問題
最近看到了scala這門語言,頓時就喜歡上了,所以想拿來學一下,spark這個當下最炙手可熱的高效能分散式計算平臺就是scala編寫的,足可見scala的強大,正如最開始學習java一樣,所有的開始都是從配環境、修改環境變數開始的,scala也不例外。 首先
Tensorflow安裝教程-Win10環境下
develop pip 修改 win10 最新 scripts dnn 進入 rip 背景:最新版的Tensoflow已經支持Python3.6 首先,下載並安裝Anaconda3 內置Python3.6的版本 https://www.continuum.io/downl
win10環境下安裝tensorflow
2.7 發現 orf tensor cpu conda flow easy install 第一次接觸tensorflow,網上的安裝教程太多,找了好久終於成功裝上了。在這裏給大家分享一下win10下安裝過程tensorflow的cpu版本。 1.安裝python
在win10環境下安裝tensorflow,出現‘No module named 'tensorflow’
1.開啟anaconda prompt,並輸入conda create -n tensorflow python=3.5,新建一個虛擬環境,遇到y/n?輸入n; 2:輸入activate tensorflow開啟虛擬環境 3:獲取tensorflow檔案 4:安裝ten
win10環境下使用Anaconda3配置安裝TensorFlow-gpu-1.11(win10+Python3.6+vs2015+CUDA9.0+cuDNN7.1+anaconda3+Spyder)
前言 入坑AI,安裝TensorFlow學習深度學習,網上有很多安裝方法,在這裡僅記錄我的安裝方法以及在安裝過程中踩到的各種坑,以便在以後因故重新安裝時供自己回顧使用。(多圖長文) 安裝準備 軟體準備:
強化學習 平臺 openAI 的 gym 安裝 (Ubuntu環境下如何安裝Python的gym模組)
openAI 公司給出了一個整合較多環境的強化學習平臺 gym , 本篇部落格主要是講它怎麼安裝。 openAI公司的主頁: https://www.openai.com/systems/ 從主頁上我們可以看到openAI 公司其實給出了多個強化學習的平臺
tensorflow實踐 | win10環境下,用anacoda安裝tensorflow
這是一系列在閱讀TensorFlow實戰Google深度學習框架(第2版)的筆記及實踐 大多教程都是重新虛擬出一個環境,原有環境就可以支援為什麼還要重建一個新的環境,如果以後遇到坑了更新解釋。 在原有基礎上安裝tensorflow 用管
Win10環境下安裝TensorFlow-GPU1.11.0+cuda9.0+cudnn7.1.4
概要 TensorFlow這東西自打本科畢業設計開始就和它槓上了,很長的時間都是處於安裝解除安裝的死迴圈。經過反覆的試錯,找部落格,總算找到了一些竅門。現在分享給大家。雖然是經驗,但也只能當做參考。TensorFlow的GPU版本的安裝說實在的就是看機器,看運氣
win10下安裝OpenAI Gym
因為最近在上深度增強學習課,所以需要安裝一個執行環境。這裡面我安裝一個anaconda和pycharm。好像程式碼不能夠在spyder或者jupyter notebook執行。Anaconda在前面的部落格中已經安裝了anaconda,可以先建立一個環境,可以命名為gymco
win10環境下 舊版CPU anaconda安裝tensorflow遇到的問題彙總
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\zhaoshimin\AppData\Local\Programs\Python\Python36\lib\s
win10下安裝openai gym[atari]
命令列pip install --no-index -f https://github.com/Kojoley/atari-py/releases atari_py裝完後測試import gym env = gym.make('Pong-v0') for i_episode
win10環境下MinGW和MSYS的安裝與配置
gcc 針對 ref org 環境變量 blog tar window 顯示 最近在看《Python高級編程》這本書,裏面講到需要安裝MinGW和MSYS。因此,也了解到MinGW是針對Windows平臺開發的編譯器,可以實現gcc編譯器的各種功能。 1.首先,
win10環境下python版libsvm的安裝
href tools scale 比較 sel .lib dll log python使用 1.前言 由於畢業設計需要用到libsvm,所以最近專心於配置libsvm,曾經嘗試過在matlab中安裝,但是沒有成功。最終在Python環境中完成安裝。 2.LIBSVM介紹 L
WIN10環境下MAVEN的安裝與配置
前言 寫部落格的目的是為了記錄所學的知識,以後忘了也能快速找到,不用臨時去搜索。其中主要參考了這篇部落格:http://blog.csdn.net/jiuqiyuliang/article/details/45390313 一、準備工作 Java開發環境(我的jdk版本是
學習筆記24—win10環境下python版libsvm的安裝
1.前言 由於畢業設計需要用到libsvm,所以最近專心於配置libsvm,曾經嘗試過在matlab中安裝,但是沒有成功。最終在Python環境中完成安裝。 2.LIBSVM介紹 LIBSVM 是臺灣大學林智仁(Lin Chih-Jen)教授等開發設計的一個操作簡單、易於使用、快速有效的 S
Win10環境下Redis和Redis desktop manager 安裝
1.Redis的下載地址: https://github.com/MicrosoftArchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.msi 2.Redis Desktop Manager 下載地址: https://github