關(guān)于gym包升級到0.26.2版本后煉丹爐測試代碼的修改
前兩天電腦有問題,重裝了系統(tǒng)。就有了關(guān)于安裝了更新后的軟件包跑環(huán)境測試代碼遇到的問題。
本文包版本分別為——gym version:0.26.2,pygame version:2.1.2
注意:
很多同學(xué)說老測試代碼跑不出來的,是因為gym升級了!gym庫0.26.0及之后的版本和之前版本的代碼是不兼容的!建議要么用命令:pip install gym==0.25.2
安裝老版本gym(這里的0.25.0版本只是舉個例子,當(dāng)然也可以用其他老版本),要么嘗試一下下文中的代碼。
A.測試代碼1
由于十月份電腦有些問題重裝了一邊系統(tǒng),因此又開始搭環(huán)境跑測試代碼,果不其然,各種問題出來了。把pycharm、anaconda裝好后,rl環(huán)境創(chuàng)建好后,并在rl環(huán)境中成功安裝好gym、pygame、pytorch包以為能成功進入煉丹爐,就拿了之前的測試代碼1跑了一下:
import gym
env = gym.make('MountainCar-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
env.close()
然鵝,出錯了:
細看是兩個錯誤提示:
提示1
WARN: You are calling render method without specifying any render mode. You can specify the render_mode at initialization, e.g. gym("MountainCar-v0", render_mode="rgb_array") gym.logger.warn(
大概意思是我們調(diào)用render method的時候沒有明確指定render mode,我們應(yīng)當(dāng)在初始化的時候就指出render_mode,例如gym(“MountainCar-v0”, render_mode=“rgb_array”)。
按照他的提示修改,在原代碼
env = gym.make('MountainCar-v0')
處修改為:
env = gym.make('MountainCar-v0', render_mode = "human")
再次運行發(fā)現(xiàn)小車上山的pygame界面一閃而過。以上關(guān)于render_mode的這個錯誤,我想可能是由于gym庫的版本更新以后,在定義環(huán)境時需要在環(huán)境名后具體指出render_mode=…,注意必須指出具體的render_mode(渲染模式),否則pygame的畫面直接就不顯示了,所以在用原來的測試代碼是跑不出pygame畫面的。
提示2
這個錯誤提示的意思是:
值錯誤:接收返回值不符(這個問題參考的這個鏈接)
我理解的意思就是說環(huán)境里給我們的接受值和我們設(shè)置接受變量的數(shù)量之間無法對應(yīng)起來(比如環(huán)境給你5個值,你卻只設(shè)置了4個或更少的變量去接受,這肯定是不對的)。現(xiàn)在我們來查看env.step(action)到底給了我們幾個value。利用下列代碼來查看:
print(len(env.step(action)))
運行后可以看到“運行”里打印出了5,也就是說給了5個值需要用五個容器(變量)來接收。
其實關(guān)于這5個返回值,gym在Gym Documentation的首頁就已經(jīng)給出了(我用鼠標(biāo)選中的那行代碼):
即:
observation, reward, terminated, truncated, info = env.step(action)
observation
、reward
、terminated
、truncated
、info
就是env.step()返回給我們的5個值。
我們在實驗中具體看一下這5個值具體長什么樣子(注意下面我用的是MountainCar-v0環(huán)境):
可以看到最后一行的輸出:
(array([-0.57811695, -0.00059736], dtype=float32), -1.0, False, False, {})
其中:
-
(array([-0.57811695, -0.00059736], dtype=float32)
是智能體觀測到的環(huán)境狀態(tài)observation
; -
-1.0
是智能體執(zhí)行動作后獲得的獎勵reward
; - 第一個
False
為terminated
表示當(dāng)前狀態(tài)是否為終止?fàn)顟B(tài)(terminal state),即智能體是否已完成任務(wù)或失敗退出; - 第二個
False
為truncated
表示當(dāng)前交互是否被截斷(truncated),即智能體是否在一個時間步內(nèi)完成了任務(wù),或者達到了最大交互步數(shù)而被中斷; -
{}
是個空字典表示額外信息info
。
如果你只需要其中的一部分變量,你可以使用下劃線 _
來代替不需要的變量名,例如可以把原代碼:
observation, reward, done, info = env.step(action)
改為:
observation, reward, _ , done, info = env.step(action)
運行效果:
附上修改后的測試代碼1
import gym
env = gym.make('MountainCar-v0', render_mode = 'human')
for i_episode in range(10):
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
env.close()
關(guān)于render_mode,我在core.py文件中看到有如下說明:
B.測試代碼2
跑的另一個測試代碼2也是有2個提示。
原測試代碼2如下:
import gym
env = gym.make('CartPole-v0')
for episode in range(10):
env.reset()
print("Episode finished after {} timesteps".format(episode))
for _ in range(100):
env.render()
env.step(env.action_space.sample())
env.close()
結(jié)果有print的結(jié)果,沒出現(xiàn)pygame的界面,按照提示作出修改:
提示1
他說You are calling render method without specifying any render mode. You can specify the render_mode at initialization, e.g. gym("MountainCar-v0", render_mode="rgb_array")
大概意思是我們調(diào)用render method的時候沒有明確指定render mode,我們應(yīng)當(dāng)在初始化的時候就指出render_mode,例如gym("MountainCar-v0", render_mode="rgb_array")
。
按照他的提示修改,在原代碼
env = gym.make('CartPole-v0')
處修改為:
env = gym.make('CartPole-v0', render_mode = "human")
現(xiàn)在運行程序,就可以看到車桿平衡的pygame界面了。
提示2
然而,還有一個問題:
大概意思是說,即使terminated = 1了我依然還在調(diào)用step函數(shù),terminated = 1的時候應(yīng)該接著的是reset函數(shù)。我理解的意思是當(dāng)我們完成一個episode(序列/情節(jié)/軌跡)后,環(huán)境會告訴我們訓(xùn)練應(yīng)當(dāng)終止了就會返回給我們terminated = 1這個信號,并且希望我們通過reset函數(shù)重置智能體的狀態(tài),讓他繼續(xù)探尋下一個episode。但是這里有個疑問:這條警告有時出現(xiàn)有時不出現(xiàn),目前原因不明。比如我加了一句代碼:
print("1 step")
就沒有這樣的警告:
有的時候去掉也沒有,有時又會出現(xiàn)??傊\行效果如下圖:文章來源:http://www.zghlxwxcb.cn/news/detail-468226.html
附上修改后的測試代碼2文章來源地址http://www.zghlxwxcb.cn/news/detail-468226.html
import gym
env = gym.make('CartPole-v1', render_mode = "human")
for episode in range(10):
env.reset()
print("Episode finished after {} timesteps".format(episode))
for _ in range(100):
env.render()
env.step(env.action_space.sample())
env.close()
到了這里,關(guān)于gym包更新升級到0.26.2版本后煉丹爐的測試代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!