強化学習ソニック(下準備編)
タイトルの通りSonic The Hedge Hogを強化学習するための下準備です.
環境
Windows10: バージョン21H1(OSビルド 19043. 1052)
Python 3.8 (anaconda環境)
Pytorch 1.8.1
numpy 1.19.4
gym-retro 0.8.0
gym 0.17.3
準備
gym-retroをインストールします.以下コマンドでインストール
pip install gym-retro
Romがあれば実行環境をチェックします.
import retro
retro.data.list_games()
'''
1942-Nes['1Player.Level1']
1943-Nes['Level1']
3NinjasKickBack-Genesis['1Player.Colt.Level1']
8Eyes-Nes['1Player.Arabia.Level1']
~省略~
SonicAndKnuckles-Genesis['Level1']
SonicAndKnuckles3-Genesis['AngelIslandZone.Act1', 'AngelIslandZone.Act2',
'CarnivalNightZone.Act1', 'CarnivalNightZone.Act2', 'DeathEggZone.Act1',
'DeathEggZone.Act2', 'FlyingBatteryZone.Act1', 'FlyingBatteryZone.Act2',
'HiddenPalaceZone', 'HydrocityZone.Act1', 'HydrocityZone.Act2',
'IcecapZone.Act1', 'IcecapZone.Act2','LaunchBaseZone.Act1',
'LaunchBaseZone.Act2', 'LavaReefZone.Act1',
'LavaReefZone.Act2', 'MarbleGardenZone.Act1',
'MarbleGardenZone.Act2', 'MushroomHillZone.Act1',
'MushroomHillZone.Act2', 'SandopolisZone.Act1', 'SandopolisZone.Act2']
SonicBlast-Sms['Level1']
SonicBlastMan-Snes['Level1']
SonicBlastManII-Snes['1Player.SonicBlastMan.Level1']
SonicTheHedgehog-Genesis['GreenHillZone.Act1',
'GreenHillZone.Act2', 'GreenHillZone.Act3',
'LabyrinthZone.Act1', 'LabyrinthZone.Act2',
'LabyrinthZone.Act3', 'MarbleZone.Act1',
'MarbleZone.Act2', 'MarbleZone.Act3',
'ScrapBrainZone.Act1', 'ScrapBrainZone.Act2', 'SpringYardZone.Act1',
'SpringYardZone.Act2', 'SpringYardZone.Act3',
'StarLightZone.Act1', 'StarLightZone.Act2', 'StarLightZone.Act3']
SonicTheHedgehog-Sms['Level1']
SonicTheHedgehog2-Genesis['AquaticRuinZone.Act1',
'AquaticRuinZone.Act2', 'CasinoNightZone.Act1',
'CasinoNightZone.Act2', 'ChemicalPlantZone.Act1',
'ChemicalPlantZone.Act2', 'EmeraldHillZone.Act1', 'EmeraldHillZone.Act2',
'HillTopZone.Act1', 'HillTopZone.Act2',
'MetropolisZone.Act1', 'MetropolisZone.Act2', 'MetropolisZone.Act3',
'MysticCaveZone.Act1', 'MysticCaveZone.Act2', 'OilOceanZone.Act1',
'OilOceanZone.Act2', 'WingFortressZone']
SonicTheHedgehog2-Sms['Level1']
SonicTheHedgehog3-Genesis['Level1']
SonicTheHedgehogRandomLevels-Genesis['Start']
SonicWings-Snes['1Player.America.Keaton']
'''
見た感じ989個のゲームがRomさえあれば,メモリの解析などをせずとも実行可能な状況にあるみたいです.ここにないゲームでも,ゲームボーイ系統のゲームなども実行できるみたい.(要メモリ解析)
今回はSonic The Hedge Hog Genesisを使用します.その後,Steamでゲームを購入.
ターミナルで以下のコマンドを実行してゲームをインポートしておきます.
python -m retro.import.sega_classics
Steam Username: 各自のsteamアカウントのユーザネーム
Steam Password (leave blank if cached):
Steam Guard code: steamガードを使用している人のみ
Downloading games...
Installing games...
Importing SonicTheHedgehog-Genesis
Imported 1 games
これでインポートすることが出来ました.
今回はA2Cの勉強を目的としているため複数環境を作成できるようにします.
これをするには,Wrapperが必要になります.ラップしないで複数作成しようとすると以下のようにエラーがでます.
import gym
import retro
ENV = "SonicTheHedgehog-Genesis"
MAP = "GreenHillZone.Act1"
env1 =retro.make(ENV,MAP)
env2 = retro.make(ENV,MAP)
env3 = retro.make(ENV,MAP)
env4 = retro.make(ENV,MAP)
'''
RuntimeError: Cannot create multiple emulator instances per
process, make sure to call env.close() on each
environment before creating a new one
'''
そこでbaselinesを使用します.ここにかいてあるようにpipを使用してインストールするか,gitのcloneを使用して直接使用します.今回はpytorchでスクラッチ開発するためcloneをして使用します.その後以下のように実行環境のテストをしました
#%%
import retro
import numpy as np
import torch
from baselines.common.vec_env.subproc_vec_env import SubprocVecEnv
#%%
if __name__ == "__main__":
ENV = "SonicTheHedgehog-Genesis"
MAP = "GreenHillZone.Act1"
def make_env(env_id,rank,seed=0):
def _thunk():
env = retro.make(ENV,MAP)
env.seed(seed + rank)
return env
return _thunk
seed_num = torch.set_num_threads(4)
envs = [make_env(seed_num,i) for i in range(4)]
envs = SubprocVecEnv(envs)
envs.reset()
while(1):
envs.render()
action = np.random.randint(0,envs.action_space.n-1,size=(4,1))
envs.step(action)
実行結果
おわり
これretroでインポートしたあとにsteamでゲーム返品したらどうなるんだろう…
参考
つくりながら学ぶ! 深層強化学習 PyTorchによる実践プログラミング 小川/雄太郎
コメント入力