Merge branch 'main' of https://github.com/sisl/InteractionImitation
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
174
ogail-ppo-options-setobs2.py
Normal file
174
ogail-ppo-options-setobs2.py
Normal file
@@ -0,0 +1,174 @@
|
||||
# %%
|
||||
import os
|
||||
|
||||
import gym
|
||||
from src.safe_options.options import gail_ppo, Buffer
|
||||
from src.core.value import SetValue
|
||||
from src.safe_options.policy import SetMaskedDiscretePolicy
|
||||
from src.core.discriminator import DeepsetDiscriminator
|
||||
import torch
|
||||
|
||||
from intersim.envs import IntersimpleLidarFlatRandom
|
||||
from intersim.envs.intersimple import speed_reward
|
||||
import functools
|
||||
from src.util.wrappers import CollisionPenaltyWrapper, TransformObservation, Setobs
|
||||
import numpy as np
|
||||
from src.safe_options.options import SafeOptionsEnv
|
||||
from torch.utils.tensorboard import SummaryWriter
|
||||
from ray import tune
|
||||
|
||||
DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
option_list = [[(vel, time) for vel in [0, 1, 2, 4, 6, 8, 10] for time in [5]],
|
||||
[(vel, time) for vel in [0, 1, 2, 5, 7.5, 10] for time in [5, 20]],
|
||||
[(vel, time) for vel in [0, 1, 2, 4, 6, 8, 10] for time in [5, 10, 20]], # was the best in training with single hidden layer, but very slow
|
||||
[(vel, time) for vel in [0, 1, 2, 5, 7.5, 10] for time in [5, 20, 40]],
|
||||
[(vel, time) for vel in [0, 2, 5, 10] for time in [5, 10, 20]],
|
||||
[(vel, time) for vel in [0, 3, 10] for time in [5, 20, 40]]
|
||||
]
|
||||
|
||||
obs_min = np.array([
|
||||
[-1000, -1000, 0, -np.pi, -1e-1, 0.],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
]).reshape(-1)
|
||||
|
||||
obs_max = np.array([
|
||||
[1000, 1000, 20, np.pi, 1e-1, 0.],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
]).reshape(-1)
|
||||
|
||||
def training_function(config):
|
||||
np.random.seed(config['seed'])
|
||||
torch.manual_seed(config['seed'])
|
||||
|
||||
envs = sum([[SafeOptionsEnv(Setobs(
|
||||
TransformObservation(CollisionPenaltyWrapper(IntersimpleLidarFlatRandom(
|
||||
n_rays=5,
|
||||
reward=functools.partial(
|
||||
speed_reward,
|
||||
collision_penalty=0
|
||||
),
|
||||
stop_on_collision=config['stop_on_collision'], track=track,
|
||||
), collision_distance=6, collision_penalty=100), lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10))
|
||||
), options=option_list[config['policy']['option']], safe_actions_collision_method=None,
|
||||
abort_unsafe_collision_method=None) for _ in range(20)] for track in range(4)],[])
|
||||
|
||||
env_fn = lambda i: envs[i]
|
||||
|
||||
policy = SetMaskedDiscretePolicy(env_fn(0).action_space.n,
|
||||
n_hidden_layers=config['policy']['n_hidden_layers'],
|
||||
hidden_layer_size=config['policy']['hidden_layer_size'],
|
||||
activation=config['policy']['activation'] ) # config net architecture
|
||||
pi_opt = torch.optim.Adam(policy.parameters(), lr=config['policy']['learning_rate'])
|
||||
pi_lr_scheduler = torch.optim.lr_scheduler.ExponentialLR(pi_opt, gamma=config['policy']['learning_rate_decay'])
|
||||
|
||||
value = SetValue() # config net architecture
|
||||
v_opt = torch.optim.Adam(value.parameters(), lr=config['value']['learning_rate'])
|
||||
|
||||
discriminator = DeepsetDiscriminator() # config net architecture
|
||||
disc_opt = torch.optim.Adam(discriminator.parameters(), lr=config['discriminator']['learning_rate'], weight_decay=config['discriminator']['weight_decay'])
|
||||
|
||||
expert_data = [
|
||||
torch.load(os.path.join(DIR, 'intersimple-expert-data-setobs2-loc0-track0.pt')),
|
||||
torch.load(os.path.join(DIR, 'intersimple-expert-data-setobs2-loc0-track1.pt')),
|
||||
torch.load(os.path.join(DIR, 'intersimple-expert-data-setobs2-loc0-track2.pt')),
|
||||
torch.load(os.path.join(DIR, 'intersimple-expert-data-setobs2-loc0-track3.pt')),
|
||||
]
|
||||
d0 = [d[0] for d in expert_data]
|
||||
d1 = [d[1] for d in expert_data]
|
||||
d2 = [d[2] for d in expert_data]
|
||||
d3 = [d[3] for d in expert_data]
|
||||
expert_data = (torch.cat(d0), torch.cat(d1), torch.cat(d2), torch.cat(d3))
|
||||
expert_data = Buffer(*expert_data)
|
||||
|
||||
def callback(info):
|
||||
tune.report(gen_mean_reward_per_episode=info['gen/mean_reward_per_episode'],
|
||||
disc_mean_reward_per_episode=info['disc/mean_reward_per_episode'],
|
||||
mean_episode_length=info['gen/mean_episode_length'])
|
||||
|
||||
# save model checkpoints
|
||||
ep = info['epoch'] + 1
|
||||
if (ep % 25 == 0):
|
||||
torch.save(info['policy'].state_dict(), f'policy_epoch{ep}.pt')
|
||||
|
||||
value, policy = gail_ppo(
|
||||
env_fn=env_fn,
|
||||
expert_data=expert_data,
|
||||
discriminator=discriminator,
|
||||
disc_opt=disc_opt,
|
||||
disc_iters=config['discriminator']['iterations_per_epoch'],
|
||||
policy=policy,
|
||||
value=value,
|
||||
v_opt=v_opt,
|
||||
v_iters=config['value']['iterations_per_epoch'],
|
||||
epochs=200,
|
||||
rollout_episodes=60,
|
||||
rollout_steps=60,
|
||||
gamma=0.99,
|
||||
gae_lambda=0.9,
|
||||
clip_ratio=config['policy']['clip_ratio'],
|
||||
pi_opt=pi_opt,
|
||||
pi_iters=config['policy']['iterations_per_epoch'],
|
||||
logger=SummaryWriter(comment='sgail-ppo-options-setobs2'),
|
||||
callback=callback,
|
||||
lr_schedulers=[pi_lr_scheduler],
|
||||
)
|
||||
|
||||
# save model
|
||||
torch.save(policy.state_dict(), 'policy_final.pt')
|
||||
|
||||
analysis = tune.run(
|
||||
training_function,
|
||||
config={
|
||||
'stop_on_collision': tune.grid_search([True, False]),
|
||||
'policy': {
|
||||
'learning_rate': 3e-4, # tune.grid_search([3e-4]),
|
||||
'learning_rate_decay': 1.0, #tune.grid_search([1.0]),
|
||||
'clip_ratio': 0.2, #tune.grid_search([0.2]),
|
||||
'iterations_per_epoch': 100, #tune.grid_search([100]),
|
||||
'hidden_layer_size': tune.grid_search([10, 20, 40]),
|
||||
'n_hidden_layers': tune.grid_search([2, 3, 4]),
|
||||
'activation':tune.grid_search([torch.nn.LeakyReLU, torch.nn.Tanh]),
|
||||
'option': tune.grid_search(list(range(len(option_list))))
|
||||
},
|
||||
'value': {
|
||||
'learning_rate': 1e-3, # tune.grid_search([1e-3]),
|
||||
'iterations_per_epoch': 1000, #tune.grid_search([1000]),
|
||||
},
|
||||
'discriminator': {
|
||||
'learning_rate': 1e-3, #tune.grid_search([1e-3]),
|
||||
'weight_decay': 1e-4, #tune.grid_search([1e-4]),
|
||||
'iterations_per_epoch': 100, #tune.grid_search([100]),
|
||||
},
|
||||
'seed': 0,
|
||||
}
|
||||
)
|
||||
|
||||
print('Best config: ', analysis.get_best_config(metric='gen_mean_reward_per_episode', mode='max'))
|
||||
|
||||
# %%
|
||||
# policy = SetMaskedDiscretePolicy(env_fn(0).action_space.n)
|
||||
# policy(torch.zeros(env_fn(0).observation_space['observation'].shape), torch.zeros(env_fn(0).observation_space['safe_actions'].shape))
|
||||
# policy.load_state_dict(torch.load('sgail-ppo-options-setobs2.pt'))
|
||||
|
||||
# env = env_fn(0)
|
||||
# obs = env.reset()
|
||||
# env.render(mode='post')
|
||||
# for i in range(300):
|
||||
# action = policy.sample(policy(
|
||||
# torch.tensor(obs['observation'], dtype=torch.float32),
|
||||
# torch.tensor(obs['safe_actions'], dtype=torch.float32),
|
||||
# ))
|
||||
# obs, reward, done, _ = env.step(action, render_mode='post')
|
||||
# print('step', i, 'reward', reward, 'safe actions', obs['safe_actions'])
|
||||
# if done:
|
||||
# break
|
||||
# env.close()
|
||||
# %%
|
||||
@@ -8,3 +8,5 @@ ray[tune]
|
||||
hyperopt
|
||||
psutil
|
||||
fire
|
||||
stable_baselines3
|
||||
tensorboard
|
||||
@@ -6,7 +6,8 @@ from src.safe_options.options import gail_ppo, Buffer
|
||||
from src.core.value import SetValue
|
||||
from src.safe_options.policy import SetMaskedDiscretePolicy
|
||||
from src.core.discriminator import DeepsetDiscriminator
|
||||
import torch.optim
|
||||
import torch
|
||||
|
||||
from intersim.envs import IntersimpleLidarFlatRandom
|
||||
from intersim.envs.intersimple import speed_reward
|
||||
import functools
|
||||
@@ -18,27 +19,38 @@ from ray import tune
|
||||
from datetime import datetime
|
||||
import json
|
||||
|
||||
def training_function(config):
|
||||
DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
obs_min = np.array([
|
||||
DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
option_list = [[(vel, time) for vel in [0, 1, 2, 4, 6, 8, 10] for time in [5]],
|
||||
[(vel, time) for vel in [0, 1, 2, 5, 7.5, 10] for time in [5, 20]],
|
||||
[(vel, time) for vel in [0, 1, 2, 4, 6, 8, 10] for time in [5, 10, 20]], # was the best in training with single hidden layer, but very slow
|
||||
[(vel, time) for vel in [0, 1, 2, 5, 7.5, 10] for time in [5, 20, 40]],
|
||||
[(vel, time) for vel in [0, 2, 5, 10] for time in [5, 10, 20]],
|
||||
[(vel, time) for vel in [0, 3, 10] for time in [5, 20, 40]]
|
||||
]
|
||||
|
||||
obs_min = np.array([
|
||||
[-1000, -1000, 0, -np.pi, -1e-1, 0.],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
[0, -np.pi, -20, -20, -np.pi, -1e-1],
|
||||
]).reshape(-1)
|
||||
]).reshape(-1)
|
||||
|
||||
obs_max = np.array([
|
||||
obs_max = np.array([
|
||||
[1000, 1000, 20, np.pi, 1e-1, 0.],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
[50, np.pi, 20, 20, np.pi, 1e-1],
|
||||
]).reshape(-1)
|
||||
]).reshape(-1)
|
||||
|
||||
envs = [SafeOptionsEnv(Setobs(
|
||||
def training_function(config):
|
||||
np.random.seed(config['seed'])
|
||||
torch.manual_seed(config['seed'])
|
||||
|
||||
envs = sum([[SafeOptionsEnv(Setobs(
|
||||
TransformObservation(CollisionPenaltyWrapper(IntersimpleLidarFlatRandom(
|
||||
n_rays=5,
|
||||
reward=functools.partial(
|
||||
@@ -46,15 +58,18 @@ def training_function(config):
|
||||
collision_penalty=0
|
||||
),
|
||||
check_collisions=True,
|
||||
stop_on_collision=config['env']['stop_on_collision'],
|
||||
stop_on_collision=config['env']['stop_on_collision'], track=track,
|
||||
), collision_distance=6, collision_penalty=100), lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10))
|
||||
), options=[(0, 5), (1, 5), (2, 5), (4, 5), (6, 5), (8, 5), (10, 5)],
|
||||
), options=option_list[config['policy']['option']],
|
||||
safe_actions_collision_method=config['env']['safe_actions_collision_method'],
|
||||
abort_unsafe_collision_method=config['env']['abort_unsafe_collision_method']) for _ in range(60)]
|
||||
abort_unsafe_collision_method=config['env']['abort_unsafe_collision_method']) for _ in range(20)] for track in range(4)],[])
|
||||
|
||||
env_fn = lambda i: envs[i]
|
||||
|
||||
policy = SetMaskedDiscretePolicy(env_fn(0).action_space.n, hidden_layer_size=config['policy']['hidden_layer_size']) # config net architecture
|
||||
policy = SetMaskedDiscretePolicy(env_fn(0).action_space.n,
|
||||
n_hidden_layers=config['policy']['n_hidden_layers'],
|
||||
hidden_layer_size=config['policy']['hidden_layer_size'],
|
||||
activation=config['policy']['activation'] ) # config net architecture
|
||||
pi_opt = torch.optim.Adam(policy.parameters(), lr=config['policy']['learning_rate'])
|
||||
pi_lr_scheduler = torch.optim.lr_scheduler.ExponentialLR(pi_opt, gamma=config['policy']['learning_rate_decay'])
|
||||
|
||||
@@ -77,16 +92,20 @@ def training_function(config):
|
||||
expert_data = (torch.cat(d0), torch.cat(d1), torch.cat(d2), torch.cat(d3))
|
||||
expert_data = Buffer(*expert_data)
|
||||
|
||||
folder = str(datetime.now())
|
||||
os.mkdir(os.path.join(DIR, folder))
|
||||
with open(os.path.join(DIR, folder, 'config.json'), 'w') as f:
|
||||
run_folder = str(datetime.now())
|
||||
os.mkdir(os.path.join(DIR, run_folder))
|
||||
with open(os.path.join(DIR, run_folder, 'config.json'), 'w') as f:
|
||||
json.dump(config, f, indent=4)
|
||||
|
||||
def callback(info):
|
||||
tune.report(gen_mean_reward_per_episode=info['gen/mean_reward_per_episode'])
|
||||
if not info['epoch'] % 10:
|
||||
torch.save(policy.state_dict(), os.path.join(DIR, folder, f'sgail-ppo-options-setobs2-{info["epoch"]}.pt'))
|
||||
torch.save(value.state_dict(), os.path.join(DIR, folder, f'sgail-ppo-options-setobs2-value-{info["epoch"]}.pt'))
|
||||
tune.report(gen_mean_reward_per_episode=info['gen/mean_reward_per_episode'],
|
||||
disc_mean_reward_per_episode=info['disc/mean_reward_per_episode'],
|
||||
mean_episode_length=info['gen/mean_episode_length'])
|
||||
|
||||
# save model checkpoints
|
||||
ep = info['epoch'] + 1
|
||||
if (ep % 25 == 0):
|
||||
torch.save(info['policy'].state_dict(), os.path.join(DIR, run_folder, f'policy_epoch{ep}.pt'))
|
||||
|
||||
value, policy = gail_ppo(
|
||||
env_fn=env_fn,
|
||||
@@ -111,6 +130,9 @@ def training_function(config):
|
||||
lr_schedulers=[pi_lr_scheduler],
|
||||
)
|
||||
|
||||
# save model
|
||||
torch.save(policy.state_dict(), 'policy_final.pt')
|
||||
|
||||
analysis = tune.run(
|
||||
training_function,
|
||||
config={
|
||||
@@ -120,21 +142,25 @@ analysis = tune.run(
|
||||
'abort_unsafe_collision_method': 'circle',
|
||||
},
|
||||
'policy': {
|
||||
'learning_rate': tune.grid_search([3e-4]),
|
||||
'learning_rate_decay': tune.grid_search([1.0]),
|
||||
'clip_ratio': tune.grid_search([0.2]),
|
||||
'iterations_per_epoch': tune.grid_search([100]),
|
||||
'hidden_layer_size': tune.grid_search([25])
|
||||
'learning_rate': 3e-4, # tune.grid_search([3e-4]),
|
||||
'learning_rate_decay': 1.0, #tune.grid_search([1.0]),
|
||||
'clip_ratio': 0.2, #tune.grid_search([0.2]),
|
||||
'iterations_per_epoch': 100, #tune.grid_search([100]),
|
||||
'hidden_layer_size': tune.grid_search([10, 20, 40]),
|
||||
'n_hidden_layers': tune.grid_search([2, 3, 4]),
|
||||
'activation':tune.grid_search([torch.nn.LeakyReLU, torch.nn.Tanh]),
|
||||
'option': tune.grid_search(list(range(len(option_list))))
|
||||
},
|
||||
'value': {
|
||||
'learning_rate': tune.grid_search([1e-3]),
|
||||
'iterations_per_epoch': tune.grid_search([1000]),
|
||||
'learning_rate': 1e-3, # tune.grid_search([1e-3]),
|
||||
'iterations_per_epoch': 1000, #tune.grid_search([1000]),
|
||||
},
|
||||
'discriminator': {
|
||||
'learning_rate': tune.grid_search([1e-3]),
|
||||
'weight_decay': tune.grid_search([1e-4]),
|
||||
'iterations_per_epoch': tune.grid_search([500]),
|
||||
}
|
||||
'learning_rate': 1e-3, #tune.grid_search([1e-3]),
|
||||
'weight_decay': 1e-4, #tune.grid_search([1e-4]),
|
||||
'iterations_per_epoch': 100, #tune.grid_search([100]),
|
||||
},
|
||||
'seed': 0,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -36,30 +36,31 @@ class BasePolicy(nn.Module):
|
||||
|
||||
class Policy(BasePolicy):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
def __init__(self, *args, hidden_layer_size=50, n_hidden_layers=2, activation=nn.Tanh, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.nn = nn.Sequential(
|
||||
nn.LazyLinear(50),
|
||||
nn.Tanh(),
|
||||
nn.LazyLinear(50),
|
||||
nn.Tanh(),
|
||||
nn.LazyLinear(2 * self.action_dim),
|
||||
)
|
||||
layers = sum([[nn.LazyLinear(hidden_layer_size),
|
||||
activation()] for _ in range(n_hidden_layers)],[])
|
||||
self.nn = nn.Sequential(*layers, nn.LazyLinear(2 *self.action_dim))
|
||||
|
||||
# old
|
||||
# self.nn = nn.Sequential(
|
||||
# nn.LazyLinear(50),
|
||||
# nn.Tanh(),
|
||||
# nn.LazyLinear(50),
|
||||
# nn.Tanh(),
|
||||
# nn.LazyLinear(2 * self.action_dim),
|
||||
#)
|
||||
|
||||
def forward(self, states):
|
||||
return self.nn(states)
|
||||
|
||||
class DiscretePolicy(BasePolicy):
|
||||
|
||||
def __init__(self, *args, hidden_layer_size=50, **kwargs):
|
||||
def __init__(self, *args, hidden_layer_size=50, n_hidden_layers=2, activation=nn.Tanh, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.nn = nn.Sequential(
|
||||
nn.LazyLinear(hidden_layer_size),
|
||||
nn.Tanh(),
|
||||
nn.LazyLinear(hidden_layer_size),
|
||||
nn.Tanh(),
|
||||
nn.LazyLinear(self.action_dim),
|
||||
)
|
||||
layers = sum([[nn.LazyLinear(hidden_layer_size),
|
||||
activation()] for _ in range(n_hidden_layers)],[])
|
||||
self.nn = nn.Sequential(*layers, nn.LazyLinear(self.action_dim))
|
||||
|
||||
def forward(self, states):
|
||||
return self.nn(states)
|
||||
|
||||
@@ -37,21 +37,22 @@ def load_policy(method:str,
|
||||
Returns:
|
||||
policy (Optional[BaseAlgorithm]): the policy to evaluate
|
||||
"""
|
||||
ml = torch.device('cpu') if not torch.cuda.is_available() else None
|
||||
if method == 'idm':
|
||||
policy = IDMRulePolicy(env, **policy_kwargs)
|
||||
elif method == 'bc':
|
||||
policy = SetPolicy(env.action_space.shape[-1])
|
||||
policy.load_state_dict(torch.load(policy_file))
|
||||
policy.load_state_dict(torch.load(policy_file, map_location=ml))
|
||||
policy.eval()
|
||||
elif method == 'gail':
|
||||
policy = SetPolicy(env.action_space.shape[-1])
|
||||
policy(torch.zeros(env.observation_space.shape))
|
||||
policy = ReparamPolicy(policy)
|
||||
policy.load_state_dict(torch.load(policy_file))
|
||||
policy.load_state_dict(torch.load(policy_file, map_location=ml))
|
||||
policy.eval()
|
||||
elif method == 'gail-ppo':
|
||||
policy = SetPolicy(env.action_space.shape[-1])
|
||||
policy.load_state_dict(torch.load(policy_file))
|
||||
policy.load_state_dict(torch.load(policy_file, map_location=ml))
|
||||
policy.eval()
|
||||
elif method == 'rail':
|
||||
raise NotImplementedError
|
||||
@@ -59,11 +60,11 @@ def load_policy(method:str,
|
||||
policy = SetDiscretePolicy(env.action_space.n)
|
||||
policy(torch.zeros(env.observation_space.shape))
|
||||
policy = ReparamPolicy(policy)
|
||||
policy.load_state_dict(torch.load(policy_file))
|
||||
policy.load_state_dict(torch.load(policy_file, map_location=ml))
|
||||
policy.eval()
|
||||
elif method == 'ogail-ppo':
|
||||
policy = SetDiscretePolicy(env.action_space.n)
|
||||
policy.load_state_dict(torch.load(policy_file))
|
||||
policy.load_state_dict(torch.load(policy_file, map_location=ml))
|
||||
policy.eval()
|
||||
elif method == 'sgail':
|
||||
policy = SetMaskedDiscretePolicy(env.action_space.n)
|
||||
@@ -72,11 +73,11 @@ def load_policy(method:str,
|
||||
torch.zeros(env.observation_space['safe_actions'].shape)
|
||||
)
|
||||
policy = ReparamSafePolicy(policy)
|
||||
policy.load_state_dict(torch.load(policy_file))
|
||||
policy.load_state_dict(torch.load(policy_file, map_location=ml))
|
||||
policy.eval()
|
||||
elif method == 'sgail-ppo':
|
||||
policy = SetMaskedDiscretePolicy(env.action_space.n)
|
||||
policy.load_state_dict(torch.load(policy_file))
|
||||
policy.load_state_dict(torch.load(policy_file, map_location=ml))
|
||||
policy.eval()
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
@@ -52,7 +52,8 @@ def gail(env_fn, expert_data, discriminator, disc_opt, disc_iters, policy, value
|
||||
|
||||
generator_data.ll.actions += 0.1 * torch.randn_like(generator_data.ll.actions)
|
||||
|
||||
logger.add_scalar('gen/mean_episode_length', (~generator_data.ll.dones).sum() / generator_data.ll.states.shape[0], epoch)
|
||||
gen_mean_episode_length = (~generator_data.ll.dones).sum() / generator_data.ll.states.shape[0]
|
||||
logger.add_scalar('gen/mean_episode_length', gen_mean_episode_length , epoch)
|
||||
gen_mean_reward_per_episode = generator_data.hl.rewards[~generator_data.hl.dones].sum() / generator_data.hl.states.shape[0]
|
||||
logger.add_scalar('gen/mean_reward_per_episode', gen_mean_reward_per_episode, epoch)
|
||||
logger.add_scalar('gen/unsafe_probability_mass', policy.unsafe_probability_mass(policy(generator_data.hl.states[~generator_data.hl.dones], generator_data.hl.safe_actions[~generator_data.hl.dones])).mean(), epoch)
|
||||
@@ -64,7 +65,8 @@ def gail(env_fn, expert_data, discriminator, disc_opt, disc_iters, policy, value
|
||||
else:
|
||||
generator_data.ll.rewards = -F.logsigmoid(discriminator(generator_data.ll.states, generator_data.ll.actions))
|
||||
logger.add_scalar('disc/final_loss', loss, epoch)
|
||||
logger.add_scalar('disc/mean_reward_per_episode', generator_data.ll.rewards[~generator_data.ll.dones].sum() / generator_data.ll.states.shape[0], epoch)
|
||||
disc_mean_reward_per_episode = generator_data.ll.rewards[~generator_data.ll.dones].sum() / generator_data.ll.states.shape[0]
|
||||
logger.add_scalar('disc/mean_reward_per_episode', disc_mean_reward_per_episode , epoch)
|
||||
|
||||
#assert generator_data.ll.rewards.shape == generator_data.ll.dones.shape
|
||||
generator_data.hl.rewards = torch.where(~generator_data.ll.dones, generator_data.ll.rewards, torch.tensor(0.)).sum(-1)
|
||||
@@ -77,7 +79,9 @@ def gail(env_fn, expert_data, discriminator, disc_opt, disc_iters, policy, value
|
||||
'epoch': epoch,
|
||||
'value': value,
|
||||
'policy': policy,
|
||||
'gen/mean_reward_per_episode': gen_mean_reward_per_episode,
|
||||
'gen/mean_episode_length': gen_mean_episode_length.item(),
|
||||
'gen/mean_reward_per_episode': gen_mean_reward_per_episode.item(),
|
||||
'disc/mean_reward_per_episode': disc_mean_reward_per_episode.item(),
|
||||
})
|
||||
|
||||
return value, policy
|
||||
@@ -94,8 +98,8 @@ def gail_ppo(env_fn, expert_data, discriminator, disc_opt, disc_iters, policy, v
|
||||
generator_data = OptionsRollout(HLBuffer(*hl_data), Buffer(*ll_data))
|
||||
|
||||
generator_data.ll.actions += 0.1 * torch.randn_like(generator_data.ll.actions)
|
||||
|
||||
logger.add_scalar('gen/mean_episode_length', (~generator_data.ll.dones).sum() / generator_data.ll.states.shape[0], epoch)
|
||||
gen_mean_episode_length = (~generator_data.ll.dones).sum() / generator_data.ll.states.shape[0]
|
||||
logger.add_scalar('gen/mean_episode_length', gen_mean_episode_length, epoch)
|
||||
gen_mean_reward_per_episode = generator_data.hl.rewards[~generator_data.hl.dones].sum() / generator_data.hl.states.shape[0]
|
||||
logger.add_scalar('gen/mean_reward_per_episode', gen_mean_reward_per_episode, epoch)
|
||||
logger.add_scalar('gen/unsafe_probability_mass', policy.unsafe_probability_mass(policy(generator_data.hl.states[~generator_data.hl.dones], generator_data.hl.safe_actions[~generator_data.hl.dones])).mean(), epoch)
|
||||
@@ -107,7 +111,8 @@ def gail_ppo(env_fn, expert_data, discriminator, disc_opt, disc_iters, policy, v
|
||||
else:
|
||||
generator_data.ll.rewards = -F.logsigmoid(discriminator(generator_data.ll.states, generator_data.ll.actions))
|
||||
logger.add_scalar('disc/final_loss', loss, epoch)
|
||||
logger.add_scalar('disc/mean_reward_per_episode', generator_data.ll.rewards[~generator_data.ll.dones].sum() / generator_data.ll.states.shape[0], epoch)
|
||||
disc_mean_reward_per_episode = generator_data.ll.rewards[~generator_data.ll.dones].sum() / generator_data.ll.states.shape[0]
|
||||
logger.add_scalar('disc/mean_reward_per_episode', disc_mean_reward_per_episode, epoch)
|
||||
|
||||
#assert generator_data.ll.rewards.shape == generator_data.ll.dones.shape
|
||||
generator_data.hl.rewards = torch.where(~generator_data.ll.dones, generator_data.ll.rewards, torch.tensor(0.)).sum(-1)
|
||||
@@ -120,7 +125,9 @@ def gail_ppo(env_fn, expert_data, discriminator, disc_opt, disc_iters, policy, v
|
||||
'epoch': epoch,
|
||||
'value': value,
|
||||
'policy': policy,
|
||||
'gen/mean_reward_per_episode': gen_mean_reward_per_episode,
|
||||
'gen/mean_episode_length': gen_mean_episode_length.item(),
|
||||
'gen/mean_reward_per_episode': gen_mean_reward_per_episode.item(),
|
||||
'disc/mean_reward_per_episode': disc_mean_reward_per_episode.item(),
|
||||
})
|
||||
|
||||
for lr_scheduler in lr_schedulers:
|
||||
@@ -248,8 +255,8 @@ class SafeOptionsEnv(OptionsEnv):
|
||||
if d:
|
||||
break
|
||||
|
||||
if self.abort_unsafe_collision_method is not None and \
|
||||
not feasible(self.env, plan[k:], method=self.abort_unsafe_collision_method):
|
||||
if self.abort_unsafe_collision_method is not None:
|
||||
if not feasible(self.env, plan[k:], method=self.abort_unsafe_collision_method):
|
||||
break
|
||||
|
||||
n_steps = k + 1
|
||||
|
||||
Reference in New Issue
Block a user