From 02e39f0a523ed11b6fdda11493134080482d6279 Mon Sep 17 00:00:00 2001 From: linyiLYi <48440925+linyiLYi@users.noreply.github.com> Date: Fri, 31 Mar 2023 02:10:25 +0800 Subject: [PATCH] ram_based_image_stack --- .../street_fighter_notebook-checkpoint.ipynb | 234 + .../__pycache__/custom_cnn.cpython-38.pyc | Bin 0 -> 1167 bytes .../__pycache__/rmsprop_optim.cpython-38.pyc | Bin 0 -> 2732 bytes ...reet_fighter_custom_wrapper.cpython-38.pyc | Bin 0 -> 2272 bytes .../check_reward.py | 46 + .../custom_cnn.py | 0 000_image_stack_ram_based_reward/evaluate.py | 52 + ...fevents.1680176551.DESKTOP-9E17TO7.25984.0 | Bin 0 -> 13771 bytes ...fevents.1680180303.DESKTOP-9E17TO7.35284.0 | Bin 0 -> 29033 bytes ...fevents.1680180514.DESKTOP-9E17TO7.11796.0 | Bin 0 -> 14007 bytes ...fevents.1680180894.DESKTOP-9E17TO7.20548.0 | Bin 0 -> 50276 bytes ...fevents.1680182153.DESKTOP-9E17TO7.30948.0 | Bin 0 -> 57294 bytes ...fevents.1680182468.DESKTOP-9E17TO7.30948.1 | Bin 0 -> 57867 bytes ...fevents.1680182795.DESKTOP-9E17TO7.30948.2 | Bin 0 -> 8507 bytes ...fevents.1680183136.DESKTOP-9E17TO7.30948.3 | Bin 0 -> 53172 bytes ...fevents.1680183432.DESKTOP-9E17TO7.30948.4 | Bin 0 -> 10538 bytes ...fevents.1680183612.DESKTOP-9E17TO7.32692.0 | Bin 0 -> 49623 bytes ...fevents.1680183923.DESKTOP-9E17TO7.32692.1 | Bin 0 -> 20885 bytes ...tfevents.1680177234.DESKTOP-9E17TO7.2364.0 | Bin 0 -> 2971 bytes ...fevents.1680184256.DESKTOP-9E17TO7.32692.2 | Bin 0 -> 43434 bytes ...fevents.1680184590.DESKTOP-9E17TO7.32692.3 | Bin 0 -> 18129 bytes ...fevents.1680184934.DESKTOP-9E17TO7.32692.4 | Bin 0 -> 30495 bytes ...fevents.1680185250.DESKTOP-9E17TO7.32692.5 | Bin 0 -> 8507 bytes ...fevents.1680185584.DESKTOP-9E17TO7.32692.6 | Bin 0 -> 251 bytes ...fevents.1680185591.DESKTOP-9E17TO7.32692.7 | Bin 0 -> 41379 bytes ...fevents.1680185938.DESKTOP-9E17TO7.32692.8 | Bin 0 -> 59922 bytes ...fevents.1680186251.DESKTOP-9E17TO7.32692.9 | Bin 0 -> 19507 bytes ...fevents.1680177334.DESKTOP-9E17TO7.35060.0 | Bin 0 -> 60611 bytes ...fevents.1680177771.DESKTOP-9E17TO7.35060.1 | Bin 0 -> 46983 bytes ...fevents.1680178207.DESKTOP-9E17TO7.35060.2 | Bin 0 -> 12629 bytes ...fevents.1680178663.DESKTOP-9E17TO7.35060.3 | Bin 0 -> 39428 bytes ...fevents.1680179100.DESKTOP-9E17TO7.35060.4 | Bin 0 -> 8507 bytes ...fevents.1680179576.DESKTOP-9E17TO7.35060.5 | Bin 0 -> 16763 bytes ...fevents.1680180040.DESKTOP-9E17TO7.35060.6 | Bin 0 -> 5751 bytes .../logs/monitor.csv | 53 + .../optuna/tuning_log.txt | 8947 +++++++++++++++++ .../rmsprop_optim.py | 93 + .../street_fighter_custom_wrapper.py | 97 + .../street_fighter_notebook.ipynb | 314 + 000_image_stack_ram_based_reward/test.py | 69 + 000_image_stack_ram_based_reward/train.py | 125 + 000_image_stack_ram_based_reward/tune.py | 81 + 000_image_stack_ram_based_reward/tune_ppo.py | 69 + ...reet_fighter_custom_wrapper.cpython-38.pyc | Bin 3107 -> 0 bytes .../__pycache__/custom_cnn.cpython-38.pyc | Bin ...reet_fighter_custom_wrapper.cpython-38.pyc | Bin 0 -> 3050 bytes .../check_reward.py | 39 + .../custom_cnn.py | 24 + .../evaluate.py | 47 + .../logs/monitor.csv | 12 + .../street_fighter_custom_wrapper.py | 4 +- .../test.py | 2 +- .../train.py | 16 +- .../trainging_log_continued.txt | 2791 +++++ .../training_log.txt | 0 001_image_stack_vision_based_reward/tune.py | 81 + .../__pycache__/custom_cnn.cpython-38.pyc | Bin 0 -> 1198 bytes ...reet_fighter_custom_wrapper.cpython-38.pyc | Bin 0 -> 2031 bytes 003_frame_delta_ram_based/custom_cnn.py | 25 + 003_frame_delta_ram_based/logs/monitor.csv | 2 + .../street_fighter_custom_wrapper.py | 72 + 003_frame_delta_ram_based/test.py | 70 + 003_frame_delta_ram_based/train.py | 124 + 003_frame_delta_ram_based/tune_ppo.py | 73 + 64 files changed, 13545 insertions(+), 17 deletions(-) create mode 100644 000_image_stack_ram_based_reward/.ipynb_checkpoints/street_fighter_notebook-checkpoint.ipynb create mode 100644 000_image_stack_ram_based_reward/__pycache__/custom_cnn.cpython-38.pyc create mode 100644 000_image_stack_ram_based_reward/__pycache__/rmsprop_optim.cpython-38.pyc create mode 100644 000_image_stack_ram_based_reward/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc create mode 100644 000_image_stack_ram_based_reward/check_reward.py rename {001_image_stack => 000_image_stack_ram_based_reward}/custom_cnn.py (100%) create mode 100644 000_image_stack_ram_based_reward/evaluate.py create mode 100644 000_image_stack_ram_based_reward/logs/PPO_1/events.out.tfevents.1680176551.DESKTOP-9E17TO7.25984.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_10/events.out.tfevents.1680180303.DESKTOP-9E17TO7.35284.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_11/events.out.tfevents.1680180514.DESKTOP-9E17TO7.11796.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_12/events.out.tfevents.1680180894.DESKTOP-9E17TO7.20548.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_13/events.out.tfevents.1680182153.DESKTOP-9E17TO7.30948.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_14/events.out.tfevents.1680182468.DESKTOP-9E17TO7.30948.1 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_15/events.out.tfevents.1680182795.DESKTOP-9E17TO7.30948.2 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_16/events.out.tfevents.1680183136.DESKTOP-9E17TO7.30948.3 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_17/events.out.tfevents.1680183432.DESKTOP-9E17TO7.30948.4 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_18/events.out.tfevents.1680183612.DESKTOP-9E17TO7.32692.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_19/events.out.tfevents.1680183923.DESKTOP-9E17TO7.32692.1 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_2/events.out.tfevents.1680177234.DESKTOP-9E17TO7.2364.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_20/events.out.tfevents.1680184256.DESKTOP-9E17TO7.32692.2 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_21/events.out.tfevents.1680184590.DESKTOP-9E17TO7.32692.3 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_22/events.out.tfevents.1680184934.DESKTOP-9E17TO7.32692.4 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_23/events.out.tfevents.1680185250.DESKTOP-9E17TO7.32692.5 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_24/events.out.tfevents.1680185584.DESKTOP-9E17TO7.32692.6 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_25/events.out.tfevents.1680185591.DESKTOP-9E17TO7.32692.7 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_26/events.out.tfevents.1680185938.DESKTOP-9E17TO7.32692.8 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_27/events.out.tfevents.1680186251.DESKTOP-9E17TO7.32692.9 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_3/events.out.tfevents.1680177334.DESKTOP-9E17TO7.35060.0 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_4/events.out.tfevents.1680177771.DESKTOP-9E17TO7.35060.1 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_5/events.out.tfevents.1680178207.DESKTOP-9E17TO7.35060.2 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_6/events.out.tfevents.1680178663.DESKTOP-9E17TO7.35060.3 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_7/events.out.tfevents.1680179100.DESKTOP-9E17TO7.35060.4 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_8/events.out.tfevents.1680179576.DESKTOP-9E17TO7.35060.5 create mode 100644 000_image_stack_ram_based_reward/logs/PPO_9/events.out.tfevents.1680180040.DESKTOP-9E17TO7.35060.6 create mode 100644 000_image_stack_ram_based_reward/logs/monitor.csv create mode 100644 000_image_stack_ram_based_reward/optuna/tuning_log.txt create mode 100644 000_image_stack_ram_based_reward/rmsprop_optim.py create mode 100644 000_image_stack_ram_based_reward/street_fighter_custom_wrapper.py create mode 100644 000_image_stack_ram_based_reward/street_fighter_notebook.ipynb create mode 100644 000_image_stack_ram_based_reward/test.py create mode 100644 000_image_stack_ram_based_reward/train.py create mode 100644 000_image_stack_ram_based_reward/tune.py create mode 100644 000_image_stack_ram_based_reward/tune_ppo.py delete mode 100644 001_image_stack/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc rename {001_image_stack => 001_image_stack_vision_based_reward}/__pycache__/custom_cnn.cpython-38.pyc (100%) create mode 100644 001_image_stack_vision_based_reward/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc create mode 100644 001_image_stack_vision_based_reward/check_reward.py create mode 100644 001_image_stack_vision_based_reward/custom_cnn.py create mode 100644 001_image_stack_vision_based_reward/evaluate.py create mode 100644 001_image_stack_vision_based_reward/logs/monitor.csv rename {001_image_stack => 001_image_stack_vision_based_reward}/street_fighter_custom_wrapper.py (96%) rename {001_image_stack => 001_image_stack_vision_based_reward}/test.py (96%) rename {001_image_stack => 001_image_stack_vision_based_reward}/train.py (91%) create mode 100644 001_image_stack_vision_based_reward/trainging_log_continued.txt rename {001_image_stack => 001_image_stack_vision_based_reward}/training_log.txt (100%) create mode 100644 001_image_stack_vision_based_reward/tune.py create mode 100644 003_frame_delta_ram_based/__pycache__/custom_cnn.cpython-38.pyc create mode 100644 003_frame_delta_ram_based/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc create mode 100644 003_frame_delta_ram_based/custom_cnn.py create mode 100644 003_frame_delta_ram_based/logs/monitor.csv create mode 100644 003_frame_delta_ram_based/street_fighter_custom_wrapper.py create mode 100644 003_frame_delta_ram_based/test.py create mode 100644 003_frame_delta_ram_based/train.py create mode 100644 003_frame_delta_ram_based/tune_ppo.py diff --git a/000_image_stack_ram_based_reward/.ipynb_checkpoints/street_fighter_notebook-checkpoint.ipynb b/000_image_stack_ram_based_reward/.ipynb_checkpoints/street_fighter_notebook-checkpoint.ipynb new file mode 100644 index 0000000..ccf2f64 --- /dev/null +++ b/000_image_stack_ram_based_reward/.ipynb_checkpoints/street_fighter_notebook-checkpoint.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "10d267bb", + "metadata": {}, + "outputs": [], + "source": [ + "import retro" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1ef8ff20", + "metadata": {}, + "outputs": [], + "source": [ + "game = \"StreetFighterIISpecialChampionEdition-Genesis\"\n", + "state = \"Champion.Level1.ChunLiVsGuile\"\n", + "env = retro.make(game=game, state=state)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5ce656b8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1], dtype=int8)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "env.action_space.sample()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8c3f0a4d", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(200, 256, 3)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "env.observation_space.sample().shape" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "46db7b05", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(200, 256, 3)\n", + "{'enemy_matches_won': 0, 'score': 0, 'matches_won': 0, 'continuetimer': 0, 'enemy_health': 176, 'health': 176}\n" + ] + } + ], + "source": [ + "observation = env.reset()\n", + "print(observation.shape)\n", + "\n", + "action = env.action_space.sample()\n", + "obs, rewards, done, info = env.step(action)\n", + "print(info)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "09f0c6b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MultiBinary(12)\n" + ] + } + ], + "source": [ + "from gym.spaces import Box, MultiBinary\n", + "\n", + "print(MultiBinary(12))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "97df18cf", + "metadata": {}, + "outputs": [], + "source": [ + "import gym\n", + "import numpy as np\n", + "from gym.spaces import Box, MultiBinary\n", + "\n", + "class StreetFighter(gym.Env):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.observation_space = Box(low=0, high=255, shape=(84, 84), dtype=np.uint8)\n", + " self.action_space = MultiBinary(12)\n", + " self.game = retro.make(game=\"StreetFighterIISpecialChampionEdition-Genesis\", use_restricted_actions=retro.Actions.FILTERED)\n", + " \n", + " self.full_hp = 176\n", + " self.player_health = self.full_hp\n", + " self.oppont_health = self.full_hp\n", + " \n", + " self.score = 0\n", + " \n", + " def __preprocess(self, observation):\n", + " gray = cv2.cvtColor(observation, cv2.COLOR_BGR2GRAY)\n", + " resize = cv2.resize(gray, (84,84), interpolation=cv2.INTER_CUBIC)\n", + " return resize\n", + "\n", + " def step(self, action):\n", + "\n", + " obs, reward, done, info = self.game.step(action)\n", + " custom_obs = self.__preprocess(obs) # It's just frame, not frame_delta\n", + "\n", + " # During fighting, either player or opponent has positive health points.\n", + " if info['health'] > 0 or info['enemy_health'] > 0:\n", + "\n", + " # Player Loses\n", + " if info['health'] < 0 and info['health'] != self.player_health and info['enemy_health'] != 0:\n", + " reward = (-self.full_hp) * info['enemy_health']\n", + "\n", + " # Player Wins\n", + " elif info['enemy_health'] < 0 and info['enemy_health'] != self.oppont_health and info['health'] != 0:\n", + " reward = self.full_hp * info['health']\n", + "\n", + " # During Fighting\n", + " else:\n", + " reward = (self.oppont_health - info['enemy_health']) - (self.player_health - info['health'])\n", + " \n", + " self.player_health = info['health']\n", + " self.oppont_health = info['enemy_health']\n", + " \n", + " return custom_obs, reward, done, info\n", + " \n", + " def render(self, *args, **kwargs):\n", + " self.game.render()\n", + " \n", + " def reset(self):\n", + " obs = self.game.reset()\n", + " custom_obs = self.__preprocess(obs)\n", + " self.previous_frame = obs\n", + " \n", + " self.player_health = self.full_hp\n", + " self.oppont_health = self.full_hp\n", + " return custom_obs\n", + "\n", + " def close(self):\n", + " self.game.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "0b137b88", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(84, 84, 1)\n" + ] + } + ], + "source": [ + "env.close()\n", + "env = StreetFighter()\n", + "print(env.observation_space.shape)\n", + "env.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2da50dbc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/000_image_stack_ram_based_reward/__pycache__/custom_cnn.cpython-38.pyc b/000_image_stack_ram_based_reward/__pycache__/custom_cnn.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..617ab55a0c6c7af4c571531eb54e33fac31a6739 GIT binary patch literal 1167 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 literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_11/events.out.tfevents.1680180514.DESKTOP-9E17TO7.11796.0 b/000_image_stack_ram_based_reward/logs/PPO_11/events.out.tfevents.1680180514.DESKTOP-9E17TO7.11796.0 new file mode 100644 index 0000000000000000000000000000000000000000..6fab041903adb474c11c85979bfdc8d7c4e6475b GIT binary patch literal 14007 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%0D2yD?0^MTf#=Ij>LU;=FJ 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 F{{x>w6mI|k literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_16/events.out.tfevents.1680183136.DESKTOP-9E17TO7.30948.3 b/000_image_stack_ram_based_reward/logs/PPO_16/events.out.tfevents.1680183136.DESKTOP-9E17TO7.30948.3 new file mode 100644 index 0000000000000000000000000000000000000000..f3578541e2d19f9872e8c9fab267f014cc6b59dc GIT binary patch literal 53172 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 literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_17/events.out.tfevents.1680183432.DESKTOP-9E17TO7.30948.4 b/000_image_stack_ram_based_reward/logs/PPO_17/events.out.tfevents.1680183432.DESKTOP-9E17TO7.30948.4 new file mode 100644 index 0000000000000000000000000000000000000000..ac832342f6b0c50a0035e7bef806de8aaefca7fd GIT binary patch literal 10538 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 literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_18/events.out.tfevents.1680183612.DESKTOP-9E17TO7.32692.0 b/000_image_stack_ram_based_reward/logs/PPO_18/events.out.tfevents.1680183612.DESKTOP-9E17TO7.32692.0 new file mode 100644 index 0000000000000000000000000000000000000000..8e7b54dfef3ca47d98d1e09692783e8dfabf22c4 GIT binary patch literal 49623 zcma*wd0b5U{|E4i&_WR@bSb%HOQDozrkQFi*_Ws+EmWeCWX+PjLS-vUQDmn@_NGiF zM6P5ht|ev3ntfk>_d7iLeO_n3f8NLEb>5%P`#k$NGjrz50MYONey$&otQ~FNa@b_; zTk_UTe8YSKLo5}u{X)X~_8e)c(=FUDWajiR-|0SKlPzb?3J&%On`b#EEHKs5+E=NM+w@+yJ&UU@c&Jt>2bp@COWNknukpf3YtDEyoXk40?EskJ%xa|j+svD-+|ESL4lLzc?E>|Ob+}XPxS%%7lbNTx>f!V(%RWRL9_gR z$8@8#q-2Z@X{R8~{Hg<8jsQ|J$c9>@{ei*NXf!fq$B3!Ixdon3IQn@;6pm{)%Bc#&THNaX)S?tW0!3C zf?vMpV2Nd$%15e^zUab%)Z0RlW>qg;aFRgUvGBW2i`RgZtVux{dED7fa_k%+C5JO2 zjX1nk>@ohzeD3KnAw9aMnRKAf>sHW7vK~9qmtDr*0HkD$4e9c5&HS=vy%d0y400n4 zcfFYRImh2Y$U^Bzo!&hi21v=mRHO^rY?O`)Sh*39k^w%XR^`shqtj%rLRw28om}%! zCfX`Wh9%B#et(o2>3JJ&q$Z17=?G2&(&cx)6#`PSCIzV|+j+Uq(6)e-9L|XJz4aCG zt(E^8a8Hj3>GvfarO&&EuZ2#M_1KYCm7BN$QZmMdRMA8;KUJcU4oJx$H&WT0za*g< zSN(-7l#cZD*=CagDOs3`w76iHZ2O7Y?|_sH@FDH4=c(+O;*lhzwFJ_t_9^oGV(}PQ zqWy$Nqt!@v%Gi;*9qXWoRHU91oFtH*E0}8+TM0t5u#WoYtpi(1gz52siLnp~3JJL2^yygK?GRB6qs=R)_Sf?Tqkdi@eq#Jv- zmTGxuoZ&tXzZXhJI?;EPHXtPnQ<27uHjy>1(sc%;WPlH8PT{{f|MnWXO-O4Aq>&{Z zBYLaE z)?3}(xu?g3)VKO?X|3dEHguA#$BwjrJFT67l#H<iHNo(h4_rq@ssi6oH41my9BU7x`q_J=Rl14nXcn+N;lk7-+61N`&q-2Z@>87-L`TcjjO$4N5kQ=G& z;sSAAJws<93#B77hpYbQU{O(PksXev7a8l8Y-@hg2j|79?jn4h5uSl8)5ZWo#rMC5JO2 z9h7G%8L~g?8Js&Z#fr4~r5I^?6MakQB$;GKnyB!Y1xU#l8&Zqy8u{{?ulVYo400p& zUb-}Q`;lJvge;Vf^it(UFF;BbrXt-aGmxF=_D@4VN(T6lI(rA@I3BkR6Vh4&sW|Gp zJl`G4@)>2qRddwFdtz){rgH1uu)X83^f2wwV zxqmoTr8-S_zW4dg5?CC}k`d}HU1P~M%V(>2X2|q!e#naX(#Ugt@-6<%@Kh<)Pg}9ocJo=`(K@gq(b59>;Np{}f7Yu83sos#|9i17 zuRnMJfQ9jlU{^h^7H>TCpaahgnZV{I2TGIjs_mekP?6}T`qQib|Dbe8(7b~H7IJK0 zTQ2*h(y`j*4qze44K{RMPsxKXdbssKo)hd~^N3vl7NS(J$3#`KwimO109Z)yf!$@} z;xMlM3kN|BCcxegnC{fu=ffvBr;}UejaP&Hx`_vD#KQ~^;ZXovnOm7B)P$=e(e-TZE=_>XtDGi_GP$>9e{<>RItmPmdT!!Pbvqnkl+J*)csJ-=7}mT zK@BFrws$R)kNNlg0$8SJeEI}6*c&N4V2{?ElL?Ok*kJ`51_M~AN&zd%bj~h1`xU^# zct)^kRR$7C?f8c`JsU?Is3 z)?3^l&-ngK8$pYugLRr`?FC?=G!<-I!fM%?p<8wXSV-`Jt;`yr?33Z(E~vo-*xQ3F z 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 bO6BIa1|J;2ClCfq0PE;8O+2{U?>GJrG~b|+ literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_2/events.out.tfevents.1680177234.DESKTOP-9E17TO7.2364.0 b/000_image_stack_ram_based_reward/logs/PPO_2/events.out.tfevents.1680177234.DESKTOP-9E17TO7.2364.0 new file mode 100644 index 0000000000000000000000000000000000000000..9b2266427cb11e9e7840936077556faa73a332f6 GIT binary patch literal 2971 zcma*neM}p57zgln6168}1uQQ`VThJeNqK1qgi)HVWuwK7t(#LayUVQ{^zeFjxwec_ z<3>--vjhyv2L=y1v3?vO%>YD$OiZF&@={EF5Qa1ZZxvt&$^WE6vaVZ-~FlZBt*<1uo z$u<-!b?qDWcjWVZBiDvkLVcM?IwA#*H&ozFZ^+$>4)+3^}(a-iWqhEP+ureC`{xoZVsh zZm*CTbuZ)-3pynX}YfsIBhFNx^XV{dLYF- zu(O4QR?Pc%NlpmqkxkK&?y#c9Y^BsEIJtnd{?deh+xOnv5K^!+9BH?qWpmv$gcN){ zBGO~4C-tj+;;h)?aR-HwdWUFTWy8ULpi6>%z$HV;`$!LzeQ^##3dW)#Rqk0a`ews6 zJA@Pr#z8v#^759evnz!xx)^Ec)B_p_DOeni^xQKE=Hi}-zaXSwARbbyS6}^Q;GKYw z(*j6GR3Dparge5`#i9K5c_E||p6EzLq6VW@yzZpnDcBi~^i{)Y zytWuZ3O*hYsl7?2ySrD7#U3vb(%l}F?pEs8rO+k8zUW9Fx;nNCLJG#BAq~El>Lb$q z7a^ozFgDWBP135H11HZ5S#&Ydi@mKK5K^!>9O(-)?WRAId^aGZU?3jS%V#v&jRj+j zkkbN48!IUDzF(wcPxJr5U(5QuP7?T|JwJrBd!IPE(vn1*vAxH}!XT4o zh9`_p)e!7G43U8*jb`=K^H2Gz`hLfX`NlV9zCq!}*jR5~>Cz63=iL#s>|(8!=j3Of z;H%q`wg17@;ar0y?p14&P4-eg@nq)4DL4_&>$7j`tNJSn?+H3E05*78VZMHQdD;JA Cez;oz literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_20/events.out.tfevents.1680184256.DESKTOP-9E17TO7.32692.2 b/000_image_stack_ram_based_reward/logs/PPO_20/events.out.tfevents.1680184256.DESKTOP-9E17TO7.32692.2 new file mode 100644 index 0000000000000000000000000000000000000000..5a2dda33b1171e2141f8ae5b53fd76581a88daa3 GIT binary patch literal 43434 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 literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_21/events.out.tfevents.1680184590.DESKTOP-9E17TO7.32692.3 b/000_image_stack_ram_based_reward/logs/PPO_21/events.out.tfevents.1680184590.DESKTOP-9E17TO7.32692.3 new file mode 100644 index 0000000000000000000000000000000000000000..55c5befc1aac6cabb2a60c51003cc03fcda7f360 GIT binary patch literal 18129 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 F{{tcgOO5~l literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_23/events.out.tfevents.1680185250.DESKTOP-9E17TO7.32692.5 b/000_image_stack_ram_based_reward/logs/PPO_23/events.out.tfevents.1680185250.DESKTOP-9E17TO7.32692.5 new file mode 100644 index 0000000000000000000000000000000000000000..528228aca1bc9123052ed0bdcdd5cff79b661174 GIT binary patch literal 8507 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 literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_25/events.out.tfevents.1680185591.DESKTOP-9E17TO7.32692.7 b/000_image_stack_ram_based_reward/logs/PPO_25/events.out.tfevents.1680185591.DESKTOP-9E17TO7.32692.7 new file mode 100644 index 0000000000000000000000000000000000000000..a1a8e5dd3b711301c8b8747e69c22e6f72ede22f GIT binary patch literal 41379 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 Y)-8OH2D}2%U;=EQb*`1WtI5az0b|ENlK=n! literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_26/events.out.tfevents.1680185938.DESKTOP-9E17TO7.32692.8 b/000_image_stack_ram_based_reward/logs/PPO_26/events.out.tfevents.1680185938.DESKTOP-9E17TO7.32692.8 new file mode 100644 index 0000000000000000000000000000000000000000..37dacc8946f938832e05bf5d5698a479ef131061 GIT binary patch literal 59922 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 WrwCx-5r_d3V6O(pixc~)&G;Xxac*n? literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_5/events.out.tfevents.1680178207.DESKTOP-9E17TO7.35060.2 b/000_image_stack_ram_based_reward/logs/PPO_5/events.out.tfevents.1680178207.DESKTOP-9E17TO7.35060.2 new file mode 100644 index 0000000000000000000000000000000000000000..6741459b308c4372971f723b722a290b4d6bb6a2 GIT binary patch literal 12629 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 z�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 literal 0 HcmV?d00001 diff --git a/000_image_stack_ram_based_reward/logs/PPO_8/events.out.tfevents.1680179576.DESKTOP-9E17TO7.35060.5 b/000_image_stack_ram_based_reward/logs/PPO_8/events.out.tfevents.1680179576.DESKTOP-9E17TO7.35060.5 new file mode 100644 index 0000000000000000000000000000000000000000..89b6ec0320ac4deb6d2c41978ae03303b66245d1 GIT binary patch literal 16763 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 0: + state['momentum_buffer'] = torch.zeros_like(p) + if group['centered']: + state['grad_avg'] = torch.zeros_like(p) + square_avg = state['square_avg'] + one_minus_alpha = 1. - group['alpha'] + state['step'] += 1 + if group['weight_decay'] != 0: + if group['decoupled_decay']: + p.mul_(1. - group['lr'] * group['weight_decay']) + else: + grad = grad.add(p, alpha=group['weight_decay']) + + # Tensorflow order of ops for updating squared avg + square_avg.add_(grad.pow(2) - square_avg, alpha=one_minus_alpha) + # square_avg.mul_(alpha).addcmul_(grad, grad, value=1 - alpha) # PyTorch original + if group['centered']: + grad_avg = state['grad_avg'] + grad_avg.add_(grad - grad_avg, alpha=one_minus_alpha) + avg = square_avg.addcmul(grad_avg, grad_avg, value=-1).add(group['eps']).sqrt_() # eps in sqrt + # grad_avg.mul_(alpha).add_(grad, alpha=1 - alpha) # + # PyTorch original + else: + avg = square_avg.add(group['eps']).sqrt_() # eps moved in sqrt + if group['momentum'] > 0: + buf = state['momentum_buffer'] + # Tensorflow accumulates the LR scaling in the momentum buffer + if group['lr_in_momentum']: + buf.mul_(group['momentum']).addcdiv_(grad, avg, value=group['lr']) + p.add_(-buf) + else: + # PyTorch scales the param update by LR + buf.mul_(group['momentum']).addcdiv_(grad, avg) + p.add_(buf, alpha=-group['lr']) + else: + p.addcdiv_(grad, avg, value=-group['lr']) + return loss + diff --git a/000_image_stack_ram_based_reward/street_fighter_custom_wrapper.py b/000_image_stack_ram_based_reward/street_fighter_custom_wrapper.py new file mode 100644 index 0000000..eafa231 --- /dev/null +++ b/000_image_stack_ram_based_reward/street_fighter_custom_wrapper.py @@ -0,0 +1,97 @@ +import collections + +import gym +import cv2 +import numpy as np + +# Custom environment wrapper +class StreetFighterCustomWrapper(gym.Wrapper): + def __init__(self, env, testing=False): + super(StreetFighterCustomWrapper, self).__init__(env) + self.env = env + + # Use a deque to store the last 4 frames + self.num_frames = 3 + self.frame_stack = collections.deque(maxlen=self.num_frames) + + self.full_hp = 176 + self.prev_player_health = self.full_hp + self.prev_oppont_health = self.full_hp + + # Update observation space to include stacked grayscale images + self.observation_space = gym.spaces.Box(low=0, high=255, shape=(84, 84, 3), dtype=np.uint8) + + self.testing = testing + + def _preprocess_observation(self, observation): + obs_gray = cv2.cvtColor(observation, cv2.COLOR_BGR2GRAY) + obs_gray_resized = cv2.resize(obs_gray, (84, 84), interpolation=cv2.INTER_AREA) + + # Add the resized image to the frame stack + self.frame_stack.append(obs_gray_resized) + + # Stack the frames and return the "image" + stacked_frames = np.stack(self.frame_stack, axis=-1) + return stacked_frames + + def reset(self): + observation = self.env.reset() + self.prev_player_health = self.full_hp + self.prev_oppont_health = self.full_hp + + obs_gray = cv2.cvtColor(observation, cv2.COLOR_BGR2GRAY) + obs_gray_resized = cv2.resize(obs_gray, (84, 84), interpolation=cv2.INTER_AREA) + + # Clear the frame stack and add the first observation [num_frames] times + self.frame_stack.clear() + for _ in range(self.num_frames): + self.frame_stack.append(obs_gray_resized) + + return np.stack(self.frame_stack, axis=-1) + + def step(self, action): + + obs, reward, done, info = self.env.step(action) + + # During fighting, either player or opponent has positive health points. + if info['health'] > 0 or info['enemy_health'] > 0: + + # Player Loses + if info['health'] < 0 and info['enemy_health'] > 0: + # reward = (-self.full_hp) * info['enemy_health'] * 0.05 # max = 0.05 * 176 * 176 = 1548.8 + reward = -info['enemy_health'] # Use the left over health points as penalty + + # Prevent data overflow + if reward < -self.full_hp: + reward = 0 + + done = True + + # Player Wins + elif info['enemy_health'] < 0 and info['health'] > 0: + # reward = self.full_hp * info['health'] * 0.05 + reward = info['health'] + + + # Prevent data overflow + if reward > self.full_hp: + reward = 0 + + done = True + + # During Fighting + else: + reward = (self.prev_oppont_health - info['enemy_health']) - (self.prev_player_health - info['health']) + + # Prevent data overflow + if reward > 99: + reward = 0 + + self.prev_player_health = info['health'] + self.prev_oppont_health = info['enemy_health'] + + if self.testing: + done = False + + return self._preprocess_observation(obs), reward, done, info + \ No newline at end of file diff --git a/000_image_stack_ram_based_reward/street_fighter_notebook.ipynb b/000_image_stack_ram_based_reward/street_fighter_notebook.ipynb new file mode 100644 index 0000000..ff092ed --- /dev/null +++ b/000_image_stack_ram_based_reward/street_fighter_notebook.ipynb @@ -0,0 +1,314 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "bfc79b8c", + "metadata": {}, + "outputs": [], + "source": [ + "import retro" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c24fbcab", + "metadata": {}, + "outputs": [], + "source": [ + "game = \"StreetFighterIISpecialChampionEdition-Genesis\"\n", + "state = \"Champion.Level1.ChunLiVsGuile\"\n", + "env = retro.make(game=game, state=state)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "59839d9c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1], dtype=int8)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "env.action_space.sample()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e068cb0a", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(200, 256, 3)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "env.observation_space.sample().shape" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "1cb0297f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(200, 256, 3)\n", + "{'enemy_matches_won': 0, 'score': 0, 'matches_won': 0, 'continuetimer': 0, 'enemy_health': 176, 'health': 176}\n" + ] + } + ], + "source": [ + "observation = env.reset()\n", + "print(observation.shape)\n", + "\n", + "action = env.action_space.sample()\n", + "obs, rewards, done, info = env.step(action)\n", + "print(info)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "0eaa5cc8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MultiBinary(12)\n" + ] + } + ], + "source": [ + "from gym.spaces import Box, MultiBinary\n", + "\n", + "print(MultiBinary(12))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "49f6cf5c", + "metadata": {}, + "outputs": [], + "source": [ + "import cv2\n", + "\n", + "import gym\n", + "import numpy as np\n", + "from gym.spaces import Box, MultiBinary\n", + "\n", + "class StreetFighter(gym.Env):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.observation_space = Box(low=0, high=255, shape=(84, 84), dtype=np.uint8)\n", + " self.action_space = MultiBinary(12)\n", + " self.game = retro.make(game=\"StreetFighterIISpecialChampionEdition-Genesis\", use_restricted_actions=retro.Actions.FILTERED)\n", + " \n", + " self.full_hp = 176\n", + " self.player_health = self.full_hp\n", + " self.oppont_health = self.full_hp\n", + " \n", + " self.score = 0\n", + " \n", + " def __preprocess(self, observation):\n", + " gray = cv2.cvtColor(observation, cv2.COLOR_BGR2GRAY)\n", + " resize = cv2.resize(gray, (84,84), interpolation=cv2.INTER_CUBIC)\n", + " return resize\n", + "\n", + " def step(self, action):\n", + "\n", + " obs, reward, done, info = self.game.step(action)\n", + " custom_obs = self.__preprocess(obs) # It's just frame, not frame_delta\n", + "\n", + " # During fighting, either player or opponent has positive health points.\n", + " if info['health'] > 0 or info['enemy_health'] > 0:\n", + "\n", + " # Player Loses\n", + " if info['health'] < 0 and info['health'] != self.player_health and info['enemy_health'] != 0:\n", + " reward = (-self.full_hp) * info['enemy_health']\n", + "\n", + " # Player Wins\n", + " elif info['enemy_health'] < 0 and info['enemy_health'] != self.oppont_health and info['health'] != 0:\n", + " reward = self.full_hp * info['health']\n", + "\n", + " # During Fighting\n", + " else:\n", + " reward = (self.oppont_health - info['enemy_health']) - (self.player_health - info['health'])\n", + " \n", + " self.player_health = info['health']\n", + " self.oppont_health = info['enemy_health']\n", + " \n", + " return custom_obs, reward, done, info\n", + " \n", + " def render(self, *args, **kwargs):\n", + " self.game.render()\n", + " \n", + " def reset(self):\n", + " obs = self.game.reset()\n", + " custom_obs = self.__preprocess(obs)\n", + " self.previous_frame = obs\n", + " \n", + " self.player_health = self.full_hp\n", + " self.oppont_health = self.full_hp\n", + " return custom_obs\n", + "\n", + " def close(self):\n", + " self.game.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "6ec30177", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(84, 84)\n" + ] + } + ], + "source": [ + "env.close()\n", + "env = StreetFighter()\n", + "print(env.observation_space.shape)\n", + "env.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "7d9eab3a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\ProgramData\\Anaconda3\\envs\\StreetFighterAI\\lib\\site-packages\\pyglet\\image\\codecs\\wic.py:289: UserWarning: [WinError -2147417850] Cannot change thread mode after it is set\n", + " warnings.warn(str(err))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-22 154 176\n", + "-32 122 176\n", + "29 122 147\n", + "7 122 140\n", + "-31 91 140\n", + "29 91 111\n", + "-23 68 111\n", + "-24 44 111\n", + "-24 20 111\n", + "31 20 80\n", + "10 20 70\n", + "45 20 25\n", + "5 20 20\n", + "-15 5 20\n", + "19 5 1\n", + "-176 -1 1\n", + "46 176 130\n", + "7 176 123\n", + "-24 152 123\n", + "29 152 94\n", + "-24 128 94\n", + "7 128 87\n", + "39 128 48\n", + "-31 97 48\n", + "36 97 12\n", + "-24 73 12\n", + "-24 49 12\n", + "8624 49 -1\n", + "39 176 137\n", + "-24 152 137\n", + "-23 129 137\n", + "-23 106 137\n", + "-26 80 137\n", + "-24 56 137\n", + "-23 33 137\n", + "-21 12 137\n", + "-12 0 137\n", + "-24112 -1 137\n" + ] + } + ], + "source": [ + "## Checking Rewards functionality\n", + "import time\n", + "\n", + "env = StreetFighter()\n", + "obs = env.reset()\n", + "done = False\n", + "\n", + "for game in range(5):\n", + " while not done:\n", + " if done:\n", + " obs = env.reset()\n", + " env.render()\n", + " obs, reward, done, info = env.step(env.action_space.sample())\n", + " if reward != 0:\n", + " print(reward, info['health'], info['enemy_health'])\n", + " time.sleep(0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1ae8310", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/000_image_stack_ram_based_reward/test.py b/000_image_stack_ram_based_reward/test.py new file mode 100644 index 0000000..d0611e7 --- /dev/null +++ b/000_image_stack_ram_based_reward/test.py @@ -0,0 +1,69 @@ +import time + +import retro +from stable_baselines3 import PPO + +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +def make_env(game, state): + def _init(): + env = retro.make( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + return env + return _init + +game = "StreetFighterIISpecialChampionEdition-Genesis" +state_stages = [ + "Champion.Level1.ChunLiVsGuile", # Average reward for random strategy: -102.3 + "ChampionX.Level1.ChunLiVsKen", # Average reward for random strategy: -247.6 + "Champion.Level2.ChunLiVsKen", + "Champion.Level3.ChunLiVsChunLi", + "Champion.Level4.ChunLiVsZangief", + "Champion.Level5.ChunLiVsDhalsim", + "Champion.Level6.ChunLiVsRyu", + "Champion.Level7.ChunLiVsEHonda", + "Champion.Level8.ChunLiVsBlanka", + "Champion.Level9.ChunLiVsBalrog", + "Champion.Level10.ChunLiVsVega", + "Champion.Level11.ChunLiVsSagat", + "Champion.Level12.ChunLiVsBison" + # Add other stages as necessary +] + +env = make_env(game, state_stages[0])() + +model = PPO( + "CnnPolicy", + env, + verbose=1 +) +model_path = r"optuna/trial_1_best_model" # Average reward for optuna/trial_1_best_model: -82.3 +model.load(model_path) + +obs = env.reset() +done = False + +num_episodes = 30 +episode_reward_sum = 0 +for _ in range(num_episodes): + done = False + obs = env.reset() + total_reward = 0 + while not done: + timestamp = time.time() + obs, reward, done, info = env.step(env.action_space.sample()) + + if reward != 0: + total_reward += reward + print("Reward: {}, playerHP: {}, enemyHP:{}".format(reward, info['health'], info['enemy_health'])) + env.render() + print("Total reward: {}".format(total_reward)) + episode_reward_sum += total_reward + +env.close() +print("Average reward for {}: {}".format(model_path, episode_reward_sum/num_episodes)) \ No newline at end of file diff --git a/000_image_stack_ram_based_reward/train.py b/000_image_stack_ram_based_reward/train.py new file mode 100644 index 0000000..0e767d3 --- /dev/null +++ b/000_image_stack_ram_based_reward/train.py @@ -0,0 +1,125 @@ +import os +import random + +import retro +from stable_baselines3 import PPO +from stable_baselines3.common.vec_env import SubprocVecEnv +from stable_baselines3.common.callbacks import BaseCallback, CheckpointCallback + +from rmsprop_optim import RMSpropTF +from custom_cnn import CustomCNN +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +class RandomOpponentChangeCallback(BaseCallback): + def __init__(self, stages, opponent_interval, verbose=0): + super(RandomOpponentChangeCallback, self).__init__(verbose) + self.stages = stages + self.opponent_interval = opponent_interval + + def _on_step(self) -> bool: + if self.n_calls % self.opponent_interval == 0: + new_state = random.choice(self.stages) + print("\nCurrent state:", new_state) + self.training_env.env_method("load_state", new_state, indices=None) + return True + +def make_env(game, state, seed=0): + def _init(): + env = retro.make( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + env.seed(seed) + return env + return _init + +def main(): + # Set up the environment and model + game = "StreetFighterIISpecialChampionEdition-Genesis" + state_stages = [ + "ChampionX.Level1.ChunLiVsKen", + "ChampionX.Level2.ChunLiVsChunLi", + "ChampionX.Level3.ChunLiVsZangief", + "ChampionX.Level4.ChunLiVsDhalsim", + "ChampionX.Level5.ChunLiVsRyu", + "ChampionX.Level6.ChunLiVsEHonda", + "ChampionX.Level7.ChunLiVsBlanka", + "ChampionX.Level8.ChunLiVsGuile", + "ChampionX.Level9.ChunLiVsBalrog", + "ChampionX.Level10.ChunLiVsVega", + "ChampionX.Level11.ChunLiVsSagat", + "ChampionX.Level12.ChunLiVsBison" + # Add other stages as necessary + ] + # Champion is at difficulty level 4, ChampionX is at difficulty level 8. + + num_envs = 8 + + env = SubprocVecEnv([make_env(game, state_stages[0], seed=i) for i in range(num_envs)]) + + # Using CustomCNN as the feature extractor + policy_kwargs = { + 'features_extractor_class': CustomCNN + } + + model = PPO( + "CnnPolicy", + env, + device="cuda", + policy_kwargs=policy_kwargs, + verbose=1, + n_steps=5400, + batch_size=64, + learning_rate=0.0001, + ent_coef=0.01, + clip_range=0.2, + gamma=0.99, + gae_lambda=0.95, + tensorboard_log="logs/" + ) + + # Set the save directory + save_dir = "trained_models" + os.makedirs(save_dir, exist_ok=True) + + # Load the model from file + # model_path = "trained_models/ppo_chunli_1296000_steps.zip" + + # Load model and modify the learning rate and entropy coefficient + # custom_objects = { + # "learning_rate": 0.0002 + # } + # model = PPO.load(model_path, env=env, device="cuda")#, custom_objects=custom_objects) + + # Set up callbacks + opponent_interval = 5400 # stage_interval * num_envs = total_steps_per_stage + checkpoint_interval = 54000 # checkpoint_interval * num_envs = total_steps_per_checkpoint (Every 80 rounds) + checkpoint_callback = CheckpointCallback(save_freq=checkpoint_interval, save_path=save_dir, name_prefix="ppo_chunli") + stage_increase_callback = RandomOpponentChangeCallback(state_stages, opponent_interval, save_dir) + + # model_params = { + # 'n_steps': 5, + # 'gamma': 0.99, + # 'gae_lambda':1, + # 'learning_rate': 7e-4, + # 'vf_coef': 0.5, + # 'ent_coef': 0.0, + # 'max_grad_norm':0.5, + # 'rms_prop_eps':1e-05 + # } + # model = A2C('CnnPolicy', env, tensorboard_log='logs/', verbose=1, **model_params, policy_kwargs=dict(optimizer_class=RMSpropTF)) + + model.learn( + total_timesteps=int(6048000), # total_timesteps = stage_interval * num_envs * num_stages (1120 rounds) + callback=[checkpoint_callback, stage_increase_callback] + ) + env.close() + + # Save the final model + model.save(os.path.join(save_dir, "ppo_sf2_chunli_final.zip")) + +if __name__ == "__main__": + main() diff --git a/000_image_stack_ram_based_reward/tune.py b/000_image_stack_ram_based_reward/tune.py new file mode 100644 index 0000000..2c60de1 --- /dev/null +++ b/000_image_stack_ram_based_reward/tune.py @@ -0,0 +1,81 @@ +import gym +import retro +import optuna +from stable_baselines3 import PPO +from stable_baselines3.common.monitor import Monitor +from stable_baselines3.common.evaluation import evaluate_policy + +from custom_cnn import CustomCNN +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +def make_env(game, state, seed=0): + def _init(): + env = retro.RetroEnv( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + env = Monitor(env) + env.seed(seed) + return env + return _init + +def objective(trial): + game = "StreetFighterIISpecialChampionEdition-Genesis" + env = make_env(game, state="ChampionX.Level1.ChunLiVsKen")() + + # Suggest hyperparameters + learning_rate = trial.suggest_float("learning_rate", 5e-5, 1e-3, log=True) + n_steps = trial.suggest_int("n_steps", 256, 8192, log=True) + batch_size = trial.suggest_int("batch_size", 16, 128, log=True) + gamma = trial.suggest_float("gamma", 0.9, 0.9999) + gae_lambda = trial.suggest_float("gae_lambda", 0.9, 1.0) + clip_range = trial.suggest_float("clip_range", 0.1, 0.4) + ent_coef = trial.suggest_float("ent_coef", 1e-4, 1e-2, log=True) + vf_coef = trial.suggest_float("vf_coef", 0.1, 1.0) + + # Using CustomCNN as the feature extractor + policy_kwargs = { + 'features_extractor_class': CustomCNN + } + + # Train the model + model = PPO( + "CnnPolicy", + env, + device="cuda", + policy_kwargs=policy_kwargs, + verbose=1, + n_steps=n_steps, + batch_size=batch_size, + learning_rate=learning_rate, + ent_coef=ent_coef, + clip_range=clip_range, + vf_coef=vf_coef, + gamma=gamma, + gae_lambda=gae_lambda + ) + + for iteration in range(10): + model.learn(total_timesteps=100000) + mean_reward, _std_reward = evaluate_policy(model, env, n_eval_episodes=10) + + trial.report(mean_reward, iteration) + + if trial.should_prune(): + raise optuna.TrialPruned() + + return mean_reward + +study = optuna.create_study(direction="maximize") +study.optimize(objective, n_trials=100, timeout=7200) # Run optimization for 100 trials or 2 hours, whichever comes first + +print("Best trial:") +trial = study.best_trial + +print(" Value: ", trial.value) +print(" Params: ") +for key, value in trial.params.items(): + print(f"{key}: {value}") diff --git a/000_image_stack_ram_based_reward/tune_ppo.py b/000_image_stack_ram_based_reward/tune_ppo.py new file mode 100644 index 0000000..818da65 --- /dev/null +++ b/000_image_stack_ram_based_reward/tune_ppo.py @@ -0,0 +1,69 @@ +import os + +import retro +import optuna +from stable_baselines3 import PPO +from stable_baselines3.common.monitor import Monitor +from stable_baselines3.common.evaluation import evaluate_policy + +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +LOG_DIR = 'logs/' +OPT_DIR = 'optuna/' +os.makedirs(LOG_DIR, exist_ok=True) +os.makedirs(OPT_DIR, exist_ok=True) + +def optimize_ppo(trial): + return { + 'n_steps':trial.suggest_int('n_steps', 1024, 8192, log=True), + 'gamma':trial.suggest_float('gamma', 0.9, 0.9999), + 'learning_rate':trial.suggest_float('learning_rate', 5e-5, 1e-4, log=True), + 'clip_range':trial.suggest_float('clip_range', 0.1, 0.4), + 'gae_lambda':trial.suggest_float('gae_lambda', 0.8, 0.99) + } + +def make_env(game, state): + def _init(): + env = retro.make( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + return env + return _init + +def optimize_agent(trial): + game = "StreetFighterIISpecialChampionEdition-Genesis" + state = "Champion.Level1.ChunLiVsGuile"#"ChampionX.Level1.ChunLiVsKen" + + try: + model_params = optimize_ppo(trial) + + # Create environment + env = make_env(game, state)() + env = Monitor(env, LOG_DIR) + + # Create algo + model = PPO('CnnPolicy', env, tensorboard_log=LOG_DIR, verbose=1, **model_params) + model.learn(total_timesteps=100000) + + # Evaluate model + mean_reward, _ = evaluate_policy(model, env, n_eval_episodes=30) + env.close() + + SAVE_PATH = os.path.join(OPT_DIR, 'trial_{}_best_model'.format(trial.number)) + model.save(SAVE_PATH) + + return mean_reward + + except Exception as e: + return -1 + +# Creating the experiment +study = optuna.create_study(direction='maximize') +study.optimize(optimize_agent, n_trials=10, n_jobs=1) + +print(study.best_params) +print(study.best_trial) diff --git a/001_image_stack/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc b/001_image_stack/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc deleted file mode 100644 index 5ab9e2fdde36a061ffa2bdb988c140b8d15a0920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3107 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 M7I@P9nzYIO2jjsUPXGV_ literal 0 HcmV?d00001 diff --git a/001_image_stack_vision_based_reward/check_reward.py b/001_image_stack_vision_based_reward/check_reward.py new file mode 100644 index 0000000..298cb6f --- /dev/null +++ b/001_image_stack_vision_based_reward/check_reward.py @@ -0,0 +1,39 @@ +import time + +import retro +from stable_baselines3 import PPO +from stable_baselines3.common.vec_env import DummyVecEnv + +from custom_cnn import CustomCNN +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +def make_env(game, state): + def _init(): + env = retro.RetroEnv( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env, testing=True) + return env + return _init + +game = "StreetFighterIISpecialChampionEdition-Genesis" +state = "Champion.Level1.ChunLiVsGuile" + +env = make_env(game, state)() +model = PPO.load(r"trained_models_continued/ppo_chunli_6048000_steps") +obs = env.reset() +done = False + +while not done: + timestamp = time.time() + action, _ = model.predict(obs) + obs, reward, done, info = env.step(action) + print(info) + if reward != 0: + print(reward, info['health'], info['enemy_health']) + env.render() + +env.close() \ No newline at end of file diff --git a/001_image_stack_vision_based_reward/custom_cnn.py b/001_image_stack_vision_based_reward/custom_cnn.py new file mode 100644 index 0000000..25c50ea --- /dev/null +++ b/001_image_stack_vision_based_reward/custom_cnn.py @@ -0,0 +1,24 @@ +import gym +import torch +import torch.nn as nn +from stable_baselines3.common.torch_layers import BaseFeaturesExtractor + +# Custom feature extractor (CNN) +class CustomCNN(BaseFeaturesExtractor): + def __init__(self, observation_space: gym.Space): + super(CustomCNN, self).__init__(observation_space, features_dim=512) + self.cnn = nn.Sequential( + nn.Conv2d(4, 32, kernel_size=5, stride=2, padding=0), + nn.ReLU(), + nn.Conv2d(32, 64, kernel_size=5, stride=2, padding=0), + nn.ReLU(), + nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=0), + nn.ReLU(), + nn.Flatten(), + nn.Linear(16384, self.features_dim), + nn.ReLU() + ) + + def forward(self, observations: torch.Tensor) -> torch.Tensor: + return self.cnn(observations) + \ No newline at end of file diff --git a/001_image_stack_vision_based_reward/evaluate.py b/001_image_stack_vision_based_reward/evaluate.py new file mode 100644 index 0000000..03da618 --- /dev/null +++ b/001_image_stack_vision_based_reward/evaluate.py @@ -0,0 +1,47 @@ +import retro + +from stable_baselines3 import PPO +from stable_baselines3.common.vec_env import DummyVecEnv +from stable_baselines3.common.monitor import Monitor +from stable_baselines3.common.evaluation import evaluate_policy + +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +def make_env(game, state): + def _init(): + env = retro.RetroEnv( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + return env + return _init + +game = "StreetFighterIISpecialChampionEdition-Genesis" +state_stages = [ + "Champion.Level1.ChunLiVsGuile", + "Champion.Level2.ChunLiVsKen", + "Champion.Level3.ChunLiVsChunLi", + "Champion.Level4.ChunLiVsZangief", + "Champion.Level5.ChunLiVsDhalsim", + "Champion.Level6.ChunLiVsRyu", + "Champion.Level7.ChunLiVsEHonda", + "Champion.Level8.ChunLiVsBlanka", + "Champion.Level9.ChunLiVsBalrog", + "Champion.Level10.ChunLiVsVega", + "Champion.Level11.ChunLiVsSagat", + "Champion.Level12.ChunLiVsBison" + # Add other stages as necessary +] + +env = make_env(game, state_stages[0])() + +# Wrap the environment +env = Monitor(env, 'logs/') +env = DummyVecEnv([lambda: env]) + +model = PPO.load('trained_models/ppo_chunli_1296000_steps') +mean_reward, std_reward = evaluate_policy(model, env, render=True, n_eval_episodes=10) +print(f"Mean reward: {mean_reward:.2f} +/- {std_reward:.2f}") \ No newline at end of file diff --git a/001_image_stack_vision_based_reward/logs/monitor.csv b/001_image_stack_vision_based_reward/logs/monitor.csv new file mode 100644 index 0000000..671bb3b --- /dev/null +++ b/001_image_stack_vision_based_reward/logs/monitor.csv @@ -0,0 +1,12 @@ +#{"t_start": 1680163278.6497958, "env_id": null} +r,l,t +-1115.766667,2842,13.829476 +-1115.766667,2842,22.367655 +-1115.766667,2842,32.010939 +-1115.766667,2842,41.401216 +-1115.766667,2842,50.451062 +-1115.766667,2842,59.522487 +-1115.766667,2842,68.723222 +-1115.766667,2842,78.205462 +-1115.766667,2842,88.455592 +-1115.766667,2842,97.656297 diff --git a/001_image_stack/street_fighter_custom_wrapper.py b/001_image_stack_vision_based_reward/street_fighter_custom_wrapper.py similarity index 96% rename from 001_image_stack/street_fighter_custom_wrapper.py rename to 001_image_stack_vision_based_reward/street_fighter_custom_wrapper.py index 5fd4d35..e2e4c53 100644 --- a/001_image_stack/street_fighter_custom_wrapper.py +++ b/001_image_stack_vision_based_reward/street_fighter_custom_wrapper.py @@ -12,8 +12,6 @@ class StreetFighterCustomWrapper(gym.Wrapper): def __init__(self, env, testing=False, threshold=0.65): super(StreetFighterCustomWrapper, self).__init__(env) - self.action_space = MultiBinary(12) - # Use a deque to store the last 4 frames self.frame_stack = collections.deque(maxlen=4) @@ -89,7 +87,7 @@ class StreetFighterCustomWrapper(gym.Wrapper): def step(self, action): # observation, _, _, info = self.env.step(action) - observation, _reward, _done, info = self.env.step(self.env.action_space.sample()) + observation, _reward, _done, info = self.env.step(action) custom_reward = self._get_reward() custom_reward -= 1.0 / 60.0 # penalty for each step (-1 points per second) diff --git a/001_image_stack/test.py b/001_image_stack_vision_based_reward/test.py similarity index 96% rename from 001_image_stack/test.py rename to 001_image_stack_vision_based_reward/test.py index 614b247..db08ae4 100644 --- a/001_image_stack/test.py +++ b/001_image_stack_vision_based_reward/test.py @@ -53,7 +53,7 @@ model = PPO( policy_kwargs=policy_kwargs, verbose=1 ) -model.load(r"trained_models_continued/ppo_chunli_432000_steps") +model.load(r"trained_models/ppo_chunli_1296000_steps") obs = env.reset() done = False diff --git a/001_image_stack/train.py b/001_image_stack_vision_based_reward/train.py similarity index 91% rename from 001_image_stack/train.py rename to 001_image_stack_vision_based_reward/train.py index 4e2195f..9861457 100644 --- a/001_image_stack/train.py +++ b/001_image_stack_vision_based_reward/train.py @@ -1,13 +1,9 @@ import os import random -import gym -import cv2 import retro -import numpy as np from stable_baselines3 import PPO from stable_baselines3.common.vec_env import SubprocVecEnv -from stable_baselines3.common.preprocessing import is_image_space, is_image_space_channels_first from stable_baselines3.common.callbacks import BaseCallback, CheckpointCallback from custom_cnn import CustomCNN @@ -77,20 +73,16 @@ def main(): verbose=1, n_steps=5400, batch_size=64, - n_epochs=10, learning_rate=0.0003, ent_coef=0.01, clip_range=0.2, - clip_range_vf=None, gamma=0.99, gae_lambda=0.95, - max_grad_norm=0.5, - use_sde=False, - sde_sample_freq=-1 + tensorboard_log="logs/" ) # Set the save directory - save_dir = "trained_models_continued" + save_dir = "trained_models_continued_new" os.makedirs(save_dir, exist_ok=True) # Load the model from file @@ -99,8 +91,7 @@ def main(): # Load model and modify the learning rate and entropy coefficient custom_objects = { - "learning_rate": 0.00005, - "ent_coef": 0.2 + "learning_rate": 0.0001 } model = PPO.load(model_path, env=env, device="cuda", custom_objects=custom_objects) @@ -110,7 +101,6 @@ def main(): checkpoint_callback = CheckpointCallback(save_freq=checkpoint_interval, save_path=save_dir, name_prefix="ppo_chunli") stage_increase_callback = RandomOpponentChangeCallback(state_stages, opponent_interval, save_dir) - model.learn( total_timesteps=int(6048000), # total_timesteps = stage_interval * num_envs * num_stages (1120 rounds) callback=[checkpoint_callback, stage_increase_callback] diff --git a/001_image_stack_vision_based_reward/trainging_log_continued.txt b/001_image_stack_vision_based_reward/trainging_log_continued.txt new file mode 100644 index 0000000..b299f62 --- /dev/null +++ b/001_image_stack_vision_based_reward/trainging_log_continued.txt @@ -0,0 +1,2791 @@ +(StreetFighterAI) PS C:\Users\unitec\Documents\AIProjects\street-fighter-ai\001_image_stack> python .\train.py +Using cuda device + +Current state: ChampionX.Level7.ChunLiVsBlanka +------------------------------ +| time/ | | +| fps | 1534 | +| iterations | 1 | +| time_elapsed | 28 | +| total_timesteps | 43200 | +------------------------------ + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 696 | +| iterations | 2 | +| time_elapsed | 123 | +| total_timesteps | 86400 | +| train/ | | +| approx_kl | 0.019640451 | +| clip_fraction | 0.222 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.731 | +| learning_rate | 0.0002 | +| loss | 0.529 | +| n_updates | 300 | +| policy_gradient_loss | 0.0037 | +| value_loss | 17.4 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +---------------------------------------- +| time/ | | +| fps | 587 | +| iterations | 3 | +| time_elapsed | 220 | +| total_timesteps | 129600 | +| train/ | | +| approx_kl | 0.01716586 | +| clip_fraction | 0.184 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.681 | +| learning_rate | 0.0002 | +| loss | 0.305 | +| n_updates | 310 | +| policy_gradient_loss | -0.00363 | +| value_loss | 12.6 | +---------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 545 | +| iterations | 4 | +| time_elapsed | 316 | +| total_timesteps | 172800 | +| train/ | | +| approx_kl | 0.017642297 | +| clip_fraction | 0.18 | +| clip_range | 0.2 | +| entropy_loss | -8.14 | +| explained_variance | 0.752 | +| learning_rate | 0.0002 | +| loss | 0.693 | +| n_updates | 320 | +| policy_gradient_loss | -0.0013 | +| value_loss | 15.3 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 523 | +| iterations | 5 | +| time_elapsed | 412 | +| total_timesteps | 216000 | +| train/ | | +| approx_kl | 0.016423995 | +| clip_fraction | 0.159 | +| clip_range | 0.2 | +| entropy_loss | -8.14 | +| explained_variance | 0.769 | +| learning_rate | 0.0002 | +| loss | 0.238 | +| n_updates | 330 | +| policy_gradient_loss | -0.00348 | +| value_loss | 17.4 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +---------------------------------------- +| time/ | | +| fps | 508 | +| iterations | 6 | +| time_elapsed | 509 | +| total_timesteps | 259200 | +| train/ | | +| approx_kl | 0.01582943 | +| clip_fraction | 0.155 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.734 | +| learning_rate | 0.0002 | +| loss | 0.688 | +| n_updates | 340 | +| policy_gradient_loss | -0.00491 | +| value_loss | 14.8 | +---------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 498 | +| iterations | 7 | +| time_elapsed | 606 | +| total_timesteps | 302400 | +| train/ | | +| approx_kl | 0.019045277 | +| clip_fraction | 0.176 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.778 | +| learning_rate | 0.0002 | +| loss | 0.729 | +| n_updates | 350 | +| policy_gradient_loss | -0.00323 | +| value_loss | 15.8 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 490 | +| iterations | 8 | +| time_elapsed | 705 | +| total_timesteps | 345600 | +| train/ | | +| approx_kl | 0.018350422 | +| clip_fraction | 0.177 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.789 | +| learning_rate | 0.0002 | +| loss | 1.17 | +| n_updates | 360 | +| policy_gradient_loss | -0.0043 | +| value_loss | 12.4 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 484 | +| iterations | 9 | +| time_elapsed | 802 | +| total_timesteps | 388800 | +| train/ | | +| approx_kl | 0.018348452 | +| clip_fraction | 0.183 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.797 | +| learning_rate | 0.0002 | +| loss | 1.45 | +| n_updates | 370 | +| policy_gradient_loss | -0.000873 | +| value_loss | 16 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 480 | +| iterations | 10 | +| time_elapsed | 899 | +| total_timesteps | 432000 | +| train/ | | +| approx_kl | 0.017740099 | +| clip_fraction | 0.175 | +| clip_range | 0.2 | +| entropy_loss | -8.14 | +| explained_variance | 0.81 | +| learning_rate | 0.0002 | +| loss | 0.596 | +| n_updates | 380 | +| policy_gradient_loss | -0.00329 | +| value_loss | 20.7 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 475 | +| iterations | 11 | +| time_elapsed | 998 | +| total_timesteps | 475200 | +| train/ | | +| approx_kl | 0.020382024 | +| clip_fraction | 0.204 | +| clip_range | 0.2 | +| entropy_loss | -8.14 | +| explained_variance | 0.783 | +| learning_rate | 0.0002 | +| loss | 0.51 | +| n_updates | 390 | +| policy_gradient_loss | -0.0046 | +| value_loss | 17.3 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +---------------------------------------- +| time/ | | +| fps | 473 | +| iterations | 12 | +| time_elapsed | 1095 | +| total_timesteps | 518400 | +| train/ | | +| approx_kl | 0.01975372 | +| clip_fraction | 0.192 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.78 | +| learning_rate | 0.0002 | +| loss | 0.59 | +| n_updates | 400 | +| policy_gradient_loss | -0.00151 | +| value_loss | 22.9 | +---------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 470 | +| iterations | 13 | +| time_elapsed | 1192 | +| total_timesteps | 561600 | +| train/ | | +| approx_kl | 0.019312538 | +| clip_fraction | 0.199 | +| clip_range | 0.2 | +| entropy_loss | -8.13 | +| explained_variance | 0.697 | +| learning_rate | 0.0002 | +| loss | 1.05 | +| n_updates | 410 | +| policy_gradient_loss | -0.000962 | +| value_loss | 21.6 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 468 | +| iterations | 14 | +| time_elapsed | 1290 | +| total_timesteps | 604800 | +| train/ | | +| approx_kl | 0.018606355 | +| clip_fraction | 0.189 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.742 | +| learning_rate | 0.0002 | +| loss | 0.385 | +| n_updates | 420 | +| policy_gradient_loss | -0.00191 | +| value_loss | 18.1 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 467 | +| iterations | 15 | +| time_elapsed | 1387 | +| total_timesteps | 648000 | +| train/ | | +| approx_kl | 0.017203132 | +| clip_fraction | 0.179 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.787 | +| learning_rate | 0.0002 | +| loss | 0.26 | +| n_updates | 430 | +| policy_gradient_loss | -0.0021 | +| value_loss | 15.2 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 465 | +| iterations | 16 | +| time_elapsed | 1484 | +| total_timesteps | 691200 | +| train/ | | +| approx_kl | 0.018841917 | +| clip_fraction | 0.184 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.791 | +| learning_rate | 0.0002 | +| loss | 0.811 | +| n_updates | 440 | +| policy_gradient_loss | -0.00263 | +| value_loss | 12.1 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 464 | +| iterations | 17 | +| time_elapsed | 1581 | +| total_timesteps | 734400 | +| train/ | | +| approx_kl | 0.016460957 | +| clip_fraction | 0.161 | +| clip_range | 0.2 | +| entropy_loss | -8.11 | +| explained_variance | 0.809 | +| learning_rate | 0.0002 | +| loss | 1.47 | +| n_updates | 450 | +| policy_gradient_loss | -0.00405 | +| value_loss | 17.5 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 463 | +| iterations | 18 | +| time_elapsed | 1678 | +| total_timesteps | 777600 | +| train/ | | +| approx_kl | 0.018824814 | +| clip_fraction | 0.187 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.766 | +| learning_rate | 0.0002 | +| loss | 0.312 | +| n_updates | 460 | +| policy_gradient_loss | -0.00269 | +| value_loss | 15.2 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 462 | +| iterations | 19 | +| time_elapsed | 1776 | +| total_timesteps | 820800 | +| train/ | | +| approx_kl | 0.017789861 | +| clip_fraction | 0.168 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.762 | +| learning_rate | 0.0002 | +| loss | 1.01 | +| n_updates | 470 | +| policy_gradient_loss | -0.00204 | +| value_loss | 16.2 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 461 | +| iterations | 20 | +| time_elapsed | 1872 | +| total_timesteps | 864000 | +| train/ | | +| approx_kl | 0.018345973 | +| clip_fraction | 0.173 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.79 | +| learning_rate | 0.0002 | +| loss | 0.736 | +| n_updates | 480 | +| policy_gradient_loss | -0.00369 | +| value_loss | 12.8 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +---------------------------------------- +| time/ | | +| fps | 460 | +| iterations | 21 | +| time_elapsed | 1969 | +| total_timesteps | 907200 | +| train/ | | +| approx_kl | 0.02151764 | +| clip_fraction | 0.192 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.782 | +| learning_rate | 0.0002 | +| loss | 0.267 | +| n_updates | 490 | +| policy_gradient_loss | -0.00102 | +| value_loss | 13.8 | +---------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 459 | +| iterations | 22 | +| time_elapsed | 2066 | +| total_timesteps | 950400 | +| train/ | | +| approx_kl | 0.021028183 | +| clip_fraction | 0.19 | +| clip_range | 0.2 | +| entropy_loss | -8.13 | +| explained_variance | 0.676 | +| learning_rate | 0.0002 | +| loss | 0.253 | +| n_updates | 500 | +| policy_gradient_loss | -0.00186 | +| value_loss | 20 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 459 | +| iterations | 23 | +| time_elapsed | 2163 | +| total_timesteps | 993600 | +| train/ | | +| approx_kl | 0.019285567 | +| clip_fraction | 0.18 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.729 | +| learning_rate | 0.0002 | +| loss | 0.329 | +| n_updates | 510 | +| policy_gradient_loss | -0.00156 | +| value_loss | 20.8 | +----------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 458 | +| iterations | 24 | +| time_elapsed | 2260 | +| total_timesteps | 1036800 | +| train/ | | +| approx_kl | 0.019038767 | +| clip_fraction | 0.195 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.665 | +| learning_rate | 0.0002 | +| loss | 0.685 | +| n_updates | 520 | +| policy_gradient_loss | -0.000273 | +| value_loss | 15.8 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 458 | +| iterations | 25 | +| time_elapsed | 2357 | +| total_timesteps | 1080000 | +| train/ | | +| approx_kl | 0.020219645 | +| clip_fraction | 0.192 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.776 | +| learning_rate | 0.0002 | +| loss | 1.49 | +| n_updates | 530 | +| policy_gradient_loss | -0.00111 | +| value_loss | 21.8 | +----------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 457 | +| iterations | 26 | +| time_elapsed | 2455 | +| total_timesteps | 1123200 | +| train/ | | +| approx_kl | 0.018398428 | +| clip_fraction | 0.179 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.784 | +| learning_rate | 0.0002 | +| loss | 0.225 | +| n_updates | 540 | +| policy_gradient_loss | -0.00625 | +| value_loss | 12.3 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +---------------------------------------- +| time/ | | +| fps | 456 | +| iterations | 27 | +| time_elapsed | 2552 | +| total_timesteps | 1166400 | +| train/ | | +| approx_kl | 0.02056862 | +| clip_fraction | 0.178 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.718 | +| learning_rate | 0.0002 | +| loss | 0.265 | +| n_updates | 550 | +| policy_gradient_loss | -0.00118 | +| value_loss | 21.3 | +---------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 456 | +| iterations | 28 | +| time_elapsed | 2649 | +| total_timesteps | 1209600 | +| train/ | | +| approx_kl | 0.018739836 | +| clip_fraction | 0.182 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.786 | +| learning_rate | 0.0002 | +| loss | 0.562 | +| n_updates | 560 | +| policy_gradient_loss | -0.00141 | +| value_loss | 16.7 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 456 | +| iterations | 29 | +| time_elapsed | 2747 | +| total_timesteps | 1252800 | +| train/ | | +| approx_kl | 0.019046063 | +| clip_fraction | 0.178 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.77 | +| learning_rate | 0.0002 | +| loss | 0.655 | +| n_updates | 570 | +| policy_gradient_loss | -0.00238 | +| value_loss | 19 | +----------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 455 | +| iterations | 30 | +| time_elapsed | 2845 | +| total_timesteps | 1296000 | +| train/ | | +| approx_kl | 0.017575732 | +| clip_fraction | 0.181 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.763 | +| learning_rate | 0.0002 | +| loss | 0.461 | +| n_updates | 580 | +| policy_gradient_loss | -0.00471 | +| value_loss | 12.1 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 455 | +| iterations | 31 | +| time_elapsed | 2942 | +| total_timesteps | 1339200 | +| train/ | | +| approx_kl | 0.020356499 | +| clip_fraction | 0.179 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.772 | +| learning_rate | 0.0002 | +| loss | 1.84 | +| n_updates | 590 | +| policy_gradient_loss | -0.00473 | +| value_loss | 11.5 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +---------------------------------------- +| time/ | | +| fps | 454 | +| iterations | 32 | +| time_elapsed | 3039 | +| total_timesteps | 1382400 | +| train/ | | +| approx_kl | 0.02154484 | +| clip_fraction | 0.186 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.82 | +| learning_rate | 0.0002 | +| loss | 2.06 | +| n_updates | 600 | +| policy_gradient_loss | 0.00338 | +| value_loss | 23.1 | +---------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 454 | +| iterations | 33 | +| time_elapsed | 3137 | +| total_timesteps | 1425600 | +| train/ | | +| approx_kl | 0.022631256 | +| clip_fraction | 0.196 | +| clip_range | 0.2 | +| entropy_loss | -8.03 | +| explained_variance | 0.81 | +| learning_rate | 0.0002 | +| loss | 0.664 | +| n_updates | 610 | +| policy_gradient_loss | 0.0058 | +| value_loss | 21.7 | +----------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 454 | +| iterations | 34 | +| time_elapsed | 3234 | +| total_timesteps | 1468800 | +| train/ | | +| approx_kl | 0.019701418 | +| clip_fraction | 0.172 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.833 | +| learning_rate | 0.0002 | +| loss | 2.15 | +| n_updates | 620 | +| policy_gradient_loss | 0.00112 | +| value_loss | 22.3 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 453 | +| iterations | 35 | +| time_elapsed | 3332 | +| total_timesteps | 1512000 | +| train/ | | +| approx_kl | 0.020245243 | +| clip_fraction | 0.183 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.815 | +| learning_rate | 0.0002 | +| loss | 0.494 | +| n_updates | 630 | +| policy_gradient_loss | -0.00146 | +| value_loss | 13.8 | +----------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 453 | +| iterations | 36 | +| time_elapsed | 3430 | +| total_timesteps | 1555200 | +| train/ | | +| approx_kl | 0.022184841 | +| clip_fraction | 0.187 | +| clip_range | 0.2 | +| entropy_loss | -8.02 | +| explained_variance | 0.761 | +| learning_rate | 0.0002 | +| loss | 0.232 | +| n_updates | 640 | +| policy_gradient_loss | 0.00242 | +| value_loss | 18.8 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +---------------------------------------- +| time/ | | +| fps | 453 | +| iterations | 37 | +| time_elapsed | 3526 | +| total_timesteps | 1598400 | +| train/ | | +| approx_kl | 0.01909801 | +| clip_fraction | 0.172 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.82 | +| learning_rate | 0.0002 | +| loss | 1.39 | +| n_updates | 650 | +| policy_gradient_loss | 0.00125 | +| value_loss | 18.5 | +---------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 453 | +| iterations | 38 | +| time_elapsed | 3623 | +| total_timesteps | 1641600 | +| train/ | | +| approx_kl | 0.019127825 | +| clip_fraction | 0.175 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.796 | +| learning_rate | 0.0002 | +| loss | 0.646 | +| n_updates | 660 | +| policy_gradient_loss | -0.0033 | +| value_loss | 15 | +----------------------------------------- + +Current state: ChampionX.Level2.ChunLiVsChunLi +----------------------------------------- +| time/ | | +| fps | 452 | +| iterations | 39 | +| time_elapsed | 3720 | +| total_timesteps | 1684800 | +| train/ | | +| approx_kl | 0.018327592 | +| clip_fraction | 0.179 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.718 | +| learning_rate | 0.0002 | +| loss | 0.905 | +| n_updates | 670 | +| policy_gradient_loss | 0.000898 | +| value_loss | 14.6 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 452 | +| iterations | 40 | +| time_elapsed | 3818 | +| total_timesteps | 1728000 | +| train/ | | +| approx_kl | 0.019133803 | +| clip_fraction | 0.173 | +| clip_range | 0.2 | +| entropy_loss | -8.03 | +| explained_variance | 0.839 | +| learning_rate | 0.0002 | +| loss | 0.95 | +| n_updates | 680 | +| policy_gradient_loss | -0.00206 | +| value_loss | 17.9 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 452 | +| iterations | 41 | +| time_elapsed | 3916 | +| total_timesteps | 1771200 | +| train/ | | +| approx_kl | 0.021123584 | +| clip_fraction | 0.202 | +| clip_range | 0.2 | +| entropy_loss | -8.06 | +| explained_variance | 0.775 | +| learning_rate | 0.0002 | +| loss | 0.615 | +| n_updates | 690 | +| policy_gradient_loss | 0.000314 | +| value_loss | 14 | +----------------------------------------- + +Current state: ChampionX.Level2.ChunLiVsChunLi +----------------------------------------- +| time/ | | +| fps | 452 | +| iterations | 42 | +| time_elapsed | 4013 | +| total_timesteps | 1814400 | +| train/ | | +| approx_kl | 0.018802634 | +| clip_fraction | 0.164 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.811 | +| learning_rate | 0.0002 | +| loss | 0.295 | +| n_updates | 700 | +| policy_gradient_loss | 0.00141 | +| value_loss | 19.3 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +---------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 43 | +| time_elapsed | 4109 | +| total_timesteps | 1857600 | +| train/ | | +| approx_kl | 0.01865595 | +| clip_fraction | 0.169 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.818 | +| learning_rate | 0.0002 | +| loss | 0.357 | +| n_updates | 710 | +| policy_gradient_loss | 0.000324 | +| value_loss | 19.1 | +---------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 44 | +| time_elapsed | 4205 | +| total_timesteps | 1900800 | +| train/ | | +| approx_kl | 0.022585243 | +| clip_fraction | 0.195 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.768 | +| learning_rate | 0.0002 | +| loss | 0.515 | +| n_updates | 720 | +| policy_gradient_loss | 0.00268 | +| value_loss | 18.3 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 45 | +| time_elapsed | 4301 | +| total_timesteps | 1944000 | +| train/ | | +| approx_kl | 0.020417377 | +| clip_fraction | 0.173 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.683 | +| learning_rate | 0.0002 | +| loss | 0.654 | +| n_updates | 730 | +| policy_gradient_loss | 0.00203 | +| value_loss | 20.7 | +----------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +---------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 46 | +| time_elapsed | 4397 | +| total_timesteps | 1987200 | +| train/ | | +| approx_kl | 0.01640241 | +| clip_fraction | 0.136 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.855 | +| learning_rate | 0.0002 | +| loss | 0.681 | +| n_updates | 740 | +| policy_gradient_loss | -0.00244 | +| value_loss | 18.1 | +---------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 47 | +| time_elapsed | 4492 | +| total_timesteps | 2030400 | +| train/ | | +| approx_kl | 0.020942345 | +| clip_fraction | 0.155 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.799 | +| learning_rate | 0.0002 | +| loss | 0.847 | +| n_updates | 750 | +| policy_gradient_loss | 0.00232 | +| value_loss | 20.4 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +---------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 48 | +| time_elapsed | 4588 | +| total_timesteps | 2073600 | +| train/ | | +| approx_kl | 0.02003836 | +| clip_fraction | 0.168 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.815 | +| learning_rate | 0.0002 | +| loss | 0.501 | +| n_updates | 760 | +| policy_gradient_loss | -0.0017 | +| value_loss | 13.2 | +---------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 49 | +| time_elapsed | 4684 | +| total_timesteps | 2116800 | +| train/ | | +| approx_kl | 0.022403738 | +| clip_fraction | 0.173 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.735 | +| learning_rate | 0.0002 | +| loss | 4.1 | +| n_updates | 770 | +| policy_gradient_loss | 0.00325 | +| value_loss | 35.2 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 50 | +| time_elapsed | 4780 | +| total_timesteps | 2160000 | +| train/ | | +| approx_kl | 0.020465719 | +| clip_fraction | 0.171 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.814 | +| learning_rate | 0.0002 | +| loss | 0.346 | +| n_updates | 780 | +| policy_gradient_loss | 0.00119 | +| value_loss | 18.8 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 51 | +| time_elapsed | 4877 | +| total_timesteps | 2203200 | +| train/ | | +| approx_kl | 0.019918704 | +| clip_fraction | 0.163 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.823 | +| learning_rate | 0.0002 | +| loss | 0.223 | +| n_updates | 790 | +| policy_gradient_loss | -0.0011 | +| value_loss | 16 | +----------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 52 | +| time_elapsed | 4973 | +| total_timesteps | 2246400 | +| train/ | | +| approx_kl | 0.026293177 | +| clip_fraction | 0.189 | +| clip_range | 0.2 | +| entropy_loss | -8.01 | +| explained_variance | 0.786 | +| learning_rate | 0.0002 | +| loss | 1.37 | +| n_updates | 800 | +| policy_gradient_loss | 0.00725 | +| value_loss | 21.2 | +----------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 53 | +| time_elapsed | 5068 | +| total_timesteps | 2289600 | +| train/ | | +| approx_kl | 0.018323697 | +| clip_fraction | 0.159 | +| clip_range | 0.2 | +| entropy_loss | -8.06 | +| explained_variance | 0.822 | +| learning_rate | 0.0002 | +| loss | 1.02 | +| n_updates | 810 | +| policy_gradient_loss | 0.000499 | +| value_loss | 17.8 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 54 | +| time_elapsed | 5164 | +| total_timesteps | 2332800 | +| train/ | | +| approx_kl | 0.022256708 | +| clip_fraction | 0.186 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.781 | +| learning_rate | 0.0002 | +| loss | 0.717 | +| n_updates | 820 | +| policy_gradient_loss | 0.00159 | +| value_loss | 16.5 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 55 | +| time_elapsed | 5260 | +| total_timesteps | 2376000 | +| train/ | | +| approx_kl | 0.020457426 | +| clip_fraction | 0.177 | +| clip_range | 0.2 | +| entropy_loss | -7.99 | +| explained_variance | 0.791 | +| learning_rate | 0.0002 | +| loss | 2.93 | +| n_updates | 830 | +| policy_gradient_loss | -0.00147 | +| value_loss | 17.3 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +--------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 56 | +| time_elapsed | 5356 | +| total_timesteps | 2419200 | +| train/ | | +| approx_kl | 0.0213855 | +| clip_fraction | 0.178 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.728 | +| learning_rate | 0.0002 | +| loss | 0.302 | +| n_updates | 840 | +| policy_gradient_loss | 0.00053 | +| value_loss | 17.1 | +--------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 57 | +| time_elapsed | 5451 | +| total_timesteps | 2462400 | +| train/ | | +| approx_kl | 0.021137744 | +| clip_fraction | 0.173 | +| clip_range | 0.2 | +| entropy_loss | -8.08 | +| explained_variance | 0.788 | +| learning_rate | 0.0002 | +| loss | 0.303 | +| n_updates | 850 | +| policy_gradient_loss | -0.00111 | +| value_loss | 14.6 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +---------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 58 | +| time_elapsed | 5547 | +| total_timesteps | 2505600 | +| train/ | | +| approx_kl | 0.02023245 | +| clip_fraction | 0.169 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.816 | +| learning_rate | 0.0002 | +| loss | 0.361 | +| n_updates | 860 | +| policy_gradient_loss | 0.000275 | +| value_loss | 16.8 | +---------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 59 | +| time_elapsed | 5643 | +| total_timesteps | 2548800 | +| train/ | | +| approx_kl | 0.019979084 | +| clip_fraction | 0.175 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.791 | +| learning_rate | 0.0002 | +| loss | 0.204 | +| n_updates | 870 | +| policy_gradient_loss | -0.00152 | +| value_loss | 12.4 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +---------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 60 | +| time_elapsed | 5740 | +| total_timesteps | 2592000 | +| train/ | | +| approx_kl | 0.02290177 | +| clip_fraction | 0.189 | +| clip_range | 0.2 | +| entropy_loss | -8.06 | +| explained_variance | 0.744 | +| learning_rate | 0.0002 | +| loss | 0.599 | +| n_updates | 880 | +| policy_gradient_loss | 0.00403 | +| value_loss | 22.4 | +---------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 61 | +| time_elapsed | 5837 | +| total_timesteps | 2635200 | +| train/ | | +| approx_kl | 0.019065047 | +| clip_fraction | 0.172 | +| clip_range | 0.2 | +| entropy_loss | -8.06 | +| explained_variance | 0.736 | +| learning_rate | 0.0002 | +| loss | 0.933 | +| n_updates | 890 | +| policy_gradient_loss | -0.000417 | +| value_loss | 20.4 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 62 | +| time_elapsed | 5935 | +| total_timesteps | 2678400 | +| train/ | | +| approx_kl | 0.018739864 | +| clip_fraction | 0.173 | +| clip_range | 0.2 | +| entropy_loss | -8.08 | +| explained_variance | 0.818 | +| learning_rate | 0.0002 | +| loss | 1.44 | +| n_updates | 900 | +| policy_gradient_loss | -0.002 | +| value_loss | 15.5 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +---------------------------------------- +| time/ | | +| fps | 451 | +| iterations | 63 | +| time_elapsed | 6032 | +| total_timesteps | 2721600 | +| train/ | | +| approx_kl | 0.02123648 | +| clip_fraction | 0.172 | +| clip_range | 0.2 | +| entropy_loss | -8.03 | +| explained_variance | 0.82 | +| learning_rate | 0.0002 | +| loss | 0.792 | +| n_updates | 910 | +| policy_gradient_loss | 8.58e-05 | +| value_loss | 16 | +---------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 64 | +| time_elapsed | 6130 | +| total_timesteps | 2764800 | +| train/ | | +| approx_kl | 0.024432074 | +| clip_fraction | 0.209 | +| clip_range | 0.2 | +| entropy_loss | -7.99 | +| explained_variance | 0.829 | +| learning_rate | 0.0002 | +| loss | 0.864 | +| n_updates | 920 | +| policy_gradient_loss | 0.00649 | +| value_loss | 20 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 65 | +| time_elapsed | 6228 | +| total_timesteps | 2808000 | +| train/ | | +| approx_kl | 0.022781633 | +| clip_fraction | 0.184 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.78 | +| learning_rate | 0.0002 | +| loss | 2.75 | +| n_updates | 930 | +| policy_gradient_loss | 0.00143 | +| value_loss | 16.6 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 66 | +| time_elapsed | 6327 | +| total_timesteps | 2851200 | +| train/ | | +| approx_kl | 0.020004842 | +| clip_fraction | 0.165 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.784 | +| learning_rate | 0.0002 | +| loss | 0.68 | +| n_updates | 940 | +| policy_gradient_loss | -0.000158 | +| value_loss | 24.8 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 67 | +| time_elapsed | 6425 | +| total_timesteps | 2894400 | +| train/ | | +| approx_kl | 0.019052736 | +| clip_fraction | 0.177 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.801 | +| learning_rate | 0.0002 | +| loss | 0.805 | +| n_updates | 950 | +| policy_gradient_loss | -0.00147 | +| value_loss | 16.7 | +----------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 68 | +| time_elapsed | 6522 | +| total_timesteps | 2937600 | +| train/ | | +| approx_kl | 0.018338915 | +| clip_fraction | 0.166 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.824 | +| learning_rate | 0.0002 | +| loss | 0.278 | +| n_updates | 960 | +| policy_gradient_loss | -0.00394 | +| value_loss | 14.7 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 69 | +| time_elapsed | 6619 | +| total_timesteps | 2980800 | +| train/ | | +| approx_kl | 0.022207119 | +| clip_fraction | 0.203 | +| clip_range | 0.2 | +| entropy_loss | -8.03 | +| explained_variance | 0.777 | +| learning_rate | 0.0002 | +| loss | 1.76 | +| n_updates | 970 | +| policy_gradient_loss | 0.00349 | +| value_loss | 21.1 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 70 | +| time_elapsed | 6717 | +| total_timesteps | 3024000 | +| train/ | | +| approx_kl | 0.023251278 | +| clip_fraction | 0.207 | +| clip_range | 0.2 | +| entropy_loss | -8 | +| explained_variance | 0.769 | +| learning_rate | 0.0002 | +| loss | 0.308 | +| n_updates | 980 | +| policy_gradient_loss | 0.00178 | +| value_loss | 16.2 | +----------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 450 | +| iterations | 71 | +| time_elapsed | 6815 | +| total_timesteps | 3067200 | +| train/ | | +| approx_kl | 0.018753793 | +| clip_fraction | 0.166 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.772 | +| learning_rate | 0.0002 | +| loss | 1.91 | +| n_updates | 990 | +| policy_gradient_loss | 0.000509 | +| value_loss | 20 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 72 | +| time_elapsed | 6913 | +| total_timesteps | 3110400 | +| train/ | | +| approx_kl | 0.018791752 | +| clip_fraction | 0.185 | +| clip_range | 0.2 | +| entropy_loss | -8.01 | +| explained_variance | 0.716 | +| learning_rate | 0.0002 | +| loss | 0.526 | +| n_updates | 1000 | +| policy_gradient_loss | 0.00248 | +| value_loss | 17.2 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +---------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 73 | +| time_elapsed | 7011 | +| total_timesteps | 3153600 | +| train/ | | +| approx_kl | 0.02178302 | +| clip_fraction | 0.18 | +| clip_range | 0.2 | +| entropy_loss | -8.03 | +| explained_variance | 0.675 | +| learning_rate | 0.0002 | +| loss | 2.77 | +| n_updates | 1010 | +| policy_gradient_loss | 0.00759 | +| value_loss | 30.3 | +---------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 74 | +| time_elapsed | 7108 | +| total_timesteps | 3196800 | +| train/ | | +| approx_kl | 0.019278381 | +| clip_fraction | 0.171 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.748 | +| learning_rate | 0.0002 | +| loss | 0.566 | +| n_updates | 1020 | +| policy_gradient_loss | 0.000132 | +| value_loss | 15.9 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 75 | +| time_elapsed | 7206 | +| total_timesteps | 3240000 | +| train/ | | +| approx_kl | 0.018280571 | +| clip_fraction | 0.153 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.716 | +| learning_rate | 0.0002 | +| loss | 2.45 | +| n_updates | 1030 | +| policy_gradient_loss | 0.000711 | +| value_loss | 23.1 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 76 | +| time_elapsed | 7303 | +| total_timesteps | 3283200 | +| train/ | | +| approx_kl | 0.017658442 | +| clip_fraction | 0.154 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.838 | +| learning_rate | 0.0002 | +| loss | 1.92 | +| n_updates | 1040 | +| policy_gradient_loss | 0.000735 | +| value_loss | 20 | +----------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 77 | +| time_elapsed | 7401 | +| total_timesteps | 3326400 | +| train/ | | +| approx_kl | 0.019725492 | +| clip_fraction | 0.176 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.791 | +| learning_rate | 0.0002 | +| loss | 2.38 | +| n_updates | 1050 | +| policy_gradient_loss | 0.00148 | +| value_loss | 28.7 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 78 | +| time_elapsed | 7498 | +| total_timesteps | 3369600 | +| train/ | | +| approx_kl | 0.016949095 | +| clip_fraction | 0.152 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.784 | +| learning_rate | 0.0002 | +| loss | 0.878 | +| n_updates | 1060 | +| policy_gradient_loss | -0.00178 | +| value_loss | 19.1 | +----------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +---------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 79 | +| time_elapsed | 7596 | +| total_timesteps | 3412800 | +| train/ | | +| approx_kl | 0.02026636 | +| clip_fraction | 0.181 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.775 | +| learning_rate | 0.0002 | +| loss | 3.35 | +| n_updates | 1070 | +| policy_gradient_loss | 0.000907 | +| value_loss | 15 | +---------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 80 | +| time_elapsed | 7693 | +| total_timesteps | 3456000 | +| train/ | | +| approx_kl | 0.020292694 | +| clip_fraction | 0.172 | +| clip_range | 0.2 | +| entropy_loss | -8.08 | +| explained_variance | 0.729 | +| learning_rate | 0.0002 | +| loss | 0.937 | +| n_updates | 1080 | +| policy_gradient_loss | -0.000479 | +| value_loss | 14.2 | +----------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 81 | +| time_elapsed | 7790 | +| total_timesteps | 3499200 | +| train/ | | +| approx_kl | 0.021046823 | +| clip_fraction | 0.17 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.814 | +| learning_rate | 0.0002 | +| loss | 1.19 | +| n_updates | 1090 | +| policy_gradient_loss | 0.00343 | +| value_loss | 21.8 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 82 | +| time_elapsed | 7888 | +| total_timesteps | 3542400 | +| train/ | | +| approx_kl | 0.018265078 | +| clip_fraction | 0.16 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.771 | +| learning_rate | 0.0002 | +| loss | 1.41 | +| n_updates | 1100 | +| policy_gradient_loss | -0.00154 | +| value_loss | 17.9 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +---------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 83 | +| time_elapsed | 7986 | +| total_timesteps | 3585600 | +| train/ | | +| approx_kl | 0.01761453 | +| clip_fraction | 0.156 | +| clip_range | 0.2 | +| entropy_loss | -8.08 | +| explained_variance | 0.848 | +| learning_rate | 0.0002 | +| loss | 1.5 | +| n_updates | 1110 | +| policy_gradient_loss | 4e-05 | +| value_loss | 22.4 | +---------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 84 | +| time_elapsed | 8083 | +| total_timesteps | 3628800 | +| train/ | | +| approx_kl | 0.019479048 | +| clip_fraction | 0.167 | +| clip_range | 0.2 | +| entropy_loss | -8.13 | +| explained_variance | 0.782 | +| learning_rate | 0.0002 | +| loss | 2.93 | +| n_updates | 1120 | +| policy_gradient_loss | -0.00179 | +| value_loss | 16.4 | +----------------------------------------- + +Current state: ChampionX.Level4.ChunLiVsDhalsim +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 85 | +| time_elapsed | 8180 | +| total_timesteps | 3672000 | +| train/ | | +| approx_kl | 0.017283197 | +| clip_fraction | 0.149 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.791 | +| learning_rate | 0.0002 | +| loss | 1.54 | +| n_updates | 1130 | +| policy_gradient_loss | -0.00178 | +| value_loss | 20.1 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 86 | +| time_elapsed | 8278 | +| total_timesteps | 3715200 | +| train/ | | +| approx_kl | 0.019106768 | +| clip_fraction | 0.178 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.787 | +| learning_rate | 0.0002 | +| loss | 4.53 | +| n_updates | 1140 | +| policy_gradient_loss | 0.00461 | +| value_loss | 25.3 | +----------------------------------------- + +Current state: ChampionX.Level2.ChunLiVsChunLi +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 87 | +| time_elapsed | 8376 | +| total_timesteps | 3758400 | +| train/ | | +| approx_kl | 0.019611303 | +| clip_fraction | 0.182 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.782 | +| learning_rate | 0.0002 | +| loss | 1.7 | +| n_updates | 1150 | +| policy_gradient_loss | 0.000516 | +| value_loss | 16.3 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 88 | +| time_elapsed | 8473 | +| total_timesteps | 3801600 | +| train/ | | +| approx_kl | 0.017416934 | +| clip_fraction | 0.168 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.773 | +| learning_rate | 0.0002 | +| loss | 2.32 | +| n_updates | 1160 | +| policy_gradient_loss | 0.000683 | +| value_loss | 26.5 | +----------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 89 | +| time_elapsed | 8570 | +| total_timesteps | 3844800 | +| train/ | | +| approx_kl | 0.020442067 | +| clip_fraction | 0.18 | +| clip_range | 0.2 | +| entropy_loss | -8.11 | +| explained_variance | 0.799 | +| learning_rate | 0.0002 | +| loss | 0.598 | +| n_updates | 1170 | +| policy_gradient_loss | 0.00176 | +| value_loss | 15 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 90 | +| time_elapsed | 8668 | +| total_timesteps | 3888000 | +| train/ | | +| approx_kl | 0.017660897 | +| clip_fraction | 0.159 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.795 | +| learning_rate | 0.0002 | +| loss | 0.928 | +| n_updates | 1180 | +| policy_gradient_loss | 0.00123 | +| value_loss | 17.6 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 91 | +| time_elapsed | 8766 | +| total_timesteps | 3931200 | +| train/ | | +| approx_kl | 0.016381918 | +| clip_fraction | 0.163 | +| clip_range | 0.2 | +| entropy_loss | -8.06 | +| explained_variance | 0.811 | +| learning_rate | 0.0002 | +| loss | 0.488 | +| n_updates | 1190 | +| policy_gradient_loss | 0.000215 | +| value_loss | 13.9 | +----------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 92 | +| time_elapsed | 8863 | +| total_timesteps | 3974400 | +| train/ | | +| approx_kl | 0.017840233 | +| clip_fraction | 0.167 | +| clip_range | 0.2 | +| entropy_loss | -8.03 | +| explained_variance | 0.762 | +| learning_rate | 0.0002 | +| loss | 0.54 | +| n_updates | 1200 | +| policy_gradient_loss | 0.00261 | +| value_loss | 20.3 | +----------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 93 | +| time_elapsed | 8961 | +| total_timesteps | 4017600 | +| train/ | | +| approx_kl | 0.020303266 | +| clip_fraction | 0.16 | +| clip_range | 0.2 | +| entropy_loss | -8.05 | +| explained_variance | 0.782 | +| learning_rate | 0.0002 | +| loss | 0.876 | +| n_updates | 1210 | +| policy_gradient_loss | 0.00217 | +| value_loss | 19.1 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 94 | +| time_elapsed | 9058 | +| total_timesteps | 4060800 | +| train/ | | +| approx_kl | 0.018209128 | +| clip_fraction | 0.158 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.827 | +| learning_rate | 0.0002 | +| loss | 0.47 | +| n_updates | 1220 | +| policy_gradient_loss | 0.00344 | +| value_loss | 22.1 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 95 | +| time_elapsed | 9155 | +| total_timesteps | 4104000 | +| train/ | | +| approx_kl | 0.016349936 | +| clip_fraction | 0.16 | +| clip_range | 0.2 | +| entropy_loss | -8.07 | +| explained_variance | 0.816 | +| learning_rate | 0.0002 | +| loss | 0.436 | +| n_updates | 1230 | +| policy_gradient_loss | -0.00384 | +| value_loss | 12.7 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 96 | +| time_elapsed | 9253 | +| total_timesteps | 4147200 | +| train/ | | +| approx_kl | 0.016977612 | +| clip_fraction | 0.148 | +| clip_range | 0.2 | +| entropy_loss | -8.09 | +| explained_variance | 0.807 | +| learning_rate | 0.0002 | +| loss | 0.708 | +| n_updates | 1240 | +| policy_gradient_loss | 0.000471 | +| value_loss | 20.7 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 97 | +| time_elapsed | 9349 | +| total_timesteps | 4190400 | +| train/ | | +| approx_kl | 0.020063082 | +| clip_fraction | 0.177 | +| clip_range | 0.2 | +| entropy_loss | -8.11 | +| explained_variance | 0.751 | +| learning_rate | 0.0002 | +| loss | 0.891 | +| n_updates | 1250 | +| policy_gradient_loss | 0.00348 | +| value_loss | 21.2 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 98 | +| time_elapsed | 9445 | +| total_timesteps | 4233600 | +| train/ | | +| approx_kl | 0.019297507 | +| clip_fraction | 0.163 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.773 | +| learning_rate | 0.0002 | +| loss | 0.771 | +| n_updates | 1260 | +| policy_gradient_loss | 0.0029 | +| value_loss | 15.1 | +----------------------------------------- + +Current state: ChampionX.Level11.ChunLiVsSagat +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 99 | +| time_elapsed | 9540 | +| total_timesteps | 4276800 | +| train/ | | +| approx_kl | 0.017202292 | +| clip_fraction | 0.154 | +| clip_range | 0.2 | +| entropy_loss | -8.08 | +| explained_variance | 0.818 | +| learning_rate | 0.0002 | +| loss | 1.97 | +| n_updates | 1270 | +| policy_gradient_loss | 0.00314 | +| value_loss | 22.2 | +----------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 100 | +| time_elapsed | 9635 | +| total_timesteps | 4320000 | +| train/ | | +| approx_kl | 0.019228933 | +| clip_fraction | 0.172 | +| clip_range | 0.2 | +| entropy_loss | -8.04 | +| explained_variance | 0.803 | +| learning_rate | 0.0002 | +| loss | 1.84 | +| n_updates | 1280 | +| policy_gradient_loss | 0.00495 | +| value_loss | 27.9 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +---------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 101 | +| time_elapsed | 9732 | +| total_timesteps | 4363200 | +| train/ | | +| approx_kl | 0.01626399 | +| clip_fraction | 0.148 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.863 | +| learning_rate | 0.0002 | +| loss | 1.23 | +| n_updates | 1290 | +| policy_gradient_loss | -0.000295 | +| value_loss | 18.7 | +---------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +---------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 102 | +| time_elapsed | 9827 | +| total_timesteps | 4406400 | +| train/ | | +| approx_kl | 0.01741675 | +| clip_fraction | 0.167 | +| clip_range | 0.2 | +| entropy_loss | -8.06 | +| explained_variance | 0.81 | +| learning_rate | 0.0002 | +| loss | 0.693 | +| n_updates | 1300 | +| policy_gradient_loss | 0.00085 | +| value_loss | 16.9 | +---------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 103 | +| time_elapsed | 9922 | +| total_timesteps | 4449600 | +| train/ | | +| approx_kl | 0.017767375 | +| clip_fraction | 0.146 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.782 | +| learning_rate | 0.0002 | +| loss | 0.44 | +| n_updates | 1310 | +| policy_gradient_loss | 0.000446 | +| value_loss | 16.6 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 104 | +| time_elapsed | 10018 | +| total_timesteps | 4492800 | +| train/ | | +| approx_kl | 0.018537082 | +| clip_fraction | 0.177 | +| clip_range | 0.2 | +| entropy_loss | -8.06 | +| explained_variance | 0.782 | +| learning_rate | 0.0002 | +| loss | 0.594 | +| n_updates | 1320 | +| policy_gradient_loss | 0.00192 | +| value_loss | 16.5 | +----------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 105 | +| time_elapsed | 10113 | +| total_timesteps | 4536000 | +| train/ | | +| approx_kl | 0.016387263 | +| clip_fraction | 0.151 | +| clip_range | 0.2 | +| entropy_loss | -8.08 | +| explained_variance | 0.779 | +| learning_rate | 0.0002 | +| loss | 0.897 | +| n_updates | 1330 | +| policy_gradient_loss | 0.00349 | +| value_loss | 24 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 106 | +| time_elapsed | 10208 | +| total_timesteps | 4579200 | +| train/ | | +| approx_kl | 0.016566757 | +| clip_fraction | 0.168 | +| clip_range | 0.2 | +| entropy_loss | -8.1 | +| explained_variance | 0.826 | +| learning_rate | 0.0002 | +| loss | 0.545 | +| n_updates | 1340 | +| policy_gradient_loss | 0.00131 | +| value_loss | 16.9 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 107 | +| time_elapsed | 10304 | +| total_timesteps | 4622400 | +| train/ | | +| approx_kl | 0.015347375 | +| clip_fraction | 0.159 | +| clip_range | 0.2 | +| entropy_loss | -8.08 | +| explained_variance | 0.81 | +| learning_rate | 0.0002 | +| loss | 0.311 | +| n_updates | 1350 | +| policy_gradient_loss | -0.00268 | +| value_loss | 12.9 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 108 | +| time_elapsed | 10400 | +| total_timesteps | 4665600 | +| train/ | | +| approx_kl | 0.016015483 | +| clip_fraction | 0.155 | +| clip_range | 0.2 | +| entropy_loss | -8.11 | +| explained_variance | 0.797 | +| learning_rate | 0.0002 | +| loss | 2.26 | +| n_updates | 1360 | +| policy_gradient_loss | -0.00208 | +| value_loss | 20.3 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 109 | +| time_elapsed | 10495 | +| total_timesteps | 4708800 | +| train/ | | +| approx_kl | 0.016567804 | +| clip_fraction | 0.155 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.829 | +| learning_rate | 0.0002 | +| loss | 1.34 | +| n_updates | 1370 | +| policy_gradient_loss | 0.0028 | +| value_loss | 17.5 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 110 | +| time_elapsed | 10591 | +| total_timesteps | 4752000 | +| train/ | | +| approx_kl | 0.018200098 | +| clip_fraction | 0.168 | +| clip_range | 0.2 | +| entropy_loss | -8.13 | +| explained_variance | 0.831 | +| learning_rate | 0.0002 | +| loss | 0.665 | +| n_updates | 1380 | +| policy_gradient_loss | 0.00141 | +| value_loss | 19.2 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 111 | +| time_elapsed | 10686 | +| total_timesteps | 4795200 | +| train/ | | +| approx_kl | 0.018930672 | +| clip_fraction | 0.185 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.833 | +| learning_rate | 0.0002 | +| loss | 1.09 | +| n_updates | 1390 | +| policy_gradient_loss | 0.00529 | +| value_loss | 19.5 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 112 | +| time_elapsed | 10782 | +| total_timesteps | 4838400 | +| train/ | | +| approx_kl | 0.015160192 | +| clip_fraction | 0.158 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.833 | +| learning_rate | 0.0002 | +| loss | 2.37 | +| n_updates | 1400 | +| policy_gradient_loss | -0.000663 | +| value_loss | 21 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 113 | +| time_elapsed | 10878 | +| total_timesteps | 4881600 | +| train/ | | +| approx_kl | 0.017860955 | +| clip_fraction | 0.171 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.82 | +| learning_rate | 0.0002 | +| loss | 0.924 | +| n_updates | 1410 | +| policy_gradient_loss | -0.000111 | +| value_loss | 16.9 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +---------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 114 | +| time_elapsed | 10974 | +| total_timesteps | 4924800 | +| train/ | | +| approx_kl | 0.02072464 | +| clip_fraction | 0.183 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.788 | +| learning_rate | 0.0002 | +| loss | 1.77 | +| n_updates | 1420 | +| policy_gradient_loss | 0.00299 | +| value_loss | 23.1 | +---------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 115 | +| time_elapsed | 11069 | +| total_timesteps | 4968000 | +| train/ | | +| approx_kl | 0.016052378 | +| clip_fraction | 0.158 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.845 | +| learning_rate | 0.0002 | +| loss | 0.692 | +| n_updates | 1430 | +| policy_gradient_loss | -0.00267 | +| value_loss | 16.4 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 116 | +| time_elapsed | 11165 | +| total_timesteps | 5011200 | +| train/ | | +| approx_kl | 0.019034935 | +| clip_fraction | 0.177 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.814 | +| learning_rate | 0.0002 | +| loss | 1.25 | +| n_updates | 1440 | +| policy_gradient_loss | -0.000176 | +| value_loss | 20.7 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 117 | +| time_elapsed | 11260 | +| total_timesteps | 5054400 | +| train/ | | +| approx_kl | 0.017005827 | +| clip_fraction | 0.179 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.811 | +| learning_rate | 0.0002 | +| loss | 2.66 | +| n_updates | 1450 | +| policy_gradient_loss | 0.000235 | +| value_loss | 14 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 118 | +| time_elapsed | 11356 | +| total_timesteps | 5097600 | +| train/ | | +| approx_kl | 0.016972119 | +| clip_fraction | 0.169 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.785 | +| learning_rate | 0.0002 | +| loss | 0.495 | +| n_updates | 1460 | +| policy_gradient_loss | 0.00187 | +| value_loss | 19.5 | +----------------------------------------- + +Current state: ChampionX.Level2.ChunLiVsChunLi +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 119 | +| time_elapsed | 11451 | +| total_timesteps | 5140800 | +| train/ | | +| approx_kl | 0.015783915 | +| clip_fraction | 0.159 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.812 | +| learning_rate | 0.0002 | +| loss | 0.603 | +| n_updates | 1470 | +| policy_gradient_loss | -0.000571 | +| value_loss | 21.2 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 120 | +| time_elapsed | 11547 | +| total_timesteps | 5184000 | +| train/ | | +| approx_kl | 0.017954912 | +| clip_fraction | 0.186 | +| clip_range | 0.2 | +| entropy_loss | -8.14 | +| explained_variance | 0.781 | +| learning_rate | 0.0002 | +| loss | 0.7 | +| n_updates | 1480 | +| policy_gradient_loss | 0.00359 | +| value_loss | 24.6 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 121 | +| time_elapsed | 11642 | +| total_timesteps | 5227200 | +| train/ | | +| approx_kl | 0.017439196 | +| clip_fraction | 0.182 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.782 | +| learning_rate | 0.0002 | +| loss | 0.972 | +| n_updates | 1490 | +| policy_gradient_loss | 0.0017 | +| value_loss | 21.6 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 122 | +| time_elapsed | 11738 | +| total_timesteps | 5270400 | +| train/ | | +| approx_kl | 0.016962286 | +| clip_fraction | 0.173 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.807 | +| learning_rate | 0.0002 | +| loss | 0.875 | +| n_updates | 1500 | +| policy_gradient_loss | 0.000824 | +| value_loss | 18.2 | +----------------------------------------- + +Current state: ChampionX.Level12.ChunLiVsBison +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 123 | +| time_elapsed | 11833 | +| total_timesteps | 5313600 | +| train/ | | +| approx_kl | 0.017236924 | +| clip_fraction | 0.162 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.779 | +| learning_rate | 0.0002 | +| loss | 0.853 | +| n_updates | 1510 | +| policy_gradient_loss | 0.000141 | +| value_loss | 18.9 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 124 | +| time_elapsed | 11928 | +| total_timesteps | 5356800 | +| train/ | | +| approx_kl | 0.016021965 | +| clip_fraction | 0.157 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.83 | +| learning_rate | 0.0002 | +| loss | 1 | +| n_updates | 1520 | +| policy_gradient_loss | 0.00109 | +| value_loss | 20 | +----------------------------------------- + +Current state: ChampionX.Level10.ChunLiVsVega +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 125 | +| time_elapsed | 12024 | +| total_timesteps | 5400000 | +| train/ | | +| approx_kl | 0.015824681 | +| clip_fraction | 0.166 | +| clip_range | 0.2 | +| entropy_loss | -8.18 | +| explained_variance | 0.803 | +| learning_rate | 0.0002 | +| loss | 0.51 | +| n_updates | 1530 | +| policy_gradient_loss | 0.00165 | +| value_loss | 17.8 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 126 | +| time_elapsed | 12119 | +| total_timesteps | 5443200 | +| train/ | | +| approx_kl | 0.014095656 | +| clip_fraction | 0.14 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.809 | +| learning_rate | 0.0002 | +| loss | 0.666 | +| n_updates | 1540 | +| policy_gradient_loss | -0.00077 | +| value_loss | 20.5 | +----------------------------------------- + +Current state: ChampionX.Level9.ChunLiVsBalrog +---------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 127 | +| time_elapsed | 12216 | +| total_timesteps | 5486400 | +| train/ | | +| approx_kl | 0.01563808 | +| clip_fraction | 0.154 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.798 | +| learning_rate | 0.0002 | +| loss | 0.739 | +| n_updates | 1550 | +| policy_gradient_loss | -0.000601 | +| value_loss | 17.6 | +---------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 128 | +| time_elapsed | 12311 | +| total_timesteps | 5529600 | +| train/ | | +| approx_kl | 0.016478073 | +| clip_fraction | 0.159 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.763 | +| learning_rate | 0.0002 | +| loss | 1.21 | +| n_updates | 1560 | +| policy_gradient_loss | 0.000911 | +| value_loss | 21.1 | +----------------------------------------- + +Current state: ChampionX.Level6.ChunLiVsEHonda +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 129 | +| time_elapsed | 12407 | +| total_timesteps | 5572800 | +| train/ | | +| approx_kl | 0.016799105 | +| clip_fraction | 0.155 | +| clip_range | 0.2 | +| entropy_loss | -8.14 | +| explained_variance | 0.795 | +| learning_rate | 0.0002 | +| loss | 1.04 | +| n_updates | 1570 | +| policy_gradient_loss | 0.00415 | +| value_loss | 33.2 | +----------------------------------------- + +Current state: ChampionX.Level8.ChunLiVsGuile +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 130 | +| time_elapsed | 12503 | +| total_timesteps | 5616000 | +| train/ | | +| approx_kl | 0.013092292 | +| clip_fraction | 0.136 | +| clip_range | 0.2 | +| entropy_loss | -8.15 | +| explained_variance | 0.801 | +| learning_rate | 0.0002 | +| loss | 1.22 | +| n_updates | 1580 | +| policy_gradient_loss | -0.00466 | +| value_loss | 16.9 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 131 | +| time_elapsed | 12598 | +| total_timesteps | 5659200 | +| train/ | | +| approx_kl | 0.022095175 | +| clip_fraction | 0.218 | +| clip_range | 0.2 | +| entropy_loss | -8.11 | +| explained_variance | 0.767 | +| learning_rate | 0.0002 | +| loss | 1.75 | +| n_updates | 1590 | +| policy_gradient_loss | 0.00969 | +| value_loss | 28.1 | +----------------------------------------- + +Current state: ChampionX.Level2.ChunLiVsChunLi +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 132 | +| time_elapsed | 12693 | +| total_timesteps | 5702400 | +| train/ | | +| approx_kl | 0.015401343 | +| clip_fraction | 0.155 | +| clip_range | 0.2 | +| entropy_loss | -8.13 | +| explained_variance | 0.783 | +| learning_rate | 0.0002 | +| loss | 0.389 | +| n_updates | 1600 | +| policy_gradient_loss | 0.00122 | +| value_loss | 16.4 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 133 | +| time_elapsed | 12789 | +| total_timesteps | 5745600 | +| train/ | | +| approx_kl | 0.013617316 | +| clip_fraction | 0.135 | +| clip_range | 0.2 | +| entropy_loss | -8.11 | +| explained_variance | 0.82 | +| learning_rate | 0.0002 | +| loss | 1.51 | +| n_updates | 1610 | +| policy_gradient_loss | -0.0011 | +| value_loss | 18.3 | +----------------------------------------- + +Current state: ChampionX.Level1.ChunLiVsKen +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 134 | +| time_elapsed | 12886 | +| total_timesteps | 5788800 | +| train/ | | +| approx_kl | 0.018610569 | +| clip_fraction | 0.2 | +| clip_range | 0.2 | +| entropy_loss | -8.11 | +| explained_variance | 0.72 | +| learning_rate | 0.0002 | +| loss | 0.652 | +| n_updates | 1620 | +| policy_gradient_loss | 0.00408 | +| value_loss | 24.8 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 135 | +| time_elapsed | 12984 | +| total_timesteps | 5832000 | +| train/ | | +| approx_kl | 0.013793538 | +| clip_fraction | 0.135 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.811 | +| learning_rate | 0.0002 | +| loss | 1.18 | +| n_updates | 1630 | +| policy_gradient_loss | 3.8e-05 | +| value_loss | 19.7 | +----------------------------------------- + +Current state: ChampionX.Level3.ChunLiVsZangief +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 136 | +| time_elapsed | 13081 | +| total_timesteps | 5875200 | +| train/ | | +| approx_kl | 0.015575893 | +| clip_fraction | 0.164 | +| clip_range | 0.2 | +| entropy_loss | -8.13 | +| explained_variance | 0.803 | +| learning_rate | 0.0002 | +| loss | 0.503 | +| n_updates | 1640 | +| policy_gradient_loss | 0.000462 | +| value_loss | 17.1 | +----------------------------------------- + +Current state: ChampionX.Level7.ChunLiVsBlanka +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 137 | +| time_elapsed | 13178 | +| total_timesteps | 5918400 | +| train/ | | +| approx_kl | 0.016451944 | +| clip_fraction | 0.165 | +| clip_range | 0.2 | +| entropy_loss | -8.12 | +| explained_variance | 0.802 | +| learning_rate | 0.0002 | +| loss | 0.83 | +| n_updates | 1650 | +| policy_gradient_loss | 0.000427 | +| value_loss | 19.6 | +----------------------------------------- + +Current state: ChampionX.Level2.ChunLiVsChunLi +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 138 | +| time_elapsed | 13275 | +| total_timesteps | 5961600 | +| train/ | | +| approx_kl | 0.013083423 | +| clip_fraction | 0.132 | +| clip_range | 0.2 | +| entropy_loss | -8.13 | +| explained_variance | 0.816 | +| learning_rate | 0.0002 | +| loss | 1.46 | +| n_updates | 1660 | +| policy_gradient_loss | -0.000823 | +| value_loss | 23.6 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 449 | +| iterations | 139 | +| time_elapsed | 13373 | +| total_timesteps | 6004800 | +| train/ | | +| approx_kl | 0.016260127 | +| clip_fraction | 0.16 | +| clip_range | 0.2 | +| entropy_loss | -8.14 | +| explained_variance | 0.805 | +| learning_rate | 0.0002 | +| loss | 1.25 | +| n_updates | 1670 | +| policy_gradient_loss | -0.000364 | +| value_loss | 16.2 | +----------------------------------------- + +Current state: ChampionX.Level5.ChunLiVsRyu +----------------------------------------- +| time/ | | +| fps | 448 | +| iterations | 140 | +| time_elapsed | 13470 | +| total_timesteps | 6048000 | +| train/ | | +| approx_kl | 0.016119048 | +| clip_fraction | 0.162 | +| clip_range | 0.2 | +| entropy_loss | -8.16 | +| explained_variance | 0.796 | +| learning_rate | 0.0002 | +| loss | 0.9 | +| n_updates | 1680 | +| policy_gradient_loss | 0.000371 | +| value_loss | 17.3 | +----------------------------------------- \ No newline at end of file diff --git a/001_image_stack/training_log.txt b/001_image_stack_vision_based_reward/training_log.txt similarity index 100% rename from 001_image_stack/training_log.txt rename to 001_image_stack_vision_based_reward/training_log.txt diff --git a/001_image_stack_vision_based_reward/tune.py b/001_image_stack_vision_based_reward/tune.py new file mode 100644 index 0000000..2c60de1 --- /dev/null +++ b/001_image_stack_vision_based_reward/tune.py @@ -0,0 +1,81 @@ +import gym +import retro +import optuna +from stable_baselines3 import PPO +from stable_baselines3.common.monitor import Monitor +from stable_baselines3.common.evaluation import evaluate_policy + +from custom_cnn import CustomCNN +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +def make_env(game, state, seed=0): + def _init(): + env = retro.RetroEnv( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + env = Monitor(env) + env.seed(seed) + return env + return _init + +def objective(trial): + game = "StreetFighterIISpecialChampionEdition-Genesis" + env = make_env(game, state="ChampionX.Level1.ChunLiVsKen")() + + # Suggest hyperparameters + learning_rate = trial.suggest_float("learning_rate", 5e-5, 1e-3, log=True) + n_steps = trial.suggest_int("n_steps", 256, 8192, log=True) + batch_size = trial.suggest_int("batch_size", 16, 128, log=True) + gamma = trial.suggest_float("gamma", 0.9, 0.9999) + gae_lambda = trial.suggest_float("gae_lambda", 0.9, 1.0) + clip_range = trial.suggest_float("clip_range", 0.1, 0.4) + ent_coef = trial.suggest_float("ent_coef", 1e-4, 1e-2, log=True) + vf_coef = trial.suggest_float("vf_coef", 0.1, 1.0) + + # Using CustomCNN as the feature extractor + policy_kwargs = { + 'features_extractor_class': CustomCNN + } + + # Train the model + model = PPO( + "CnnPolicy", + env, + device="cuda", + policy_kwargs=policy_kwargs, + verbose=1, + n_steps=n_steps, + batch_size=batch_size, + learning_rate=learning_rate, + ent_coef=ent_coef, + clip_range=clip_range, + vf_coef=vf_coef, + gamma=gamma, + gae_lambda=gae_lambda + ) + + for iteration in range(10): + model.learn(total_timesteps=100000) + mean_reward, _std_reward = evaluate_policy(model, env, n_eval_episodes=10) + + trial.report(mean_reward, iteration) + + if trial.should_prune(): + raise optuna.TrialPruned() + + return mean_reward + +study = optuna.create_study(direction="maximize") +study.optimize(objective, n_trials=100, timeout=7200) # Run optimization for 100 trials or 2 hours, whichever comes first + +print("Best trial:") +trial = study.best_trial + +print(" Value: ", trial.value) +print(" Params: ") +for key, value in trial.params.items(): + print(f"{key}: {value}") diff --git a/003_frame_delta_ram_based/__pycache__/custom_cnn.cpython-38.pyc b/003_frame_delta_ram_based/__pycache__/custom_cnn.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73996e1edab6f323c1db95cd716857072e957535 GIT binary patch literal 1198 zcmZuwOK%e~5VrT7G)1&3F98wP=zSHtRh+4wNp0idQ;n5XcaC{ zsi)pJa!8K+CEpOI@&}MOF|!FJ2rPMaJmdBEdFJ!h;$oA)`1<`i|Kt+#4HxsngT;NA zdL0ZWoaQ8+erZhWwNtpUOEKo;Ug5_+B~J-=xpzpoC;X3Y9B{fx+WrZgKsMUco_m;R z@kAu1QbIp|XH=4!Ql*%l9|(;@-vJ{C!o`ko2Og)N=@IEu?r`_875gF>ggCkP+2KA9 z4!t-!A|8nw02|syx6-C8x*LeSRBmgb_7anolIdZRiqxr5rUv~*m{1C$KY%gB&=L9Q z44e_=fOzasV%)K3+<}jmL_8ky=-7v7Fo7JzJ>K|lyaDkh{PoxVafpA7Bfc;qgT};} zo-=8T2y1czH)w5S1b6}YR)1DB#STQ2)OM9>+5PLl){jW7|Ud47_*L)wz(;GD|H#L*?Ojp~rVxWP&wC*ee(9UpQ zodvuIroIS<&=u;@Wg48$fVODx<6!wz4xQgu1;(v8U1%F90pgVZNCPX>MT8YFBRYon zFrn{3AY(cL51Qp{r~qq;u}oUu7ZmmsTyp&fh}Ng~x`$%c*wBbZ(7TrV3y{n#6951J literal 0 HcmV?d00001 diff --git a/003_frame_delta_ram_based/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc b/003_frame_delta_ram_based/__pycache__/street_fighter_custom_wrapper.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de0618e9862d27f25c4efb0d40e0fabae46366a7 GIT binary patch literal 2031 zcmaJ?&1)Pt6qiPtk6nM{qak%ZN(yb-&LJVVrIb=i95+q_#VJlg>98OsBdxug*_nwn z>(plElt3Vm|G_@y)>HqG9(5}88&R!et;sSbZ7E9<0F&!buXs+Y9#M{aPzkZ;ZBgYNgkw zrYbvjWt98U9G>{Rxw z6IOY;r?l8nX>YZo2P+hW#66eZ zD<;_`(z1qORc~s%7*o3h@l(1ga~Hd95EAlRc{BDc%XU|7l10Nd z)@xbITOU008t;&{2oX$@$36X7T;5qo(hA0JS0YJF`82Ol+0r0Hj^{*## zqF>I*Ut**dNGCZ*+DP)YSA2V-LG&*tH#zVKQ|=2Vx|cx~cKR#mLDZeE5U_8?gI&mh zEx;kf_4FUoZ+lJHL`|>phunc$5_GuYa4lI>g_`WmVCBI^-0$+nO%1j8X4*71RhMO# zV3%sd61e0lJxDWz9GA-^gt~s3YMJ;#mW8r>R18af71Waj2YMY~VCSHk<*4=V3Wz}+ zE5o2Agr0-^_vs?gfUU3T{iWa literal 0 HcmV?d00001 diff --git a/003_frame_delta_ram_based/custom_cnn.py b/003_frame_delta_ram_based/custom_cnn.py new file mode 100644 index 0000000..5ba84fa --- /dev/null +++ b/003_frame_delta_ram_based/custom_cnn.py @@ -0,0 +1,25 @@ +import gym +import torch +import torch.nn as nn +from stable_baselines3.common.torch_layers import BaseFeaturesExtractor + +# Custom feature extractor (CNN) +class CustomCNN(BaseFeaturesExtractor): + def __init__(self, observation_space: gym.Space): + super(CustomCNN, self).__init__(observation_space, features_dim=512) + self.cnn = nn.Sequential( + nn.Conv2d(1, 32, kernel_size=5, stride=2, padding=0), + nn.ReLU(), + nn.Conv2d(32, 64, kernel_size=5, stride=2, padding=0), + nn.ReLU(), + nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=0), + nn.ReLU(), + nn.Flatten(), + nn.Linear(16384, self.features_dim), + nn.ReLU() + ) + + def forward(self, observations: torch.Tensor) -> torch.Tensor: + observations = observations.unsqueeze(1) + return self.cnn(observations) + \ No newline at end of file diff --git a/003_frame_delta_ram_based/logs/monitor.csv b/003_frame_delta_ram_based/logs/monitor.csv new file mode 100644 index 0000000..531e49e --- /dev/null +++ b/003_frame_delta_ram_based/logs/monitor.csv @@ -0,0 +1,2 @@ +#{"t_start": 1680175884.8182795, "env_id": null} +r,l,t diff --git a/003_frame_delta_ram_based/street_fighter_custom_wrapper.py b/003_frame_delta_ram_based/street_fighter_custom_wrapper.py new file mode 100644 index 0000000..65b9c75 --- /dev/null +++ b/003_frame_delta_ram_based/street_fighter_custom_wrapper.py @@ -0,0 +1,72 @@ +import gym +import cv2 +import numpy as np + +# Custom environment wrapper +class StreetFighterCustomWrapper(gym.Wrapper): + def __init__(self, env, testing=False): + super(StreetFighterCustomWrapper, self).__init__(env) + self.env = env + self.testing = testing + + # Store the previous frame + self.prev_frame = None + + self.full_hp = 176 + self.prev_player_health = self.full_hp + self.prev_oppont_health = self.full_hp + + # Update observation space to include one grayscale frame difference image + self.observation_space = gym.spaces.Box(low=0, high=255, shape=(84, 84, 1), dtype=np.uint8) + + def _preprocess_observation(self, observation): + obs_gray = cv2.cvtColor(observation, cv2.COLOR_BGR2GRAY) + obs_gray_resized = cv2.resize(obs_gray, (84, 84), interpolation=cv2.INTER_AREA) / 255.0 + return obs_gray_resized + + def reset(self): + self.prev_player_health = self.full_hp + self.prev_oppont_health = self.full_hp + + observation = self.env.reset() + # Reset the previous frame + self.prev_frame = self._preprocess_observation(observation) + return np.zeros_like(self.prev_frame) + + def step(self, action): + observation, _reward, _done, info = self.env.step(action) + + obs_gray_resized = self._preprocess_observation(observation) + + if self.prev_frame is not None: + frame_delta = obs_gray_resized - self.prev_frame + else: + frame_delta = np.zeros_like(obs_gray_resized) + + self.prev_frame = obs_gray_resized + + # During fighting, either player or opponent has positive health points. + if info['health'] > 0 or info['enemy_health'] > 0: + + # Player Loses + if info['health'] < 0 and info['enemy_health'] > 0: + reward = (-self.full_hp) * info['enemy_health'] + done = True + + # Player Wins + elif info['enemy_health'] < 0 and info['health'] > 0: + reward = self.full_hp * info['health'] + done = True + + # During Fighting + else: + reward = (self.prev_oppont_health - info['enemy_health']) - (self.prev_player_health - info['health']) + + self.prev_player_health = info['health'] + self.prev_oppont_health = info['enemy_health'] + + if self.testing: + done = False + + return frame_delta, reward, done, info + \ No newline at end of file diff --git a/003_frame_delta_ram_based/test.py b/003_frame_delta_ram_based/test.py new file mode 100644 index 0000000..aaf494c --- /dev/null +++ b/003_frame_delta_ram_based/test.py @@ -0,0 +1,70 @@ +import time + +import cv2 +import retro +from stable_baselines3 import PPO +from stable_baselines3.common.vec_env import DummyVecEnv + +from custom_cnn import CustomCNN +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +def make_env(game, state): + def _init(): + env = retro.RetroEnv( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env, testing=True) + return env + return _init + +game = "StreetFighterIISpecialChampionEdition-Genesis" +state_stages = [ + "Champion.Level1.ChunLiVsGuile", + "Champion.Level2.ChunLiVsKen", + "Champion.Level3.ChunLiVsChunLi", + "Champion.Level4.ChunLiVsZangief", + "Champion.Level5.ChunLiVsDhalsim", + "Champion.Level6.ChunLiVsRyu", + "Champion.Level7.ChunLiVsEHonda", + "Champion.Level8.ChunLiVsBlanka", + "Champion.Level9.ChunLiVsBalrog", + "Champion.Level10.ChunLiVsVega", + "Champion.Level11.ChunLiVsSagat", + "Champion.Level12.ChunLiVsBison" + # Add other stages as necessary +] + +env = make_env(game, state_stages[0])() + +# Wrap the environment +env = DummyVecEnv([lambda: env]) + +policy_kwargs = { + 'features_extractor_class': CustomCNN +} + +model = PPO( + "CnnPolicy", + env, + device="cuda", + policy_kwargs=policy_kwargs, + verbose=1 +) +model.load(r"trained_models_continued/ppo_chunli_6048000_steps") + +obs = env.reset() +done = False + +while True: + timestamp = time.time() + action, _ = model.predict(obs) + obs, rewards, done, info = env.step(action) + env.render() + render_time = time.time() - timestamp + if render_time < 0.0111: + time.sleep(0.0111 - render_time) # Add a delay for 90 FPS + +# env.close() diff --git a/003_frame_delta_ram_based/train.py b/003_frame_delta_ram_based/train.py new file mode 100644 index 0000000..e4d1bc2 --- /dev/null +++ b/003_frame_delta_ram_based/train.py @@ -0,0 +1,124 @@ +import os +import random + +import retro +from stable_baselines3 import PPO, A2C +from stable_baselines3.common.vec_env import SubprocVecEnv +from stable_baselines3.common.callbacks import BaseCallback, CheckpointCallback + +from custom_cnn import CustomCNN +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +class RandomOpponentChangeCallback(BaseCallback): + def __init__(self, stages, opponent_interval, verbose=0): + super(RandomOpponentChangeCallback, self).__init__(verbose) + self.stages = stages + self.opponent_interval = opponent_interval + + def _on_step(self) -> bool: + if self.n_calls % self.opponent_interval == 0: + new_state = random.choice(self.stages) + print("\nCurrent state:", new_state) + self.training_env.env_method("load_state", new_state, indices=None) + return True + +def make_env(game, state, seed=0): + def _init(): + env = retro.make( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + env.seed(seed) + return env + return _init + +def main(): + # Set up the environment and model + game = "StreetFighterIISpecialChampionEdition-Genesis" + state_stages = [ + "ChampionX.Level1.ChunLiVsKen", + "ChampionX.Level2.ChunLiVsChunLi", + "ChampionX.Level3.ChunLiVsZangief", + "ChampionX.Level4.ChunLiVsDhalsim", + "ChampionX.Level5.ChunLiVsRyu", + "ChampionX.Level6.ChunLiVsEHonda", + "ChampionX.Level7.ChunLiVsBlanka", + "ChampionX.Level8.ChunLiVsGuile", + "ChampionX.Level9.ChunLiVsBalrog", + "ChampionX.Level10.ChunLiVsVega", + "ChampionX.Level11.ChunLiVsSagat", + "ChampionX.Level12.ChunLiVsBison" + # Add other stages as necessary + ] + # Champion is at difficulty level 4, ChampionX is at difficulty level 8. + + num_envs = 8 + + env = SubprocVecEnv([make_env(game, state_stages[0], seed=i) for i in range(num_envs)]) + + # Using CustomCNN as the feature extractor + policy_kwargs = { + 'features_extractor_class': CustomCNN + } + + model = PPO( + "CnnPolicy", + env, + device="cuda", + policy_kwargs=policy_kwargs, + verbose=1, + n_steps=5400, + batch_size=64, + learning_rate=0.0001, + ent_coef=0.01, + clip_range=0.2, + gamma=0.99, + gae_lambda=0.95, + tensorboard_log="logs/" + ) + + # Set the save directory + save_dir = "trained_models" + os.makedirs(save_dir, exist_ok=True) + + # Load the model from file + # model_path = "trained_models/ppo_chunli_1296000_steps.zip" + + # Load model and modify the learning rate and entropy coefficient + # custom_objects = { + # "learning_rate": 0.0002 + # } + # model = PPO.load(model_path, env=env, device="cuda")#, custom_objects=custom_objects) + + # Set up callbacks + opponent_interval = 5400 # stage_interval * num_envs = total_steps_per_stage + checkpoint_interval = 54000 # checkpoint_interval * num_envs = total_steps_per_checkpoint (Every 80 rounds) + checkpoint_callback = CheckpointCallback(save_freq=checkpoint_interval, save_path=save_dir, name_prefix="ppo_chunli") + stage_increase_callback = RandomOpponentChangeCallback(state_stages, opponent_interval, save_dir) + + # model_params = { + # 'n_steps': 5, + # 'gamma': 0.99, + # 'gae_lambda':1, + # 'learning_rate': 7e-4, + # 'vf_coef': 0.5, + # 'ent_coef': 0.0, + # 'max_grad_norm':0.5, + # 'rms_prop_eps':1e-05 + # } + # model = A2C('CnnPolicy', env, tensorboard_log='logs/', verbose=1, **model_params, policy_kwargs=dict(optimizer_class=RMSpropTF)) + + model.learn( + total_timesteps=int(6048000), # total_timesteps = stage_interval * num_envs * num_stages (1120 rounds) + callback=[checkpoint_callback, stage_increase_callback] + ) + env.close() + + # Save the final model + model.save(os.path.join(save_dir, "ppo_sf2_chunli_final.zip")) + +if __name__ == "__main__": + main() diff --git a/003_frame_delta_ram_based/tune_ppo.py b/003_frame_delta_ram_based/tune_ppo.py new file mode 100644 index 0000000..e5128e2 --- /dev/null +++ b/003_frame_delta_ram_based/tune_ppo.py @@ -0,0 +1,73 @@ +import os + +import retro +import optuna +from stable_baselines3 import PPO +from stable_baselines3.common.evaluation import evaluate_policy +from stable_baselines3.common.monitor import Monitor +from stable_baselines3.common.vec_env import DummyVecEnv, VecFrameStack + +from street_fighter_custom_wrapper import StreetFighterCustomWrapper + +LOG_DIR = 'logs/' +OPT_DIR = 'optuna/' +os.makedirs(LOG_DIR, exist_ok=True) +os.makedirs(OPT_DIR, exist_ok=True) + +def optimize_ppo(trial): + return { + 'n_steps':trial.suggest_int('n_steps', 1024, 8192, log=True), + 'gamma':trial.suggest_float('gamma', 0.9, 0.9999), + 'learning_rate':trial.suggest_float('learning_rate', 5e-5, 1e-4, log=True), + 'clip_range':trial.suggest_float('clip_range', 0.1, 0.4), + 'gae_lambda':trial.suggest_float('gae_lambda', 0.8, 0.99) + } + +def make_env(game, state, seed=0): + def _init(): + env = retro.make( + game=game, + state=state, + use_restricted_actions=retro.Actions.FILTERED, + obs_type=retro.Observations.IMAGE + ) + env = StreetFighterCustomWrapper(env) + env.seed(seed) + return env + return _init + +def optimize_agent(trial): + game = "StreetFighterIISpecialChampionEdition-Genesis" + state = "ChampionX.Level1.ChunLiVsKen" + + # try: + model_params = optimize_ppo(trial) + + # Create environment + env = make_env(game, state)() + env = Monitor(env, LOG_DIR) + env = DummyVecEnv([lambda: env]) + env = VecFrameStack(env, 4, channels_order='last') + + # Create algo + model = PPO('CnnPolicy', env, tensorboard_log=LOG_DIR, verbose=0, **model_params) + model.learn(total_timesteps=100000) + + # Evaluate model + mean_reward, _ = evaluate_policy(model, env, n_eval_episodes=5) + env.close() + + SAVE_PATH = os.path.join(OPT_DIR, 'trial_{}_best_model'.format(trial.number)) + model.save(SAVE_PATH) + + return mean_reward + + # except Exception as e: + # return -1 + +# Creating the experiment +study = optuna.create_study(direction='maximize') +study.optimize(optimize_agent, n_trials=10, n_jobs=1) + +print(study.best_params) +print(study.best_trial)