open AI gym を作動させたいです。
pythonで強化学習の練習のためにkerasとopenAIgymを使ってみたのですが、
openAI gymのenv.renderの部分にエラーが出てしまい、学習が止まってしまいます。
successfulyとあるので実行完了したのかもしれませんが、del baseの部分の何がエラーなのかわかりません。
棒立ての強化学習をして描画したいのですがうまくいきません。
実行環境はgoogli colaboratoryです。
以下のサイトのコードを丸写ししました。
【強化学習初心者向け】シンプルな実装例で学ぶQ学習、DQN、DDQN【CartPoleで棒立て:1ファイルで完結、Kearas使用】
発生している問題・エラーメッセージ
successfulyの前までは省略しています。また、successfuly の部分のEpisode数は実行するごとに変化します。
801 Episode finished after 200.000000 time steps / mean 192.780000 Episode 801 train agent successfuly! --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-9-2af324d64b02> in <module>() 69 for t in range(max_number_of_steps): #1試行のループ 70 if islearned == 1: #学習終了したらcartPoleを描画する ---> 71 env.render() 72 time.sleep(0.1) 73 print (observation[0]) #カートのx位置を出力 3 frames /usr/local/lib/python3.6/dist-packages/pyglet/gl/__init__.py in <module>() 225 else: 226 from .carbon import CarbonConfig as Config --> 227 del base 228 229 # XXX remove NameError: name 'base' is not defined
該当のソースコード
python
1# coding:utf-8 2# [0]ライブラリのインポート 3import gym #倒立振子(cartpole)の実行環境 4from gym import wrappers #gymの画像保存 5import numpy as np 6import time 7 8 9# [1]Q関数を離散化して定義する関数 ------------ 10# 観測した状態を離散値にデジタル変換する 11def bins(clip_min, clip_max, num): 12 return np.linspace(clip_min, clip_max, num + 1)[1:-1] 13 14# 各値を離散値に変換 15def digitize_state(observation): 16 cart_pos, cart_v, pole_angle, pole_v = observation 17 digitized = [ 18 np.digitize(cart_pos, bins=bins(-2.4, 2.4, num_dizitized)), 19 np.digitize(cart_v, bins=bins(-3.0, 3.0, num_dizitized)), 20 np.digitize(pole_angle, bins=bins(-0.5, 0.5, num_dizitized)), 21 np.digitize(pole_v, bins=bins(-2.0, 2.0, num_dizitized)) 22 ] 23 return sum([x * (num_dizitized**i) for i, x in enumerate(digitized)]) 24 25 26# [2]行動a(t)を求める関数 ------------------------------------- 27def get_action(next_state, episode): 28 #徐々に最適行動のみをとる、ε-greedy法 29 epsilon = 0.5 * (1 / (episode + 1)) 30 if epsilon <= np.random.uniform(0, 1): 31 next_action = np.argmax(q_table[next_state]) 32 else: 33 next_action = np.random.choice([0, 1]) 34 return next_action 35 36 37# [3]Qテーブルを更新する関数 ------------------------------------- 38def update_Qtable(q_table, state, action, reward, next_state): 39 gamma = 0.99 40 alpha = 0.5 41 next_Max_Q=max(q_table[next_state][0],q_table[next_state][1] ) 42 q_table[state, action] = (1 - alpha) * q_table[state, action] +\ 43 alpha * (reward + gamma * next_Max_Q) 44 45 return q_table 46 47# [4]. メイン関数開始 パラメータ設定-------------------------------------------------------- 48env = gym.make('CartPole-v0') 49max_number_of_steps = 200 #1試行のstep数 50num_consecutive_iterations = 100 #学習完了評価に使用する平均試行回数 51num_episodes = 2000 #総試行回数 52goal_average_reward = 195 #この報酬を超えると学習終了(中心への制御なし) 53# 状態を6分割^(4変数)にデジタル変換してQ関数(表)を作成 54num_dizitized = 6 #分割数 55q_table = np.random.uniform( 56 low=-1, high=1, size=(num_dizitized**4, env.action_space.n)) 57 58total_reward_vec = np.zeros(num_consecutive_iterations) #各試行の報酬を格納 59final_x = np.zeros((num_episodes, 1)) #学習後、各試行のt=200でのxの位置を格納 60islearned = 0 #学習が終わったフラグ 61isrender = 0 #描画フラグ 62 63 64# [5] メインルーチン-------------------------------------------------- 65for episode in range(num_episodes): #試行数分繰り返す 66 # 環境の初期化 67 observation = env.reset() 68 state = digitize_state(observation) 69 action = np.argmax(q_table[state]) 70 episode_reward = 0 71 72 for t in range(max_number_of_steps): #1試行のループ 73 if islearned == 1: #学習終了したらcartPoleを描画する 74 env.render() 75 time.sleep(0.1) 76 print (observation[0]) #カートのx位置を出力 77 78 # 行動a_tの実行により、s_{t+1}, r_{t}などを計算する 79 observation, reward, done, info = env.step(action) 80 81 # 報酬を設定し与える 82 if done: 83 if t < 195: 84 reward = -200 #こけたら罰則 85 else: 86 reward = 1 #立ったまま終了時は罰則はなし 87 else: 88 reward = 1 #各ステップで立ってたら報酬追加 89 90 episode_reward += reward #報酬を追加 91 92 # 離散状態s_{t+1}を求め、Q関数を更新する 93 next_state = digitize_state(observation) #t+1での観測状態を、離散値に変換 94 q_table = update_Qtable(q_table, state, action, reward, next_state) 95 96 # 次の行動a_{t+1}を求める 97 action = get_action(next_state, episode) # a_{t+1} 98 99 state = next_state 100 101 #終了時の処理 102 if done: 103 print('%d Episode finished after %f time steps / mean %f' % 104 (episode, t + 1, total_reward_vec.mean())) 105 total_reward_vec = np.hstack((total_reward_vec[1:], 106 episode_reward)) #報酬を記録 107 if islearned == 1: #学習終わってたら最終のx座標を格納 108 final_x[episode, 0] = observation[0] 109 break 110 111 if (total_reward_vec.mean() >= 112 goal_average_reward): # 直近の100エピソードが規定報酬以上であれば成功 113 print('Episode %d train agent successfuly!' % episode) 114 islearned = 1 115 #np.savetxt('learned_Q_table.csv',q_table, delimiter=",") #Qtableの保存する場合 116 if isrender == 0: 117 #env = wrappers.Monitor(env, './movie/cartpole-experiment-1') #動画保存する場合 118 isrender = 1 119 #10エピソードだけでどんな挙動になるのか見たかったら、以下のコメントを外す 120 # if episode>10: 121 # if isrender == 0: 122 # env = wrappers.Monitor(env, './movie/cartpole-experiment-1') #動画保存する場合 123 # isrender = 1 124 islearned=1; 125 126if islearned: 127 np.savetxt('final_x.csv', final_x, delimiter=",")
試したこと
env.render()を動かしてみたり、直接openAIgymのライブラリのサイトに行って最初のページを確認してみましたが、結局分からずじまいでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。