# Multimodal theme classification (classification/classify.py) # 5-fold CV; for every modality combination every grid configuration is trained in every fold, # the one with the best inner-validation macro-F1 is chosen, and its test macro-F1 is reported. # Override any value from the command line, e.g. # python classification/classify.py --set data.lyrics=lyrics_phasea --set output_dir=results/classification/phasea data: metadata: data/multimodal/metadata.csv # songs, labels, 'fold', 'lyrics_group' embeddings: data/multimodal/embeddings.npz # vocal / instrument / mix + lyrics variants lyrics: lyrics_phaseb_cv # lyrics_phaseb_cv: Phase B model trained without the test fold # lyrics_phasea: Phase A (TSDAE) model, never saw a label output_dir: results/classification/phaseb modalities: [lyrics, vocal, instrument, mix] combos: all # all = every non-empty subset (15); or a list, e.g. [lyrics, lyrics+vocal] folds: all # all, or a list of fold ids, e.g. [0] seed: 42 inner_val_splits: 6 # 1/6 of the non-test songs form the validation split of each fold late_fusion: true # also score the average of the best single-modality models training: max_epochs: 60 min_epochs: 10 # never stop before this patience: 10 # epochs without a validation gain > min_delta min_delta: 0.001 lr_scheduler_patience: 5 # ReduceLROnPlateau on validation macro-F1, factor 0.5 batch_size: 64 weight_decay: 0.0001 model: d_model: 256 # width of every modality projection dropout: 0.3 attention_heads: 4 # xattn aux_loss_weight: 0.5 # weight of the per-modality auxiliary losses (aux: true) grid: methods: [mlp, gmu, xattn] # for combinations of 2+ modalities single_modality_methods: [mlp, xattn] # xattn only for single audio modalities lr: [0.0001, 0.0003] soft_labels: [false, true] # train on final_* soft scores instead of the label modality_dropout: [0.0, 0.3] # 2+ modalities only aux_loss: [false, true] # mlp / gmu with 2+ modalities only