supervised_reptile/args.py (73 lines of code) (raw):

""" Command-line argument parsing. """ import argparse from functools import partial import tensorflow as tf from .reptile import Reptile, FOML def argument_parser(): """ Get an argument parser for a training script. """ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--pretrained', help='evaluate a pre-trained model', action='store_true', default=False) parser.add_argument('--seed', help='random seed', default=0, type=int) parser.add_argument('--checkpoint', help='checkpoint directory', default='model_checkpoint') parser.add_argument('--classes', help='number of classes per inner task', default=5, type=int) parser.add_argument('--shots', help='number of examples per class', default=5, type=int) parser.add_argument('--train-shots', help='shots in a training batch', default=0, type=int) parser.add_argument('--inner-batch', help='inner batch size', default=5, type=int) parser.add_argument('--inner-iters', help='inner iterations', default=20, type=int) parser.add_argument('--replacement', help='sample with replacement', action='store_true') parser.add_argument('--learning-rate', help='Adam step size', default=1e-3, type=float) parser.add_argument('--meta-step', help='meta-training step size', default=0.1, type=float) parser.add_argument('--meta-step-final', help='meta-training step size by the end', default=0.1, type=float) parser.add_argument('--meta-batch', help='meta-training batch size', default=1, type=int) parser.add_argument('--meta-iters', help='meta-training iterations', default=400000, type=int) parser.add_argument('--eval-batch', help='eval inner batch size', default=5, type=int) parser.add_argument('--eval-iters', help='eval inner iterations', default=50, type=int) parser.add_argument('--eval-samples', help='evaluation samples', default=10000, type=int) parser.add_argument('--eval-interval', help='train steps per eval', default=10, type=int) parser.add_argument('--weight-decay', help='weight decay rate', default=1, type=float) parser.add_argument('--transductive', help='evaluate all samples at once', action='store_true') parser.add_argument('--foml', help='use FOML instead of Reptile', action='store_true') parser.add_argument('--foml-tail', help='number of shots for the final mini-batch in FOML', default=None, type=int) parser.add_argument('--sgd', help='use vanilla SGD instead of Adam', action='store_true') return parser def model_kwargs(parsed_args): """ Build the kwargs for model constructors from the parsed command-line arguments. """ res = {'learning_rate': parsed_args.learning_rate} if parsed_args.sgd: res['optimizer'] = tf.train.GradientDescentOptimizer return res def train_kwargs(parsed_args): """ Build kwargs for the train() function from the parsed command-line arguments. """ return { 'num_classes': parsed_args.classes, 'num_shots': parsed_args.shots, 'train_shots': (parsed_args.train_shots or None), 'inner_batch_size': parsed_args.inner_batch, 'inner_iters': parsed_args.inner_iters, 'replacement': parsed_args.replacement, 'meta_step_size': parsed_args.meta_step, 'meta_step_size_final': parsed_args.meta_step_final, 'meta_batch_size': parsed_args.meta_batch, 'meta_iters': parsed_args.meta_iters, 'eval_inner_batch_size': parsed_args.eval_batch, 'eval_inner_iters': parsed_args.eval_iters, 'eval_interval': parsed_args.eval_interval, 'weight_decay_rate': parsed_args.weight_decay, 'transductive': parsed_args.transductive, 'reptile_fn': _args_reptile(parsed_args) } def evaluate_kwargs(parsed_args): """ Build kwargs for the evaluate() function from the parsed command-line arguments. """ return { 'num_classes': parsed_args.classes, 'num_shots': parsed_args.shots, 'eval_inner_batch_size': parsed_args.eval_batch, 'eval_inner_iters': parsed_args.eval_iters, 'replacement': parsed_args.replacement, 'weight_decay_rate': parsed_args.weight_decay, 'num_samples': parsed_args.eval_samples, 'transductive': parsed_args.transductive, 'reptile_fn': _args_reptile(parsed_args) } def _args_reptile(parsed_args): if parsed_args.foml: return partial(FOML, tail_shots=parsed_args.foml_tail) return Reptile