dashakoryakovskaya commited on
Commit
46efca1
·
verified ·
1 Parent(s): 47859a2

Upload config_loader.py

Browse files
Files changed (1) hide show
  1. utils/config_loader.py +234 -0
utils/config_loader.py ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import toml
3
+ import logging
4
+
5
+ class ConfigLoader:
6
+ """
7
+ Loader for configuration from `config.toml`.
8
+ """
9
+
10
+ def __init__(self, config_path="config.toml"):
11
+ if not os.path.exists(config_path):
12
+ raise FileNotFoundError(f"Configuration file `{config_path}` not found!")
13
+
14
+ self.config = toml.load(config_path)
15
+
16
+ # ---------------------------
17
+ # General parameters
18
+ # ---------------------------
19
+ general_cfg = self.config.get("general", {})
20
+ self.use_telegram = general_cfg.get("use_telegram", False)
21
+
22
+ # ---------------------------
23
+ # Common parameters
24
+ # ---------------------------
25
+ self.split = self.config.get("split", "train")
26
+
27
+ # ---------------------------
28
+ # Dataset paths
29
+ # ---------------------------
30
+ self.datasets = self.config.get("datasets", {})
31
+
32
+ # ---------------------------
33
+ # Modalities and emotions
34
+ # ---------------------------
35
+ self.modalities = self.config.get("modalities", ["audio"])
36
+ self.emotion_columns = self.config.get(
37
+ "emotion_columns",
38
+ ["Neutral", "Anger", "Disgust", "Fear", "Happiness", "Sadness", "Surprise", "Other"],
39
+ )
40
+
41
+ # ---------------------------
42
+ # DataLoader
43
+ # ---------------------------
44
+ dataloader_cfg = self.config.get("dataloader", {})
45
+ self.num_workers = dataloader_cfg.get("num_workers", 0)
46
+ self.shuffle = dataloader_cfg.get("shuffle", True)
47
+ self.prepare_only = dataloader_cfg.get("prepare_only", False)
48
+ self.average_features = dataloader_cfg.get("average_features", False)
49
+
50
+ # ---------------------------
51
+ # Training: general
52
+ # ---------------------------
53
+ train_general = self.config.get("train", {}).get("general", {})
54
+ self.random_seed = train_general.get("random_seed", 42)
55
+ self.subset_size = train_general.get("subset_size", 0)
56
+ self.merge_probability = train_general.get("merge_probability", 0)
57
+ self.batch_size = train_general.get("batch_size", 8)
58
+ self.num_epochs = train_general.get("num_epochs", 100)
59
+ self.max_patience = train_general.get("max_patience", 10)
60
+ self.save_best_model = train_general.get("save_best_model", False)
61
+ self.save_prepared_data = train_general.get("save_prepared_data", True)
62
+ self.save_feature_path = train_general.get("save_feature_path", "./features/")
63
+ self.search_type = train_general.get("search_type", "none")
64
+ self.smoothing_probability = train_general.get("smoothing_probability", 0)
65
+ self.path_to_df_ls = train_general.get("path_to_df_ls", None)
66
+ self.early_stop_on = train_general.get("early_stop_on", "dev")
67
+ self.lambda_emotion = train_general.get("lambda_emotion", 1)
68
+ self.lambda_personality = train_general.get("lambda_personality", 5)
69
+ self.lambda_domain = train_general.get("lambda_domain", 0.1)
70
+ self.checkpoint_dir = train_general.get("checkpoint_dir", "checkpoints")
71
+ self.device = train_general.get("device", "cuda")
72
+ self.selection_metric = train_general.get("selection_metric", "mean_combo")
73
+ self.single_task = train_general.get("single_task", False)
74
+ self.opt_set = train_general.get("opt_set", "dev")
75
+
76
+ # ---------------------------
77
+ # Training: model parameters
78
+ # ---------------------------
79
+ train_model = self.config.get("train", {}).get("model", {})
80
+ self.id_ablation_type_by_modality = train_model.get("id_ablation_type_by_modality", 0)
81
+ self.id_ablation_type_by_component = train_model.get("id_ablation_type_by_component", 0)
82
+ self.single_task_id = train_model.get("single_task_id", 0)
83
+ self.model_name = train_model.get("model_name", "BiFormer")
84
+ self.model_stage = train_model.get("model_stage", "emotion")
85
+ self.path_to_saved_emotion_model = train_model.get("path_to_saved_emotion_model", None)
86
+ self.path_to_saved_personality_model = train_model.get("path_to_saved_personality_model", None)
87
+ self.per_activation = train_model.get("per_activation", "sigmoid")
88
+ self.weight_emotion = train_model.get("weight_emotion", 1.0)
89
+ self.weight_pers = train_model.get("weight_pers", 1.0)
90
+ self.pers_loss_type = train_model.get("pers_loss_type", True)
91
+ self.emotion_loss_type = train_model.get("emotion_loss_type", True)
92
+ self.flag_emo_weight = train_model.get("flag_emo_weight", False)
93
+ self.ssl_weight_emotion = train_model.get("ssl_weight_emotion", 1)
94
+ self.ssl_weight_personality = train_model.get("ssl_weight_personality", 1)
95
+ self.ssl_confidence_threshold_emo = train_model.get("ssl_confidence_threshold_emo", 0.6)
96
+ self.ssl_confidence_threshold_pt = train_model.get("ssl_confidence_threshold_pt", 0.6)
97
+ self.pers_loss_type = train_model.get("pers_loss_type", "mae")
98
+ self.emotion_loss_type = train_model.get("emotion_loss_type", "CE")
99
+ self.alpha_sup = train_model.get("alpha_sup", 1.0)
100
+ self.w_lr_sup = train_model.get("w_lr_sup", 0.025)
101
+ self.alpha_ssl = train_model.get("alpha_ssl", 0.5)
102
+ self.w_lr_ssl = train_model.get("w_lr_ssl", 0.001)
103
+ self.lambda_ssl = train_model.get("lambda_ssl", 0.2)
104
+ self.w_floor = train_model.get("w_floor", 1e-3)
105
+ self.hidden_dim = train_model.get("hidden_dim", 256)
106
+ self.hidden_dim_gated = train_model.get("hidden_dim_gated", 256)
107
+ self.num_transformer_heads = train_model.get("num_transformer_heads", 8)
108
+ self.num_graph_heads = train_model.get("num_graph_heads", 8)
109
+ self.tr_layer_number = train_model.get("tr_layer_number", 5)
110
+ self.mamba_d_state = train_model.get("mamba_d_state", 16)
111
+ self.mamba_ker_size = train_model.get("mamba_ker_size", 4)
112
+ self.mamba_layer_number = train_model.get("mamba_layer_number", 3)
113
+ self.positional_encoding = train_model.get("positional_encoding", True)
114
+ self.dropout = train_model.get("dropout", 0.0)
115
+ self.out_features = train_model.get("out_features", 128)
116
+ self.mode = train_model.get("mode", "mean")
117
+ self.fusion_dim = train_model.get("fusion_dim", 64)
118
+ self.attention = train_model.get("attention", None)
119
+
120
+ # Parameters for the best emotion/personality models
121
+ self.hidden_dim_emo = train_model.get("hidden_dim_emo", 256)
122
+ self.out_features_emo = train_model.get("out_features_emo", 256)
123
+ self.name_best_emo_model = train_model.get("name_best_emo_model", "BiFormer")
124
+ self.name_best_per_model = train_model.get("name_best_per_model", "BiFormer")
125
+ self.path_to_saved_emotion_model = train_model.get("path_to_saved_emotion_model", None)
126
+ self.path_to_saved_personality_model = train_model.get("path_to_saved_personality_model", None)
127
+ self.num_transformer_heads_emo = train_model.get("num_transformer_heads_emo", 8)
128
+ self.tr_layer_number_emo = train_model.get("tr_layer_number_emo", 1)
129
+ self.positional_encoding_emo = train_model.get("positional_encoding_emo", True)
130
+ self.mamba_d_state_emo = train_model.get("mamba_d_state_emo", 16)
131
+ self.mamba_layer_number_emo = train_model.get("mamba_layer_number_emo", 3)
132
+ self.hidden_dim_per = train_model.get("hidden_dim_per", 256)
133
+ self.out_features_per = train_model.get("out_features_per", 256)
134
+ self.num_transformer_heads_per = train_model.get("num_transformer_heads_per", 8)
135
+ self.tr_layer_number_per = train_model.get("tr_layer_number_per", 1)
136
+ self.positional_encoding_per = train_model.get("positional_encoding_per", True)
137
+ self.mamba_d_state_per = train_model.get("mamba_d_state_per", 16)
138
+ self.mamba_layer_number_per = train_model.get("mamba_layer_number_per", 3)
139
+ self.best_per_activation = train_model.get("best_per_activation", "sigmoid")
140
+ self.image_embedding_dim = train_model.get("image_embedding_dim", 2560)
141
+
142
+ # ---------------------------
143
+ # Training: optimizer
144
+ # ---------------------------
145
+ train_optimizer = self.config.get("train", {}).get("optimizer", {})
146
+ self.optimizer = train_optimizer.get("optimizer", "adam")
147
+ self.lr = train_optimizer.get("lr", 1e-4)
148
+ self.weight_decay = train_optimizer.get("weight_decay", 0.0)
149
+ self.momentum = train_optimizer.get("momentum", 0.9)
150
+
151
+ # ---------------------------
152
+ # Training: scheduler
153
+ # ---------------------------
154
+ train_scheduler = self.config.get("train", {}).get("scheduler", {})
155
+ self.scheduler_type = train_scheduler.get("scheduler_type", "plateau")
156
+ self.warmup_ratio = train_scheduler.get("warmup_ratio", 0.1)
157
+
158
+ # ---------------------------
159
+ # Embeddings
160
+ # ---------------------------
161
+ emb_cfg = self.config.get("embeddings", {})
162
+ self.audio_model_name = emb_cfg.get("audio_model", "amiriparian/ExHuBERT")
163
+ self.text_model_name = emb_cfg.get("text_model", "jinaai/jina-embeddings-v3")
164
+ self.audio_classifier_checkpoint = emb_cfg.get("audio_classifier_checkpoint", "best_audio_model.pt")
165
+ self.text_classifier_checkpoint = emb_cfg.get("text_classifier_checkpoint", "best_text_model.pth")
166
+ self.image_classifier_checkpoint = emb_cfg.get("image_classifier_checkpoint", "torchscript_model_0_66_37_wo_gl.pth")
167
+ self.image_model_type = emb_cfg.get("image_model_type", "resnet50")
168
+ self.cut_target_layer = emb_cfg.get("cut_target_layer", 2)
169
+ self.roi_video = emb_cfg.get("roi_video", "face")
170
+ self.counter_need_frames = emb_cfg.get("counter_need_frames", 20)
171
+ self.image_size = emb_cfg.get("image_size", 224)
172
+ self.audio_embedding_dim = emb_cfg.get("audio_embedding_dim", 1024)
173
+ self.text_embedding_dim = emb_cfg.get("text_embedding_dim", 1024)
174
+ self.emb_normalize = emb_cfg.get("emb_normalize", True)
175
+ self.audio_pooling = emb_cfg.get("audio_pooling", None)
176
+ self.text_pooling = emb_cfg.get("text_pooling", None)
177
+ self.max_tokens = emb_cfg.get("max_tokens", 256)
178
+ self.window_size = emb_cfg.get("window_size", 5)
179
+
180
+ if __name__ == "__main__":
181
+ self.log_config()
182
+
183
+ def log_config(self):
184
+ logging.info("=== CONFIGURATION ===")
185
+ logging.info(f"Split: {self.split}")
186
+ logging.info(f"Datasets: {list(self.datasets.keys())}")
187
+ for name, ds in self.datasets.items():
188
+ logging.info(f"[Dataset: {name}]")
189
+ logging.info(f" Base Dir: {ds.get('base_dir', 'N/A')}")
190
+ logging.info(f" CSV Path: {ds.get('csv_path', '')}")
191
+ logging.info(f" WAV Dir: {ds.get('wav_dir', 'N/A')}")
192
+ logging.info(f" Video Dir: {ds.get('video_dir', '')}")
193
+ logging.info(f" Audio Dir: {ds.get('audio_dir', '')}")
194
+
195
+ # Training parameters
196
+ logging.info("--- Training Config ---")
197
+ logging.info(f"DataLoader: batch_size={self.batch_size}, num_workers={self.num_workers}, shuffle={self.shuffle}")
198
+ logging.info(f"Model Name: {self.model_name}")
199
+ logging.info(f"Random Seed: {self.random_seed}")
200
+ logging.info(f"Hidden Dim: {self.hidden_dim}")
201
+ logging.info(f"Gated Hidden Dim: {self.hidden_dim_gated}")
202
+ logging.info(f"Transformer Heads: {self.num_transformer_heads}")
203
+ logging.info(f"Graph Heads: {self.num_graph_heads}")
204
+ logging.info(f"Stat Pooling Mode: {self.mode}")
205
+ logging.info(f"Optimizer: {self.optimizer}")
206
+ logging.info(f"Scheduler Type: {self.scheduler_type}")
207
+ logging.info(f"Warmup Ratio: {self.warmup_ratio}")
208
+ logging.info(f"Weight Decay: {self.weight_decay}")
209
+ logging.info(f"Momentum (SGD): {self.momentum}")
210
+ logging.info(f"Positional Encoding: {self.positional_encoding}")
211
+ logging.info(f"Transformer Layers: {self.tr_layer_number}")
212
+ logging.info(f"Mamba D State: {self.mamba_d_state}")
213
+ logging.info(f"Mamba Kernel Size: {self.mamba_ker_size}")
214
+ logging.info(f"Mamba Layers: {self.mamba_layer_number}")
215
+ logging.info(f"Dropout: {self.dropout}")
216
+ logging.info(f"Out Features: {self.out_features}")
217
+ logging.info(f"Learning Rate: {self.lr}")
218
+ logging.info(f"Epochs: {self.num_epochs}")
219
+ logging.info(f"Merge Probability: {self.merge_probability}")
220
+ logging.info(f"Smoothing Probability: {self.smoothing_probability}")
221
+ logging.info(f"Max Patience: {self.max_patience}")
222
+ logging.info(f"Save Prepared Data: {self.save_prepared_data}")
223
+ logging.info(f"Features Save Path: {self.save_feature_path}")
224
+ logging.info(f"Search Type: {self.search_type}")
225
+
226
+ # Embeddings
227
+ logging.info("--- Embeddings Config ---")
228
+ logging.info(f"Audio Model: {self.audio_model_name}, Text Model: {self.text_model_name}")
229
+ logging.info(f"Audio dim={self.audio_embedding_dim}, Text dim={self.text_embedding_dim}")
230
+ logging.info(f"Audio pooling={self.audio_pooling}, Text pooling={self.text_pooling}")
231
+ logging.info(f"Device={self.device}, Normalize={self.emb_normalize}")
232
+
233
+ def show_config(self):
234
+ self.log_config()