Merge branch 'main' into idm_upgrade

This commit is contained in:
Johannes Fischer
2022-03-01 09:58:07 +01:00
41 changed files with 94 additions and 298 deletions

View File

@@ -142,7 +142,7 @@ if __name__ == '__main__':
import argparse import argparse
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('--train', choices=['A', 'B']) parser.add_argument('--train', choices=['A', 'B'])
parser.add_argument('--epochs', type=int, default=1000) parser.add_argument('--epochs', type=int, default=500)
parser.add_argument('--test', type=str, help='path to config file to run final training on') parser.add_argument('--test', type=str, help='path to config file to run final training on')
parser.add_argument('--test_seeds', type=int, default=5) parser.add_argument('--test_seeds', type=int, default=5)
parser.add_argument('--test_cpus', type=int, help='number of cpus available to split test seed training over') parser.add_argument('--test_cpus', type=int, help='number of cpus available to split test seed training over')
@@ -162,10 +162,10 @@ if __name__ == '__main__':
}, },
'policy': { 'policy': {
'learning_rate': 3e-4, 'learning_rate': 3e-4,
'learning_rate_decay': 1.0, 'learning_rate_decay': tune.grid_search([0.999, 1.0]),
'hidden_layer_size': tune.grid_search([20, 40]), 'hidden_layer_size': tune.grid_search([10, 20, 40]),
'n_hidden_layers': tune.grid_search([2, 3]), 'n_hidden_layers': tune.grid_search([2, 3]),
'activation':0, 'activation':tune.grid_search([0, 1]),
}, },
'train_epochs': args.epochs, 'train_epochs': args.epochs,
'seed': 0, 'seed': 0,
@@ -210,3 +210,5 @@ if __name__ == '__main__':
check_dir = analysis._checkpoints[i]['logdir'] check_dir = analysis._checkpoints[i]['logdir']
shutil.copyfile(os.path.join(check_dir,'policy_final.pt'), shutil.copyfile(os.path.join(check_dir,'policy_final.pt'),
os.path.join(savepath, f'policy_seed{s}.pt')) os.path.join(savepath, f'policy_seed{s}.pt'))
shutil.copyfile(os.path.join(check_dir,'params.json'),
os.path.join(savepath, 'config.json')) # copy config automatically

View File

@@ -1,33 +0,0 @@
{
"experiment": "A",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": null,
"abort_unsafe_collision_method": null
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 10,
"n_hidden_layers": 3,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,33 +0,0 @@
{
"experiment": "B",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": null,
"abort_unsafe_collision_method": null
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 10,
"n_hidden_layers": 3,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,33 +0,0 @@
{
"experiment": "B",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": null,
"abort_unsafe_collision_method": null
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 40,
"n_hidden_layers": 3,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,33 +0,0 @@
{
"experiment": "A",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": null,
"abort_unsafe_collision_method": null
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 20,
"n_hidden_layers": 4,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,33 +0,0 @@
{
"experiment": "A",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": "circle",
"abort_unsafe_collision_method": "circle"
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 10,
"n_hidden_layers": 3,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,33 +0,0 @@
{
"experiment": "B",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": "circle",
"abort_unsafe_collision_method": "circle"
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 10,
"n_hidden_layers": 3,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,33 +0,0 @@
{
"experiment": "B",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": "circle",
"abort_unsafe_collision_method": "circle"
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 40,
"n_hidden_layers": 3,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,33 +0,0 @@
{
"experiment": "A",
"trainenv": {
"stop_on_collision": false,
"safe_actions_collision_method": "circle",
"abort_unsafe_collision_method": "circle"
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"clip_ratio": 0.2,
"iterations_per_epoch": 100,
"hidden_layer_size": 20,
"n_hidden_layers": 4,
"activation": 0,
"option": 0
},
"value": {
"learning_rate": 0.001,
"iterations_per_epoch": 1000
},
"discriminator": {
"learning_rate": 0.001,
"weight_decay": 0.0001,
"iterations_per_epoch": 100,
"n_hidden_layers_element": 3,
"n_hidden_layers_global": 2,
"hidden_layer_size": 10,
"activation": 0
},
"train_epochs": 100,
"seed": 0
}

View File

@@ -1,17 +1,23 @@
import os import os
from src.eval_main import eval_main from src.eval_main import eval_main
from src.evaluation.utils import load_and_average from src.evaluation.utils import load_and_average
import torch
import json
activations = [torch.nn.Tanh, torch.nn.LeakyReLU]
def main(method:str='expert', folder:str=None, locations=[(0,0)], skip_running=False): def main(method:str='expert', folder:str=None, locations=[(0,0)], skip_running=False):
exclude_keys_from_policy_kwargs = {'learning_rate', 'learning_rate_decay', 'clip_ratio', 'iterations_per_epoch', 'option'}
policy_kwargs = {} policy_kwargs = {}
if method in ['expert', 'idm']: if method in ['expert', 'idm']:
env, env_kwargs ='NRasterizedRouteIncrementingAgent', {} env, env_kwargs ='NRasterizedRouteIncrementingAgent', {}
elif method in ['bc','gail']: elif method in ['bc','gail']:
env='NormalizedContinuousEvalEnv' env='NormalizedContinuousEvalEnv'
env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000} env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000}
elif method in ['hail']: elif method in ['hail']:
env = 'NormalizedOptionsEvalEnv' env = 'NormalizedSafeOptionsEvalEnv'
env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000, 'safe_actions_collision_method': None, 'abort_unsafe_collision_method': None} env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000, 'safe_actions_collision_method': None, 'abort_unsafe_collision_method': None}
elif method in ['shail']: elif method in ['shail']:
env = 'NormalizedSafeOptionsEvalEnv' env = 'NormalizedSafeOptionsEvalEnv'
@@ -23,7 +29,18 @@ def main(method:str='expert', folder:str=None, locations=[(0,0)], skip_running=F
if folder is not None: if folder is not None:
files = [os.path.join(folder, f) for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))] files = [os.path.join(folder, f) for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))]
print('%i folders found in %s folder' %(len(files), folder)) files = [f for f in files if f.endswith('.pt')]
with open(os.path.join(folder, 'config.json'), 'rb') as f:
config = json.load(f)
print('%i policy files found in %s folder' %(len(files), folder))
print('found policy config', config['policy'])
policy_config = {k: v for k, v in config['policy'].items() if k not in exclude_keys_from_policy_kwargs}
policy_config['activation'] = activations[policy_config['activation']]
print('final policy config', policy_config)
policy_kwargs.update(policy_config)
print('final policy kwargs', policy_kwargs)
if not skip_running: if not skip_running:
for policy_file in files: for policy_file in files:
@@ -60,7 +77,7 @@ def latex_print(am, light=False):
print('success rate, distance travelled, RWSE_10, |DeltaV|, AccelJSD') print('success rate, distance travelled, RWSE_10, |DeltaV|, AccelJSD')
if light: if light:
if 'rwse_10s' in am.keys(): if 'rwse_10s' in am.keys():
print("%2.1f& %2.1f & %1.2f & %2.1f& " print("%2.1f& %2.1f & %2.1f & %1.2f& "
"%0.3f \\\\" %( 100*am['success rate'][0], am['mean travel distance'][0], am['rwse_10s'][0], "%0.3f \\\\" %( 100*am['success rate'][0], am['mean travel distance'][0], am['rwse_10s'][0],
am['average absolute average velocity'][0],am['acceleration distribution divergence'][0] )) am['average absolute average velocity'][0],am['acceleration distribution divergence'][0] ))
return return
@@ -71,7 +88,7 @@ def latex_print(am, light=False):
return return
print("%2.1f \\scriptstyle\\pm %2.1f & %2.1f \\scriptstyle\\pm %2.1f & " print("%2.1f \\scriptstyle\\pm %2.1f & %2.1f \\scriptstyle\\pm %2.1f & "
"%1.2f \\scriptstyle\\pm %1.2f & %2.1f \\scriptstyle\\pm %1.1f & " "%2.1f \\scriptstyle\\pm %1.1f & %1.2f \\scriptstyle\\pm %1.2f & "
"%0.3f \\scriptstyle\\pm %0.3f \\\\" %( 100*am['success rate'][0], 100*am['success rate'][1], "%0.3f \\scriptstyle\\pm %0.3f \\\\" %( 100*am['success rate'][0], 100*am['success rate'][1],
am['mean travel distance'][0] , am['mean travel distance'][1] , am['mean travel distance'][0] , am['mean travel distance'][1] ,
am['rwse_10s'][0] , am['rwse_10s'][1] , am['rwse_10s'][0] , am['rwse_10s'][1] ,

View File

@@ -236,3 +236,5 @@ if __name__ == '__main__':
check_dir = analysis._checkpoints[i]['logdir'] check_dir = analysis._checkpoints[i]['logdir']
shutil.copyfile(os.path.join(check_dir,'policy_final.pt'), shutil.copyfile(os.path.join(check_dir,'policy_final.pt'),
os.path.join(savepath, f'policy_seed{s}.pt')) os.path.join(savepath, f'policy_seed{s}.pt'))
shutil.copyfile(os.path.join(check_dir,'params.json'),
os.path.join(savepath, 'config.json')) # copy config automatically

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.

View File

@@ -247,8 +247,17 @@ if __name__ == '__main__':
os.makedirs(savepath) os.makedirs(savepath)
import shutil import shutil
# save config
shutil.copyfile(
args.test,
os.path.join(savepath, 'config.json')
)
for i in range(args.test_seeds): for i in range(args.test_seeds):
s = analysis._checkpoints[i]['config']['seed'] s = analysis._checkpoints[i]['config']['seed']
check_dir = analysis._checkpoints[i]['logdir'] check_dir = analysis._checkpoints[i]['logdir']
shutil.copyfile(os.path.join(check_dir,'policy_final.pt'), shutil.copyfile(os.path.join(check_dir,'policy_final.pt'),
os.path.join(savepath, f'policy_seed{s}.pt')) os.path.join(savepath, f'policy_seed{s}.pt'))
shutil.copyfile(os.path.join(check_dir,'params.json'),
os.path.join(savepath, 'config.json')) # copy config automatically

View File

@@ -41,33 +41,33 @@ def load_policy(method:str,
if method == 'idm': if method == 'idm':
policy = IDMRulePolicy(env, **policy_kwargs) policy = IDMRulePolicy(env, **policy_kwargs)
elif method == 'bc': elif method == 'bc':
policy = SetPolicy(env.action_space.shape[-1]) policy = SetPolicy(env.action_space.shape[-1], **policy_kwargs)
policy.load_state_dict(torch.load(policy_file, map_location=ml)) policy.load_state_dict(torch.load(policy_file, map_location=ml))
policy.eval() policy.eval()
elif method == 'gail-trpo': elif method == 'gail-trpo':
policy = SetPolicy(env.action_space.shape[-1]) policy = SetPolicy(env.action_space.shape[-1], **policy_kwargs)
policy(torch.zeros(env.observation_space.shape)) policy(torch.zeros(env.observation_space.shape))
policy = ReparamPolicy(policy) policy = ReparamPolicy(policy)
policy.load_state_dict(torch.load(policy_file, map_location=ml)) policy.load_state_dict(torch.load(policy_file, map_location=ml))
policy.eval() policy.eval()
elif method == 'gail': elif method == 'gail':
policy = SetPolicy(env.action_space.shape[-1]) policy = SetPolicy(env.action_space.shape[-1], **policy_kwargs)
policy.load_state_dict(torch.load(policy_file, map_location=ml)) policy.load_state_dict(torch.load(policy_file, map_location=ml))
policy.eval() policy.eval()
elif method == 'rail': elif method == 'rail':
raise NotImplementedError raise NotImplementedError
elif method == 'hail-trpo': elif method == 'hail-trpo':
policy = SetDiscretePolicy(env.action_space.n) policy = SetMaskedDiscretePolicy(env.action_space.n, **policy_kwargs)
policy(torch.zeros(env.observation_space.shape)) policy(torch.zeros(env.observation_space.shape))
policy = ReparamPolicy(policy) policy = ReparamPolicy(policy)
policy.load_state_dict(torch.load(policy_file, map_location=ml)) policy.load_state_dict(torch.load(policy_file, map_location=ml))
policy.eval() policy.eval()
elif method == 'hail': elif method == 'hail':
policy = SetDiscretePolicy(env.action_space.n) policy = SetMaskedDiscretePolicy(env.action_space.n, **policy_kwargs)
policy.load_state_dict(torch.load(policy_file, map_location=ml)) policy.load_state_dict(torch.load(policy_file, map_location=ml))
policy.eval() policy.eval()
elif method == 'shail-trpo': elif method == 'shail-trpo':
policy = SetMaskedDiscretePolicy(env.action_space.n) policy = SetMaskedDiscretePolicy(env.action_space.n, **policy_kwargs)
policy( policy(
torch.zeros(env.observation_space['observation'].shape), torch.zeros(env.observation_space['observation'].shape),
torch.zeros(env.observation_space['safe_actions'].shape) torch.zeros(env.observation_space['safe_actions'].shape)
@@ -76,7 +76,7 @@ def load_policy(method:str,
policy.load_state_dict(torch.load(policy_file, map_location=ml)) policy.load_state_dict(torch.load(policy_file, map_location=ml))
policy.eval() policy.eval()
elif method == 'shail': elif method == 'shail':
policy = SetMaskedDiscretePolicy(env.action_space.n) policy = SetMaskedDiscretePolicy(env.action_space.n, **policy_kwargs)
policy.load_state_dict(torch.load(policy_file, map_location=ml)) policy.load_state_dict(torch.load(policy_file, map_location=ml))
policy.eval() policy.eval()
else: else:

View File

@@ -0,0 +1,15 @@
{
"experiment": "A",
"trainenv": {
"stop_on_collision": false
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"hidden_layer_size": 40,
"n_hidden_layers": 2,
"activation": 0
},
"train_epochs": 300,
"seed": 0
}

View File

@@ -0,0 +1,15 @@
{
"experiment": "B",
"trainenv": {
"stop_on_collision": false
},
"policy": {
"learning_rate": 0.0003,
"learning_rate_decay": 1.0,
"hidden_layer_size": 40,
"n_hidden_layers": 2,
"activation": 0
},
"train_epochs": 300,
"seed": 0
}

View File

@@ -6,7 +6,7 @@
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,
"learning_rate_decay": 1.0, "learning_rate_decay": 1.0,
"delta": 0.01, "clip_ratio": 0.2,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"hidden_layer_size": 40, "hidden_layer_size": 40,
"n_hidden_layers": 2, "n_hidden_layers": 2,

View File

@@ -6,7 +6,7 @@
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,
"learning_rate_decay": 1.0, "learning_rate_decay": 1.0,
"delta": 0.01, "clip_ratio": 0.2,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"hidden_layer_size": 40, "hidden_layer_size": 40,
"n_hidden_layers": 2, "n_hidden_layers": 2,

View File

@@ -11,7 +11,7 @@
"clip_ratio": 0.2, "clip_ratio": 0.2,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"hidden_layer_size": 40, "hidden_layer_size": 40,
"n_hidden_layers": 3, "n_hidden_layers": 2,
"activation": 0, "activation": 0,
"option": 0 "option": 0
}, },
@@ -23,11 +23,11 @@
"learning_rate": 0.001, "learning_rate": 0.001,
"weight_decay": 0.0001, "weight_decay": 0.0001,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"n_hidden_layers_element": 3, "n_hidden_layers_element": 4,
"n_hidden_layers_global": 2, "n_hidden_layers_global": 1,
"hidden_layer_size": 10, "hidden_layer_size": 10,
"activation": 0 "activation": 0
}, },
"train_epochs": 100, "train_epochs": 90,
"seed": 0 "seed": 0
} }

View File

@@ -11,7 +11,7 @@
"clip_ratio": 0.2, "clip_ratio": 0.2,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"hidden_layer_size": 20, "hidden_layer_size": 20,
"n_hidden_layers": 4, "n_hidden_layers": 2,
"activation": 0, "activation": 0,
"option": 0 "option": 0
}, },
@@ -23,11 +23,11 @@
"learning_rate": 0.001, "learning_rate": 0.001,
"weight_decay": 0.0001, "weight_decay": 0.0001,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"n_hidden_layers_element": 3, "n_hidden_layers_element": 4,
"n_hidden_layers_global": 2, "n_hidden_layers_global": 2,
"hidden_layer_size": 10, "hidden_layer_size": 10,
"activation": 0 "activation": 0
}, },
"train_epochs": 100, "train_epochs": 85,
"seed": 0 "seed": 0
} }

View File

@@ -11,7 +11,7 @@
"clip_ratio": 0.2, "clip_ratio": 0.2,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"hidden_layer_size": 40, "hidden_layer_size": 40,
"n_hidden_layers": 3, "n_hidden_layers": 2,
"activation": 0, "activation": 0,
"option": 0 "option": 0
}, },
@@ -23,11 +23,11 @@
"learning_rate": 0.001, "learning_rate": 0.001,
"weight_decay": 0.0001, "weight_decay": 0.0001,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"n_hidden_layers_element": 3, "n_hidden_layers_element": 4,
"n_hidden_layers_global": 2, "n_hidden_layers_global": 1,
"hidden_layer_size": 10, "hidden_layer_size": 10,
"activation": 0 "activation": 0
}, },
"train_epochs": 100, "train_epochs": 90,
"seed": 0 "seed": 0
} }

View File

@@ -11,7 +11,7 @@
"clip_ratio": 0.2, "clip_ratio": 0.2,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"hidden_layer_size": 20, "hidden_layer_size": 20,
"n_hidden_layers": 4, "n_hidden_layers": 2,
"activation": 0, "activation": 0,
"option": 0 "option": 0
}, },
@@ -23,11 +23,11 @@
"learning_rate": 0.001, "learning_rate": 0.001,
"weight_decay": 0.0001, "weight_decay": 0.0001,
"iterations_per_epoch": 100, "iterations_per_epoch": 100,
"n_hidden_layers_element": 3, "n_hidden_layers_element": 4,
"n_hidden_layers_global": 2, "n_hidden_layers_global": 2,
"hidden_layer_size": 10, "hidden_layer_size": 10,
"activation": 0 "activation": 0
}, },
"train_epochs": 100, "train_epochs": 85,
"seed": 0 "seed": 0
} }