adding tool for visualizing acceleration distributions, and making nframes an arg

This commit is contained in:
Arec
2021-07-29 07:35:21 -07:00
parent afc3719ab9
commit 3b4ef6ffb5
4 changed files with 44 additions and 9 deletions

View File

@@ -33,6 +33,8 @@ def parse_args():
default=None, type=str) default=None, type=str)
parser.add_argument('--seed', default=0, type=int, parser.add_argument('--seed', default=0, type=int,
help='seed') help='seed')
parser.add_argument('--nframes', default=500, type=int,
help='frames for test animation')
args = parser.parse_args() args = parser.parse_args()
kwargs = { kwargs = {
'train':args.train, 'train':args.train,
@@ -41,7 +43,8 @@ def parse_args():
'loc':args.loc, 'loc':args.loc,
'config_path':args.config, 'config_path':args.config,
'seed':args.seed, 'seed':args.seed,
'ray':args.ray 'ray':args.ray,
'nframes':args.nframes,
} }
return kwargs return kwargs
@@ -100,6 +103,8 @@ if __name__ == '__main__':
if not os.path.isdir(outdir): if not os.path.isdir(outdir):
os.makedirs(outdir) os.makedirs(outdir)
filestr = opj(outdir, basestr(**kwargs)) filestr = opj(outdir, basestr(**kwargs))
if kwargs['ray']:
filestr = kwargs['config_path'].replace('_config.json','')
main(config, filestr=filestr, **kwargs) main(config, filestr=filestr, **kwargs)
elif kwargs['ray'] and kwargs['train']: elif kwargs['ray'] and kwargs['train']:

View File

@@ -39,7 +39,7 @@ def bc_config(ray_config):
'lr':ray_config['lr'], 'lr':ray_config['lr'],
'weight_decay':ray_config['weight_decay'] 'weight_decay':ray_config['weight_decay']
}, },
'train_epochs': 20, 'train_epochs': 40,
'train_batch_size': ray_config['train_batch_size'], 'train_batch_size': ray_config['train_batch_size'],
'loss': ray_config['loss'], 'loss': ray_config['loss'],

View File

@@ -47,7 +47,7 @@ def main(config, method='bc', train=False, test=False, loc=0, datadir='./expert_
# make policy, train and test datasets, and send to # make policy, train and test datasets, and send to
policy = policy_class(config) policy = policy_class(config)
train_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=[0])#,1,2]) train_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=[0,1,2])
cv_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=[3]) cv_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=[3])
train_fn(config, policy, train_dataset, cv_dataset, filestr, **kwargs) train_fn(config, policy, train_dataset, cv_dataset, filestr, **kwargs)
@@ -59,7 +59,7 @@ def main(config, method='bc', train=False, test=False, loc=0, datadir='./expert_
# simulate policy # simulate policy
track = 4 track = 4
simulate_policy(policy, loc=loc, track=track, filestr=filestr, nframes=500) simulate_policy(policy, loc=loc, track=track, filestr=filestr, nframes=kwargs['nframes'])
# run test metrics # run test metrics
test_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=[track]) test_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=[track])
@@ -101,4 +101,4 @@ def simulate_policy(policy, loc=0, track=0, filestr='', nframes=float('inf')):
pbar.update() pbar.update()
env.close(filestr=filestr) env.close(filestr=filestr+'_sim')

View File

@@ -1,7 +1,8 @@
import torch import torch
import pickle import pickle
import numpy as np import numpy as np
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader
import intersim.collisions import intersim.collisions
def metrics(filestr: str, test_dataset, policy): def metrics(filestr: str, test_dataset, policy):
@@ -26,8 +27,37 @@ def metrics(filestr: str, test_dataset, policy):
# calculate divergence between velocity distributions # calculate divergence between velocity distributions
# calcuate divergence between acceleration distributions # calcuate divergence between acceleration distributions
policy.policy = policy.policy.type(test_dataset[0]['state'].dtype)
pass # generate actions in test dataset
true_actions, pred_actions = [], []
test_loader = DataLoader(test_dataset, batch_size=1024)
with torch.no_grad():
for (batch_idx, batch) in enumerate(test_loader):
pred_actions.append(policy(batch))
true_actions.append(batch['action'])
true_actions, pred_actions = torch.cat(true_actions,dim=0), torch.cat(pred_actions,dim=0)
visualize_distribution(true_actions[:,0], pred_actions[:,0], filestr+'_action_viz')
def visualize_distribution(true, pred, filestr):
"""
Visualize two distributions
Args:
true (torch.tensor): (n,)-sized true distribution
pred (torch.tensor): (m,)-sized pred distribution
filestr (str): string to save figure to
"""
nni1 = ~torch.isnan(true)
nni2 = ~torch.isnan(pred)
import pdb
pdb.set_trace()
plt.figure()
plt.hist(true[nni1].numpy(), density=True, bins=20)
plt.hist(pred[nni2].numpy(), density=True, bins=20)
plt.legend(['True', 'Predicted'])
plt.savefig(filestr+'.png')
def average_velocity(x): def average_velocity(x):
""" """
@@ -40,7 +70,7 @@ def divergence(p, q, type='kl'):
Calculate a divergence between p and q Calculate a divergence between p and q
Args: Args:
p (torch.tensor): (n) samples from p p (torch.tensor): (n) samples from p
q (torch.tensor): (n) samples from q q (torch.tensor): (m) samples from q
Returns: Returns:
d (float): approximate divergence d (float): approximate divergence
""" """