Files
easy-rl/codes/SoftActorCritic/task0_train.ipynb
T
2021-12-28 18:46:52 +08:00

14 KiB

In [1]:
import sys
from pathlib import Path
curr_path = str(Path().absolute())
parent_path = str(Path().absolute().parent)
sys.path.append(parent_path) # add current terminal path to sys.path
In [2]:
import gym
import torch
import datetime

from SAC.env import NormalizedActions
from SAC.agent import SAC
from common.utils import save_results, make_dir
from common.plot import plot_rewards

curr_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") # obtain current time
In [3]:
class SACConfig:
    def __init__(self) -> None:
        self.algo = 'SAC'
        self.env = 'Pendulum-v0'
        self.result_path = curr_path+"/outputs/" +self.env+'/'+curr_time+'/results/'  # path to save results
        self.model_path = curr_path+"/outputs/" +self.env+'/'+curr_time+'/models/'  # path to save models
        self.train_eps = 300
        self.train_steps = 500
        self.test_eps = 50
        self.eval_steps = 500
        self.gamma = 0.99
        self.mean_lambda=1e-3
        self.std_lambda=1e-3
        self.z_lambda=0.0
        self.soft_tau=1e-2
        self.value_lr  = 3e-4
        self.soft_q_lr = 3e-4
        self.policy_lr = 3e-4
        self.capacity = 1000000
        self.hidden_dim = 256
        self.batch_size  = 128
        self.device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
In [4]:
def env_agent_config(cfg,seed=1):
    env = NormalizedActions(gym.make("Pendulum-v0"))
    env.seed(seed)
    action_dim = env.action_space.shape[0]
    state_dim  = env.observation_space.shape[0]
    agent = SAC(state_dim,action_dim,cfg)
    return env,agent
In [5]:
def train(cfg,env,agent):
    print('Start to train !')
    print(f'Env: {cfg.env}, Algorithm: {cfg.algo}, Device: {cfg.device}')
    rewards  = []
    ma_rewards = [] # moveing average reward
    for i_ep in range(cfg.train_eps):
        state = env.reset()
        ep_reward = 0
        for i_step in range(cfg.train_steps):
            action = agent.policy_net.get_action(state)
            next_state, reward, done, _ = env.step(action)
            agent.memory.push(state, action, reward, next_state, done)
            agent.update()
            state = next_state
            ep_reward += reward
            if done:
                break
        if (i_ep+1)%10==0:
            print(f"Episode:{i_ep+1}/{cfg.train_eps}, Reward:{ep_reward:.3f}")
        rewards.append(ep_reward)
        if ma_rewards:
            ma_rewards.append(0.9*ma_rewards[-1]+0.1*ep_reward)
        else:
            ma_rewards.append(ep_reward) 
    print('Complete training!')
    return rewards, ma_rewards
In [6]:
def eval(cfg,env,agent):
    print('Start to eval !')
    print(f'Env: {cfg.env}, Algorithm: {cfg.algo}, Device: {cfg.device}')
    rewards  = []
    ma_rewards = [] # moveing average reward
    for i_ep in range(cfg.test_eps):
        state = env.reset()
        ep_reward = 0
        for i_step in range(cfg.eval_steps):
            action = agent.policy_net.get_action(state)
            next_state, reward, done, _ = env.step(action)
            state = next_state
            ep_reward += reward
            if done:
                break
        if (i_ep+1)%10==0:
            print(f"Episode:{i_ep+1}/{cfg.train_eps}, Reward:{ep_reward:.3f}")
        rewards.append(ep_reward)
        if ma_rewards:
            ma_rewards.append(0.9*ma_rewards[-1]+0.1*ep_reward)
        else:
            ma_rewards.append(ep_reward) 
    print('Complete evaling!')
    return rewards, ma_rewards
In [7]:
if __name__ == "__main__":
    cfg=SACConfig()
    
    # train
    env,agent = env_agent_config(cfg,seed=1)
    rewards, ma_rewards = train(cfg, env, agent)
    make_dir(cfg.result_path, cfg.model_path)
    agent.save(path=cfg.model_path)
    save_results(rewards, ma_rewards, tag='train', path=cfg.result_path)
    plot_rewards(rewards, ma_rewards, tag="train",
                 algo=cfg.algo, path=cfg.result_path)
    # eval
    env,agent = env_agent_config(cfg,seed=10)
    agent.load(path=cfg.model_path)
    rewards,ma_rewards = eval(cfg,env,agent)
    save_results(rewards,ma_rewards,tag='eval',path=cfg.result_path)
    plot_rewards(rewards,ma_rewards,tag="eval",env=cfg.env,algo = cfg.algo,path=cfg.result_path)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/anaconda3/envs/py37/lib/python3.7/site-packages/gym/envs/registration.py in spec(self, path)
    157         try:
--> 158             return self.env_specs[id]
    159         except KeyError:

KeyError: 'Pendulum-v0'

During handling of the above exception, another exception occurred:

DeprecatedEnv                             Traceback (most recent call last)
<ipython-input-7-91b1038013e4> in <module>
      3 
      4     # train
----> 5     env,agent = env_agent_config(cfg,seed=1)
      6     rewards, ma_rewards = train(cfg, env, agent)
      7     make_dir(cfg.result_path, cfg.model_path)

<ipython-input-4-040773221550> in env_agent_config(cfg, seed)
      1 def env_agent_config(cfg,seed=1):
----> 2     env = NormalizedActions(gym.make("Pendulum-v0"))
      3     env.seed(seed)
      4     action_dim = env.action_space.shape[0]
      5     state_dim  = env.observation_space.shape[0]

~/anaconda3/envs/py37/lib/python3.7/site-packages/gym/envs/registration.py in make(id, **kwargs)
    233 
    234 def make(id, **kwargs):
--> 235     return registry.make(id, **kwargs)
    236 
    237 

~/anaconda3/envs/py37/lib/python3.7/site-packages/gym/envs/registration.py in make(self, path, **kwargs)
    126         else:
    127             logger.info("Making new env: %s", path)
--> 128         spec = self.spec(path)
    129         env = spec.make(**kwargs)
    130         return env

~/anaconda3/envs/py37/lib/python3.7/site-packages/gym/envs/registration.py in spec(self, path)
    185                 raise error.DeprecatedEnv(
    186                     "Env {} not found (valid versions include {})".format(
--> 187                         id, matching_envs
    188                     )
    189                 )

DeprecatedEnv: Env Pendulum-v0 not found (valid versions include ['Pendulum-v1'])