1. 程式人生 > >從零使用強化學習訓練AI玩兒遊戲(2)——學習Gym

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

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

上一篇把玩兒遊戲的遊戲給搞定了,接下來看看怎麼是怎麼通過程式碼來玩兒這個遊戲的


官網上的doc詳細介紹了step函式,如上圖所示:step函式返回四個值

  • observation (object): 一個環境特定的物件,代表你對環境的觀察。例如,來自相機的畫素資料、機器人的關節角度和關節速度,或者棋盤遊戲中的棋盤狀態。
  • reward (float): 由先前行為獲得的獎勵。大小範圍在不同的環境之間變化,但最終目標總是增加你的總獎勵。
  • done (boolean): 是否該重置環境了。大多數(但不是全部)任務被劃分為明確定義的情節,並且done 是True表明該事件已經終止。(比如,杆子傾斜太遠,或者你失去了你的最後生命。)
  • info (dict): 用於除錯的診斷資訊。它有時可以用於學習(例如,它可能包含在環境的最後狀態改變背後的原始概率)。然而,官方評估你的演算法時不允許使用這個來學習。

這只是一個經典的“代理環境迴圈”的實現。每個時間步長,代理選擇一個動作,並且環境返回觀察和獎勵。


# -*- coding: UTF-8 -*-
if __name__ == '__main__':
print('開始學習')
import 
gym env = gym.make('CartPole-v0') for i_episode in range(20): observation = env.reset() for t in range(100): env.render() print(observation) action = env.action_space.sample() observation, reward, done, info = env.step(action) if done: print("Episode finished after {} timesteps".format(t + 1)) break

Spaces

動作是由兩個從環境返回的變量表示的action_space 和observation_space他們都是space型的資料他們的資料型別是
import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)    //這個action可以看出來是兩個一左一右,因為CartPole-v0這個遊戲只需要左右
print(env.observation_space)
#> Box(4,)

observation_space大小是:

print(env.observation_space.high)
#> array([ 2.4       ,         inf,  0.20943951,         inf])
print(env.observation_space.low)
#> array([-2.4       ,        -inf, -0.20943951,        -inf])

現在總結一下也就是說從step返回的observation 是一個我們需要傳入神經網路的觀測值他有可能是來自相機的畫素資料、機器人的關節角度和關節速度,或者棋盤遊戲中的棋盤狀態。

reward 是你這個action 過後的獎勵就跟error是一樣的,只不過error是越小越好獎勵是越大越好。

然後action 就是你需要傳入step的值,也就是你通過神經網路計算過後得到的動作。

不同的遊戲他的observation 和action 是不同的,具體的可以通過這個網址來檢視

比如說CartPole-v0這個遊戲action就是0,1代表左右observation 是[-0.02842006 -0.34569273  0.04810185  0.57496187] 一個一維陣列。

這個遊戲輸入的就是Atari這個機器的RAM,action是從{2,3,4}中選擇的。

接下來就可以搭建神經網路開始玩兒了。