Skip to content

Commit

Permalink
Use click instead of climate.
Browse files Browse the repository at this point in the history
  • Loading branch information
Leif Johnson committed Jun 3, 2018
1 parent 804e909 commit bddec88
Showing 1 changed file with 70 additions and 80 deletions.
150 changes: 70 additions & 80 deletions scripts/theanets-char-rnn
Expand Up @@ -5,97 +5,86 @@ import logging
import numpy as np
import theanets

g = climate.add_group('Data')
g.add_argument('-d', '--data', nargs='+', metavar='FILE',
help='load text from FILE')
g.add_argument('-t', '--time', default=100, type=int, metavar='T',
help='train on sequences of T characters')
g.add_argument('-a', '--alphabet', default='', metavar='CHARS',
help='use CHARS for alphabet; defaults to all chars in text')
g.add_argument('-A', '--exclude-alphabet', default='', metavar='CHARS',
help='discard CHARS from alphabet')

g = climate.add_group('Architecture')
g.add_argument('-l', '--layers', nargs='+', type=int, default=[100], metavar='N',
help='construct a network with layers of size N1, N2, ...')
g.add_argument('-L', '--layer-type', default='lstm', metavar='{rnn|gru|lstm|clockwork}',
help='construct a network with this RNN layer type')
g.add_argument('-g', '--activation', default='relu', metavar='FUNC',
help='function for hidden unit activations')

g = climate.add_group('Training')
g.add_argument('-O', '--algorithm', default=['nag'], nargs='+', metavar='ALGO',
@click.command()
@click.option('-d', '--data', multiple=True, metavar='FILE',
help='load text from FILE')
@click.option('-t', '--time', default=100, type=int, metavar='T',
help='train on sequences of T characters')
@click.option('-a', '--alphabet', default='', metavar='CHARS',
help='use CHARS for alphabet; defaults to all chars in text')
@click.option('-A', '--exclude-alphabet', default='', metavar='CHARS',
help='discard CHARS from alphabet')
@click.option('-l', '--layers', multiple=True, type=int, default=[100], metavar='N',
help='construct a network with layers of size N1, N2, ...')
@click.option('-L', '--layer-type', default='lstm', metavar='{rnn|gru|lstm|clockwork}',
help='construct a network with this RNN layer type')
@click.option('-g', '--activation', default='relu', metavar='FUNC',
help='function for hidden unit activations')
@click.option('-O', '--algorithm', default=['nag'], multiple=True, metavar='ALGO',
help='train with the given optimization algorithm(s)')
g.add_argument('-p', '--patience', type=int, default=4, metavar='N',
@click.option('-p', '--patience', type=int, default=4, metavar='N',
help='stop training if less than --min-improvement for N validations')
g.add_argument('-v', '--validate-every', type=int, default=10, metavar='N',
@click.option('-v', '--validate-every', type=int, default=10, metavar='N',
help='validate the model every N updates')
g.add_argument('-b', '--batch-size', type=int, default=64, metavar='N',
@click.option('-b', '--batch-size', type=int, default=64, metavar='N',
help='train with mini-batches of size N')
g.add_argument('-B', '--train-batches', type=int, metavar='N',
@click.option('-B', '--train-batches', type=int, metavar='N',
help='use at most N batches during gradient computations')
g.add_argument('-V', '--valid-batches', type=int, metavar='N',
@click.option('-V', '--valid-batches', type=int, metavar='N',
help='use at most N batches during validation')
g.add_argument('-i', '--min-improvement', type=float, default=0, metavar='R',
@click.option('-i', '--min-improvement', type=float, default=0, metavar='R',
help='train until relative improvement is less than R')
g.add_argument('-x', '--max-gradient-norm', type=float, default=1, metavar='V',
@click.option('-x', '--max-gradient-norm', type=float, default=1, metavar='V',
help='clip gradient norm to the interval [0, V]')
g.add_argument('-r', '--learning-rate', type=float, default=1e-4, metavar='V',
@click.option('-r', '--learning-rate', type=float, default=1e-4, metavar='V',
help='train the network with a learning rate of V')
g.add_argument('-m', '--momentum', type=float, default=0.9, metavar='V',
@click.option('-m', '--momentum', type=float, default=0.9, metavar='V',
help='train the network with momentum of V')
g.add_argument('-n', '--nesterov', action='store_true',
help='use Nesterov momentum')
g.add_argument('-s', '--save-progress', metavar='FILE',
@click.option('-n', '--nesterov/--no-nesterov', help='use Nesterov momentum')
@click.option('-s', '--save-progress', metavar='FILE',
help='save the model periodically to FILE')
g.add_argument('-S', '--save-every', type=float, default=0, metavar='N',
@click.option('-S', '--save-every', type=float, default=0, metavar='N',
help='save the model every N iterations or -N minutes')

g = climate.add_group('Regularization')
g.add_argument('--input-noise', type=float, default=0, metavar='S',
@click.option('--input-noise', type=float, default=0, metavar='S',
help='add noise to network inputs drawn from N(0, S)')
g.add_argument('--input-dropouts', type=float, default=0, metavar='R',
@click.option('--input-dropouts', type=float, default=0, metavar='R',
help='randomly set fraction R of input activations to 0')
g.add_argument('--hidden-noise', type=float, default=0, metavar='S',
@click.option('--hidden-noise', type=float, default=0, metavar='S',
help='add noise to hidden activations drawn from N(0, S)')
g.add_argument('--hidden-dropouts', type=float, default=0, metavar='R',
@click.option('--hidden-dropouts', type=float, default=0, metavar='R',
help='randomly set fraction R of hidden activations to 0')
g.add_argument('--hidden-l1', type=float, default=0, metavar='K',
@click.option('--hidden-l1', type=float, default=0, metavar='K',
help='regularize hidden activity with K on the L1 term')
g.add_argument('--hidden-l2', type=float, default=0, metavar='K',
@click.option('--hidden-l2', type=float, default=0, metavar='K',
help='regularize hidden activity with K on the L2 term')
g.add_argument('--weight-l1', type=float, default=0, metavar='K',
@click.option('--weight-l1', type=float, default=0, metavar='K',
help='regularize network weights with K on the L1 term')
g.add_argument('--weight-l2', type=float, default=0, metavar='K',
@click.option('--weight-l2', type=float, default=0, metavar='K',
help='regularize network weights with K on the L2 term')

g = climate.add_group('RmsProp Optimization')
g.add_argument('--rms-halflife', type=float, default=5, metavar='N',
@click.option('--rms-halflife', type=float, default=5, metavar='N',
help='use a half-life of N for RMS exponential moving averages')
g.add_argument('--rms-regularizer', type=float, default=1e-8, metavar='N',
@click.option('--rms-regularizer', type=float, default=1e-8, metavar='N',
help='regularize RMS exponential moving averages by N')


def main(args):
def main(**kwargs):
corpus = []
for f in args.data:
for f in kwargs['data']:
corpus.append(open(f).read())
logging.info('%s: loaded training document', f)
logging.info('loaded %d training documents', len(corpus))

alpha = set(args.alphabet)
alpha = set(kwargs['alphabet'])
if not alpha:
for c in corpus:
alpha |= set(c)
alpha -= set(args.exclude_alphabet)
alpha -= set(kwargs['exclude_alphabet'])
alpha = sorted(alpha)
logging.info('character alphabet: %s', alpha)

# encode document chars as integer alphabet index values.
encoded = [np.array([alpha.index(c) for c in doc]) for doc in corpus]

def batch():
T, B = args.time, args.batch_size
T, B = kwargs['time'], kwargs['batch_size']
inputs = np.zeros((T, B, len(alpha)), 'f')
outputs = np.zeros((T, B), 'i')
enc = np.random.choice(encoded)
Expand All @@ -106,40 +95,41 @@ def main(args):
return [inputs, outputs]

layers = [len(alpha)]
for l in args.layers:
layers.append(
dict(size=l, form=args.layer_type, activation=args.activation))
for l in kwargs['layers']:
layers.append(dict(size=l,
form=kwargs['layer_type'],
activation=kwargs['activation']))
layers.append(len(alpha))

exp = theanets.Experiment(theanets.recurrent.Classifier, layers=layers)

exp.train(
batch,
algo=args.algorithm,
patience=args.patience,
min_improvement=args.min_improvement,
validate_every=args.validate_every,
batch_size=args.batch_size,
train_batches=args.train_batches,
valid_batches=args.valid_batches,
learning_rate=args.learning_rate,
momentum=args.momentum,
nesterov=args.nesterov,
save_progress=args.save_progress,
save_every=args.save_every,
weight_l1=args.weight_l1,
weight_l2=args.weight_l2,
hidden_l2=args.hidden_l2,
hidden_l1=args.hidden_l1,
input_noise=args.input_noise,
input_dropouts=args.input_dropouts,
hidden_noise=args.hidden_noise,
hidden_dropouts=args.hidden_dropouts,
algo=kwargs['algorithm'],
patience=kwargs['patience'],
min_improvement=kwargs['min_improvement'],
validate_every=kwargs['validate_every'],
batch_size=kwargs['batch_size'],
train_batches=kwargs['train_batches'],
valid_batches=kwargs['valid_batches'],
learning_rate=kwargs['learning_rate'],
momentum=kwargs['momentum'],
nesterov=kwargs['nesterov'],
save_progress=kwargs['save_progress'],
save_every=kwargs['save_every'],
weight_l1=kwargs['weight_l1'],
weight_l2=kwargs['weight_l2'],
hidden_l2=kwargs['hidden_l2'],
hidden_l1=kwargs['hidden_l1'],
input_noise=kwargs['input_noise'],
input_dropouts=kwargs['input_dropouts'],
hidden_noise=kwargs['hidden_noise'],
hidden_dropouts=kwargs['hidden_dropouts'],
)

if args.save_progress:
exp.save(args.save_progress)
if kwargs['save_progress']:
exp.save(kwargs['save_progress'])


if __name__ == '__main__':
climate.call(main)
main()

0 comments on commit bddec88

Please sign in to comment.