File size: 7,621 Bytes
69defc9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import os
import time
import argparse

parser = argparse.ArgumentParser(description='Generates emotion-based symbolic music')

parser.add_argument("--conditioning", type=str, required=False, default="continuous_concat",
                    choices=["none", "discrete_token", "continuous_token",
                             "continuous_concat"], help='Conditioning type')
parser.add_argument("--data_folder", type=str, default="../data_files/lpd_5/lpd_5_full_transposable")
parser.add_argument('--full_dataset', action="store_true",
                    help='Use LPD-full dataset')
parser.add_argument('--n_layer', type=int, default=20,
                    help='number of total layers')
parser.add_argument('--n_head', type=int, default=16,
                    help='number of heads')
parser.add_argument('--d_model', type=int, default=768,
                    help='model dimension')
parser.add_argument('--d_condition', type=int, default=192,
                    help='condition dimension (if continuous_concat is used)')
parser.add_argument('--d_inner', type=int, default=768*4,
                    help='inner dimension in FF')
parser.add_argument('--tgt_len', type=int, default=1216, 
                    help='number of tokens to predict')
parser.add_argument('--max_gen_input_len', type=int, default=-1,
                    help='number of tokens to predict')
parser.add_argument('--gen_len', type=int, default=2048,
                    help='Generation length')
parser.add_argument('--temp_note', type=float, default=1.2,
                    help='Temperature for generating notes')
parser.add_argument('--temp_rest', type=float, default=1.2,
                    help='Temperature for generating rests')
parser.add_argument('--n_bars', type=int, default=-1,
                    help='number of bars to use')
parser.add_argument('--no_pad', action='store_true',
                    help='dont pad sequences')
parser.add_argument('--eval_tgt_len', type=int, default=-1,
                    help='number of tokens to predict for evaluation')
parser.add_argument('--dropout', type=float, default=0.1,
                    help='global dropout rate')
parser.add_argument("--overwrite_dropout", action="store_true",
                    help="resets dropouts")
parser.add_argument('--lr', type=float, default=2e-5,
                    help='initial learning rate (0.00025|5 for adam|sgd)')
parser.add_argument("--overwrite_lr", action="store_true", 
                    help="Overwrites learning rate if pretrained model is loaded.")
parser.add_argument('--arousal_feature', default='note_density', type=str,
                    choices=['tempo', 'note_density'],
                    help='Feature to use as arousal feature')
parser.add_argument('--scheduler', default='constant', type=str,
                    choices=['cosine', 'inv_sqrt', 'dev_perf', 'constant', "cyclic"],
                    help='lr scheduler to use.')
parser.add_argument('--lr_min', type=float, default=5e-6,
                    help='minimum learning rate for cyclic scheduler')
parser.add_argument('--lr_max', type=float, default=5e-3,
                    help='maximum learning rate for cyclic scheduler')
parser.add_argument('--warmup_step', type=int, default=0,
                    help='upper epoch limit')
parser.add_argument('--decay_rate', type=float, default=0.5,
                    help='decay factor when ReduceLROnPlateau is used')
parser.add_argument('--clip', type=float, default=1.0,
                    help='gradient clipping')
parser.add_argument('--batch_size', type=int, default=4,
                    help='batch size')
parser.add_argument('--accumulate_step', type=int, default=1,
                    help='accumulate gradients (multiplies effective batch size')
parser.add_argument('--seed', type=int, default=-1,
                    help='random seed')
parser.add_argument('--no_cuda', action='store_true',
                    help='use CPU')
parser.add_argument('--log_step', type=int, default=1000,
                    help='report interval')
parser.add_argument('--eval_step', type=int, default=8000,
                    help='evaluation interval')
parser.add_argument('--max_eval_step', type=int, default=1000,
                    help='maximum evaluation steps')
parser.add_argument('--gen_step', type=int, default=8000,
                    help='generation interval')
parser.add_argument('--work_dir', default='../output', type=str,
                    help='experiment directory.')
parser.add_argument('--restart_dir', type=str, default=None,
                    help='restart dir')
parser.add_argument('--debug', action='store_true',
                    help='run in debug mode (do not create exp dir)')
parser.add_argument('--max_step', type=int, default=1000000000,
                    help='maximum training steps')
parser.add_argument('--overfit', action='store_true',
                    help='Works on a single sample')
parser.add_argument('--find_lr', action='store_true',
                    help='Run learning rate finder')
parser.add_argument('--num_workers', default=8, type=int,
                    help='Number of cores for data loading')
parser.add_argument('--bar_start_prob', type=float, default=0.5,
                    help=('probability of training sample'
                    ' starting at a bar location'))
parser.add_argument("--n_samples", type=int, default=-1,
                    help="Limits number of training samples (for faster debugging)") 
parser.add_argument('--n_emotion_bins', type=int, default=5,
                    help='Number of emotion bins in each dimension')
parser.add_argument('--max_transpose', type=int, default=3,
                    help='Maximum transpose amount')
parser.add_argument('--no_amp', action="store_true",
                    help='Disable automatic mixed precision')
parser.add_argument('--reset_scaler', action="store_true",
                    help="Reset scaler (can help avoiding nans)")
parser.add_argument('--exhaustive_eval', action="store_true",
                    help="Use data exhaustively (for final evaluation)")
parser.add_argument('--regression', action="store_true",
                    help="Train a regression model")
parser.add_argument("--always_use_discrete_condition", action="store_true", 
                help="Discrete tokens are used for every sequence")
parser.add_argument("--regression_dir", type=str, default=None,
                    help="The path of folder with generations, to perform regression on")

args = parser.parse_args()

if args.regression_dir is not None:
    args.regression = True

if args.conditioning != "continuous_concat":
    args.d_condition = -1

assert not (args.exhaustive_eval and args.max_eval_step > 0)

if args.full_dataset:
    assert args.conditioning in ["discrete_token", "none"] and not args.regression, "LPD-full has NaN features"

if args.regression:
    args.n_layer = 8
    print("Using 8 layers for regression")

args.batch_chunk = -1

if args.debug or args.overfit:
    args.num_workers = 0

if args.find_lr:
    args.debug = True

args.d_embed = args.d_model
    
if args.eval_tgt_len < 0:
    args.eval_tgt_len = args.tgt_len

if args.scheduler == "cyclic":
    args.lr = args.lr_min

if args.restart_dir:
    args.restart_dir = os.path.join(args.work_dir, args.restart_dir)

if args.debug:
    args.work_dir = os.path.join(args.work_dir, "DEBUG_" + time.strftime('%Y%m%d-%H%M%S'))
elif args.no_cuda:
    args.work_dir = os.path.join(args.work_dir, "CPU_" + time.strftime('%Y%m%d-%H%M%S'))
else:
    args.work_dir = os.path.join(args.work_dir, time.strftime('%Y%m%d-%H%M%S'))