diff --git a/.gitignore b/.gitignore index 05cdfa4..52ac8d0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ archives/ images/ -data/ main/logs/monitoring/ recordings/ @@ -16,6 +15,14 @@ main/recordings/ main/record.py main/update_model.py +# Game Data +/data/ +!/data/Champion.Level12.RyuVsBison.state +!/data/data.json +!/data/metadata.json +!/data/scenario.json + + # Model Files /main/trained_models/* !/main/trained_models/ppo_ryu_2000000_steps_updated.* diff --git a/README.md b/README.md index 1431a76..713a1f4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SFighterAI 街头霸王游戏智能代理 -本项目基于深度强化学习训练了一个用于通关《街头霸王·二:冠军特别版》(Street Fighter II Special Champion Edition)关底 BOSS 的智能 AI 代理。该智能代理完全基于游戏画面(RGB 像素值)进行决策,在该项目给定存档中最后一关的第一轮对局可以取得 100% 胜率(实际上出现了“过拟合”现象,详见[结果]部分的讨论)。 +本项目基于深度强化学习训练了一个用于通关《街头霸王·二:冠军特别版》(Street Fighter II Special Champion Edition)关底 BOSS 的智能 AI 代理。该智能代理完全基于游戏画面(RGB 像素值)进行决策,在该项目给定存档中最后一关的第一轮对局可以取得 100% 胜率(实际上出现了“过拟合”现象,详见[运行测试]部分的讨论)。 ### 文件结构 @@ -56,4 +56,18 @@ cd [项目上级文件夹]/street-fighter-ai/main python test.py ``` -模型权重文件存储在 `main/trained_models/` 文件夹下。 +模型权重文件存储在 `main/trained_models/` 文件夹下。其中 `ppo_ryu_2500000_steps_updated.zip` 是 `test.py` 默认使用的模型文件,该模型泛化性较好,有能力打通《街头霸王·二:冠军特别版》的最后一关。如果想要观看其他模型的表现,可以将 `test.py` 中的 `model_path` 变量修改为其他模型文件的路径。关于各训练阶段模型实际表现的观察描述如下: + +* ppo_ryu_2000000_steps_updated: 刚开始出现过拟合现象,具有泛化能力但实力不太强。 +* ppo_ryu_2500000_steps_updated: 接近最终过拟合状态,无法在最后一关第一轮中完全占据主导地位,但具有一定泛化能力。在最后一关三轮中有较高的获胜机会。 +* ppo_ryu_3000000_steps_updated: 接近最终过拟合状态,几乎可以在最后一关第一轮中占据主导地位,胜率接近 100%,但泛化能力较弱。 +* ppo_ryu_7000000_steps_updated: 过拟合,在最后一关第一轮中完全占据主导地位,胜率 100%,但泛化能力差。 + +### 训练模型 + +如果想要训练自己的模型,可以在 `main/` 文件夹下运行 `train.py`。 + +```bash +cd [项目上级文件夹]/street-fighter-ai/main +python train.py +``` diff --git a/main/train.py b/main/train.py index 2b92acb..3bf5d1a 100644 --- a/main/train.py +++ b/main/train.py @@ -36,9 +36,10 @@ def make_env(game, state, seed=0): ) env = StreetFighterCustomWrapper(env) # Create log directory - env_log_dir = os.path.join(LOG_DIR, str(seed+200)) # +100 to avoid conflict with other log dirs when fine-tuning - os.makedirs(env_log_dir, exist_ok=True) - env = Monitor(env, env_log_dir) + # env_log_dir = os.path.join(LOG_DIR, str(seed+200)) # +100 to avoid conflict with other log dirs when fine-tuning + # os.makedirs(env_log_dir, exist_ok=True) + # env = Monitor(env, env_log_dir) + env = Monitor(env) env.seed(seed) return env return _init @@ -77,11 +78,11 @@ def main(): ) # Set the save directory - save_dir = "trained_models_remove_time_reward" + save_dir = "trained_models_test" os.makedirs(save_dir, exist_ok=True) # Load the model from file - # model_path = "trained_models_ryu_vs_bison_finetune_9_frame_step512/ppo_ryu_7000000_steps.zip" + # model_path = "trained_models/ppo_ryu_7000000_steps.zip" # Load model and modify the learning rate and entropy coefficient # custom_objects = {